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
'게임 개발 > 유니티' 카테고리의 다른 글
[유니티] Input.GetKey() 한글로 입력해도 동작하게 하고 싶다면 (0) | 2023.01.16 |
---|---|
[유니티/셰이더] 순차적 체커보드 패턴 Procedural checkerboard pattern (1) | 2022.12.24 |
[유니티/셰이더] 커스텀 셰이더 기초 (1) | 2022.12.23 |
[유니티] Photon Fusion 103 간단 요약 (0) | 2022.12.22 |
[유니티] Photon Fusion 102 간단 요약 (1) | 2022.12.20 |