Unity/Tips

Unity 순서대로 초기화하고 싶을 경우 코드를 이런 식으로 ~---~_~-~-

최애뎡 2021. 11. 30. 23:49
728x90
반응형
#if UNITY_EDITOR
using UnityEditor;
#endif

using System;
using UnityEngine;

public class Initialize : MonoBehaviour
{
    /// <summary>
    /// 초기화 해야하는 스크립트들의 이름을 그대로 선언
    /// -> 먼저 적은 순으로 초기화 진행
    /// </summary>
    enum Scripts
    {

    }

    [Tooltip("초기화 해야 할 스크립트를 지닌 게임오브젝트")]
    [SerializeField] GameObject[] _go_initialze = null;

    private void Awake()
    {
        foreach (Scripts script in Enum.GetValues(typeof(Scripts)))
        {
            foreach (GameObject item in _go_initialze)
            {
                if (item.GetComponent(script.ToString()) != null)
                {
                    // 실행해야 할 메서드
                    item.GetComponent(script.ToString()).SendMessage("");
                    break;
                }
            }
        }
    }

#if UNITY_EDITOR
    [CustomEditor(typeof(Initialize))]
    public class customEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            EditorGUILayout.HelpBox("초기화 순서를 지정할 경우 사용", MessageType.Info);

            base.OnInspectorGUI();
        }
    }
#endif
}

만들고 있는 게임의 볼륨이 커지면 커질수록 아무래도 초기화 순서가 중요시되는 경우가 종종 생기기 마련

당연히 위 코드 외에도 많은 방식이 있지만 지금은 이런 식으로 사용하고 있다 :')

열거형으로 실행해야 하는 메서드가 있는 스크립트의 이름을 그대로 나열하고 그 스크립트를 지닌 게임 오브젝트를 미리 들고 있게 한 뒤 반복문을 통해 오브젝트가 스크립트를 들고 있다면 SendMessage로 원하는 메서드를 실행! 아무래도 SendMessage이기 때문에 실행하고자 하는 메서드가 private여도 상관은 없는..

* 주의할 점은 SendMessage를 사용하기 때문에 item.GetComponent(script.ToString()).SendMessage(""); 이 코드는 item의 GetComponent를 한 Script에만 SendMessage를 보내는 게 아니라 item에 포함된 모든 스크립트에 SendMessage를 보내게 됨 (SendMeesage의 경우 오브젝트가 포함하는 모든 스크립트에 보내기 때문)

 

* UnityEditor의 경우 빌드시 오류를 방지하고자 전처리기 지시문 사용

반응형