문제 상황
- 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으로 비교를 해야되니 다른 값으로 판정된다는것이 좀 신기했다.
최근들어 계속 같은 값인데 다른게 판정되는 상황을 자주 겪는거 같은데, 그럼으로써 조금 더 상세히 공부하게 되고,
흐름에 대한 이해가 높아지는거 같다는 기분이 든다.
물론.. 아직도 이렇게 어려운거 추성이라는 점에서 벽이 좀 느껴지지만, 그래도 오늘도 쌓아 올린 기분이다.
'Unity > 트러블 슈팅' 카테고리의 다른 글
| [Unity] InputAction의 performed 이벤트 사용 시 주의점 (0) | 2025.07.02 |
|---|---|
| [Unity] UI가 작동하지 않는 이유 (0) | 2025.06.27 |
| [Unity] null처리가 되었는데 Debug.Log에 출력 되는 현상 (0) | 2025.06.20 |
| [Unity] 생성자가 오브젝트 파괴후에도 참조되는 현상 (0) | 2025.06.19 |
| [Unity] Fade가 끊기는 문제 해결 (0) | 2025.06.18 |