Unity/트러블 슈팅

[Unity] StateMachineBehaviour 정보 초기화 현상

turbulence93 2025. 7. 22. 23:33

1. 문제 상황

Unity에서 StateMachineBehaviour를 활용해 애니메이션 상태별 행동을 정의했음.
해당 컴포넌트는 특정 캐릭터의 상태별 처리용 Init() 메서드를 통해 설정 데이터를 받아 사용하도록 구성되어 있었음.

그러나 게임 오브젝트가 비활성화되었다가 다시 활성화되는 순간, Init()으로 주입했던 데이터가 사라지는 현상이 발생함.
→ 상태 전이 시 설정된 정보가 Null, 기본값 등으로 초기화되어 행동에 문제 발생.


2. 원인 분석

StateMachineBehaviour는 일반 MonoBehaviour와 달리 Animator에 종속된 Scriptable 객체로 동작함.
→ AnimatorController에 붙어 있는 StateMachineBehaviour는 런타임 중에도 종종 “복사된 인스턴스”로 재사용되거나 재생성됨
→ 특히 GameObject가 비활성화됐다가 다시 켜질 때 새 인스턴스로 다시 할당되며, 이전에 할당한 값은 날아감


3. 해결 방법

방법 1: StateMachineBehaviour 내부에 데이터를 저장하지 않는다

  • 내부에서 Init()으로 값 세팅을 하지 않고, stateEnter시 값이 없을 경우에만 찾아 오도록 변경
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    if (companion == null)
    {
        if(animator.TryGetComponent<Companion>(out companion))
        {
            companionAttackState = companion.Controller.registedState[StateEnum.Attack] as CompanionAttackState;
        }
    }
    companionAttackState.Attack();
}
 

4. 개인적인 생각

언제나 느끼지만 항상 보이는게 다가 아니라는 걸 새삼 또 느낀다.

Unity의 내부 객체 수명주기와 메모리 관리 방식에 대해서도 조금 더 알가는 시간이 되었다.