본문 바로가기

게임 개발/유니티

[유니티] 씬 재로딩 후 Action 변수의 target null 문제

728x90

아래와 같이 정적 클래스에 Action 참조 변수를 만들어놓고 

public class MethodManager
{
	public static event System.Action SomeThing;
    
    public static void DoSomeThing()
    {
    	SomeThing();
    }
}

 

 

 

아래와 같이 다른 클래스에서 함수를 등록하여 사용하려고 합니다.

public class GameControll : MonoBehaviour
{
	void Start()
    {
    	MethodManager.SomeThing += Controll1;
    }
    
    void Controll1()
    {
    	// do controll1
    }
}

 

 

이제 다른 클래스에서 언제든지

MethodManager.DoSometing(); 을 호출하면

GameControll.Controll1()을 함께 호출할 수 있습니다.

 

그런데

유니티 프로그램을 처음 실행했을 때는 잘 작동되는데

세이브를 로드했을 때 등의 이유로 씬을 다시 로드하면 

Object들이 파괴되면서 정적클래스의 Action 참조 변수의 target이 null이 되고,

Action 참조 변수의 Method만 살아남게 됩니다.

 

그래서 씬의 두번째 로드때부터

MethodManager.SomeThing += Controll1;

체인을 거는 부분이 제대로 동작하지 않게 됩니다.

 

 

 

 

이 문제를 해결하기 위해서는 씬이 로드될 때 Action 참조 변수를 null로 초기화해주어야 합니다.

SomeThing 참조 변수를 초기화해주는 함수를 만들어놓고,

public class MethodManager
{
	public static event System.Action SomeThing;
    
    public static void InitSomeThing()
    {
    	SomeThing = null;
    }
    
    public static void DoSomeThing()
    {
    	SomeThing();
    }
}

 

 

 

체인을 걸기 전에 초기화 해주면 정상적으로 동작합니다.

public class GameControll : MonoBehaviour
{
	void Start()
    {
    	MethodManager.InitSomeThing();
        MethodManager.SomeThing += Controll1;
    }
    
    void Controll1()
    {
    	// do controll1
    }
}

 

 

 

* 참조 변수에 등록된 다른 클래스의 함수 리스트를 확인하기 어렵기 때문에

위처럼 직전에 초기화하기 보다

씬이 로드될 때 가장 먼저 실행되는 클래스에서 일괄적으로 참조변수들을 초기화하고 사용하는 것이 좋겠습니다.

728x90