Unity/트러블 슈팅

[Unity] Enum을 추상화 했을때 발생한 트러블 슈팅

turbulence93 2025. 6. 24. 23:43

문제 상황

  • FSM 설계 시 상태를 일반화하기 위해 BaseState에서 protected abstract Enum stateType으로 선언하고,
    각 자식 클래스에서 이를 오버라이드하여 특정 Enum 값을 반환하도록 설계
// Base
protected abstract Enum stateType { get; }
public Enum GetState() => stateType;

// Child
protected override Enum stateType => PlayerStateEnum.Attack;
  • State 전환 체크를 위해 다음과 같이 비교할 경우
Logger.Log(newState == currentState.GetState()); // 예상: true, 실제: false
 
  • 같은 Enum 타입이여도 fasle를 반환하는 상황 발생

원인 분석

  • Enum은 참조형이며, PlayerStateEnum.Attack은 Enum 타입으로 박싱되어 반환됨
  • C#에서 Enum 타입을 추상화하여 System.Enum으로 처리할 때 발생할 수 있는 박싱 및 타입 불일치에 의한 비교 실패 문제

해결 방법

.Equals() 사용 newState.Equals(currentState.GetState()) – 값 비교만 수행
Convert.ToInt32() Convert.ToInt32(newState) == Convert.ToInt32(current.GetState()) 
ToString() 비교 문자열로 비교하되 성능 저하 주의
 
  • 가장 정확한 방법은 .Equips를 통해 값 비교를 통해 박싱 처리된 Enum을 비교하는 것
  • Int도 사용할 수 있겠지만 그렇게 되면 EnumTpye이 다를 경우도 같은 경우로 처리함
  • String 도 정확한 편이지만 String 자체가 성능 저하의 원인이 됨으로 비추천

느낀점

Enum을 추상화를 시켰더니 박싱된 System.Enum으로 비교를 해야되니 다른 값으로 판정된다는것이 좀 신기했다.

최근들어 계속 같은 값인데 다른게 판정되는 상황을 자주 겪는거 같은데, 그럼으로써 조금 더 상세히 공부하게 되고,
흐름에 대한 이해가 높아지는거 같다는 기분이 든다.
물론.. 아직도 이렇게 어려운거 추성이라는 점에서 벽이 좀 느껴지지만, 그래도 오늘도 쌓아 올린 기분이다.