본문 바로가기
유니티/겪었던 문제

ScriptableObject를 사용하며 겪었던 문제

by fore4022 2025. 4. 24.

프로젝트가 빌드에서도 제대로 동작하는지 확인하는 과정에서 발견하게 되었다.


문제 상황

게임 오버(Game Over) 이후에 재시작 버튼을 눌렀을 때, 플레이어의 스탯이 초기 화 되게 하는 기능에서 문제가 발생하였다. 플레이어의 기본 스탯은 고정해 놓았고, 해당 스탯을 SO를 통해서 관리하도록 하였다. 그래서 게임이 시작되기에 앞서서 SO를 불러와서 플레이어의 스탯을 설정해 주었다.

예 ㅣ체력, 데미지, 이동속도 등

이후, 게임 오버에서 재시작을 할 경우 플레이어 체력이 계속해서 0이하의 값으로 초기화 되는 문제가 발생하였다.


의문점

처음 SO를 공부할 때는 SO는 에디터 환경이 아닌, 빌드 된 후에는 그 값이 고정되어서 수정되지 않는다. 이렇게 알고 있었다. 그런데 재시작할 때도 분명히 스탯 SO를 통해서 다시 플레이어 스탯을 설정해 주었기에 SO가 수정된 것처럼 보였다. 위의 두 내용이 서로 상반되어 보여서 더욱 당황스러웠다.


원인

스탯 SO가 플레이어 스탯을 초기화 하는 것이 복사가 아닌 참조되어서, 플레이어의 체력이 감소할 때 SO의 체력이 변경되었다.

변경된 SO가 그대로 남아서, 재시작의 플레이어 스탯을 초기화하면서 플레이어의 체력이 0이하의 값으로 초기화 되었다.


문제 정리

SO가 빌드 이후에 값이 수정되지 않는다는 것은 사실이다. 하지만, 앞으로는 다르게 기억했으면 한다.

"SO는 빌드 이후에 값을 수정해도 SO에 영구적으로 저장되지 않는다."

수정되지 않는다는 의미가 값이 변경되지 않는다는 것은 아니다. 이 차이를 인지하였으면 한다. 또한 SO가 사라지지 않았기 때문에 변경된 값이 유지된다. 하지만, 결론적으로는 그 값이 SO에 저장되지 않기 때문에 ‘수정’은 불가능하다.


되돌아보기

이전에 SO를 정리했을 때, 참조와 복사에 관하여서 정리했었다. 그런데 이번에 플레이어 초기화 과정에서 무작정 아래와 같이 해버렸다.

(스탯) = SO

또한 SO가 수정되지 않는다는 의미를 값 변경 자체가 안된다고, 멋대로 해석해버렸다.

'유니티 > 겪었던 문제' 카테고리의 다른 글

에디터/빌드 환경에서 Instance의 차이  (0) 2025.06.25
충돌 검사  (0) 2024.12.24
New Input System에서 겪었던 문제들  (0) 2024.11.26