본문 바로가기
개발/Unity

Unity) GameObject Active Script로만 제어하기

by 테샤르 2024. 9. 30.

GameObject Active Script로만 제어하기



Prefab 작업을 하다가 보면 Active를 끄는 이슈가 생기는 경우가 종종 존재한다.

그런 케이스가 발생하지 않도록 GameObject를 컨트롤을 Script로만 가능하게 만드는 Script를 생성해서

꺼지면 안되는 GameObject에 해당 Script를 추가하면 된다.

 

반응형

테스트는 간단하게 GameObject의 Active를 껏다 켰다 가능한지.

Script 코드로는 해당 GameObject를 컨트롤 가능한지 판단해서 작업했다.

 

 

 < 코드 > 

using UnityEngine;

public class GameObjectScriptActive : MonoBehaviour
{
	// Inspector에서 활성화 상태 제어를 선택할 수 있는 변수
	[SerializeField, HideInInspector]
	private bool isActiveControlledByScript = true;

	public bool IsActiveControlledByScript
	{
		get { return isActiveControlledByScript; }
		set
		{
			isActiveControlledByScript = value;
		}
	}

	// 활성화 상태 변경 메서드
	public void SetComponentActive(bool active)
	{
		isActiveControlledByScript = active;
		gameObject.SetActive(active);
		Debug.Log($"[SetComponentActive] : {active}");
	}
}

 

using UnityEditor;

[CustomEditor(typeof(GameObjectScriptActive))]
public class GameObjectScriptActiveEdit : Editor
{
	private GameObjectScriptActive component = null;
	private bool flagActive = false;

	public override void OnInspectorGUI()
	{
		// 타겟이 될 컴포넌트 할당
		if (component == null)
			component = (GameObjectScriptActive)target;

		// 기본 Inspector 그리기 (속성들을 표시)
		DrawDefaultInspector();

		// isActiveControlledByScript 변수를 그리기
		EditorGUI.BeginChangeCheck();
		bool newControlValue = EditorGUILayout.Toggle("Control Active State", component.IsActiveControlledByScript);
		
		if (EditorGUI.EndChangeCheck())
		{
			// 사용자가 체크박스를 변경했을 때 상태를 업데이트
			Undo.RecordObject(component, "Toggle Active State Control");
			component.GetType().GetField("isActiveControlledByScript", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(component, newControlValue);

			flagActive = ((GameObjectScriptActive)target).IsActiveControlledByScript;
		}

		if (component.IsActiveControlledByScript)
			component.gameObject.SetActive(component);
	}
}

 

 

★☆☆☆☆

 

반응형

댓글