본문 바로가기
게임개발/유니티 엔진

GameObject.AddComponent("스크립트") start 메서드 실행 문제점

by do_ng 2024. 3. 26.

해당 게임 오브젝트에 C# 스크립트를 컴포넌트로 추가했다 하더라도 "Start()" 즉시 실행되지 않는다. 

 

1. gameObejct.AddComponent("C#스크립트");

해당 스크립트의 인스턴스를 생성하고 게임오브젝트에 연결하는 작업만을 수행한다. 

Awake()는 해당 스크립트의 인스턴스가 만들어진 후에 로드 되는데 .AddComponent 처리시 인스턴스가 생성되므로 해당 스크립트의 Awake() 실행

 

2. AddComponent 작업이 끝나면 해당 스크립트가 인스턴스화 되서 힙 메모리에 생성됨

 

3. 모든 스크립트의 인스턴스화가 완료된 후, 다음 프레임에 Start() 메서드를 호출

이때는 모든 스크립트의 Awake() 메서드가 호출된 상태임 

Start() 메서드의 실행은 유니티의 내부적인 프로세스에 따라 결정되며, 일반적으로 다음 프레임에 실행됨

 

문제 상황)

UI_TextPopup alert = Managers.UI.ShowPopupUI<UI_TextPopup>("UI_TextPopup");
alert.SetText("텍스트 수정");

 

"UI_TextPopup" 게임오브젝트 생성 후 컴포넌트(UI_TextPopup 스크립트)를 붙임

public T ShowPopupUI<T>(string name = null) where T : UI_Popup
{   
    GameObject go = Managers.Resource.Instantiate($"UI/Popup/{name}");
    T popup = Util.GetOrAddComponent<T>(go);    
    return popup;
}

 

Start() 메서드 실행시에 수정될 Text 정보를 가져오는데 Start()가 실행되지 않아서 null인 Text 정보에 접근하므로 nullExcpetion 발생

private void Start()
{
    Bind<Text>(typeof(Texts));
}

public void SetText(string text)
{
    Get<Text>((int)Texts.TextPopup).text = text;
}

 

 

해결 방법)

IEnumerator NextStageAlert()
{
    UI_TextPopup alert = Managers.UI.ShowPopupUI<UI_TextPopup>("UI_TextPopup");        
    yield return null;
    alert.SetText("다음 스테이지 이동 또는 상점 이동하기 위해서 두 개의 문을 이용하세요");
}

 

코루틴을 이용해서 인스턴스 생성 이후 1프레임 쉬고 다시 돌아와서 메서드 실행

1프레임을 쉬는 동안 start()가 실행되기 때문에 다시 돌아왔을 때 Text 정보가 생기므로 접근이 가능

'게임개발 > 유니티 엔진' 카테고리의 다른 글

모바일 가상 조이스틱 구현  (0) 2024.04.20
몬스터 반경 내의 플레이어 감지  (0) 2024.04.03
Game Object 파괴시 null 처리  (0) 2024.03.15
네비게이션 시스템  (0) 2024.03.10
Time.DeltaTime  (0) 2024.03.09