[내일배움캠프 본 캠프 60일차] 같은 오브젝트, 다른 상태

2025. 12. 22. 23:31본 캠프

오늘은 기존의 쓰레기통/칼의 데이터교환과 참조가 워낙 강력하게 엮여있었기에

앞으로 진행할 다양한 상세보기 오브젝트가 생길 것을 고려해 확장성을 위해 리팩토링을 거쳤다.

 

아이템이 발견되었는지 여부를 가지면서 상태 변경 시 이벤트를 발행하는데

이 SO는 직접 씬에 놓여진 상태로 쓰이지 않고

HiddenItemHolder에 의해 Instantiate 된 런타임 인스턴스로만 사용되게 만들었다

특정 숨겨진 오브젝트의 SO를 부모를 상속받아 사용하면서 호출하게 하는 실제 SO를 만드는 스크립트를 별도로 구성한다.

 

 

월드 오브젝트 단위로 숨겨진 아이템 상태를 소유하고 SO를 런타임 인스턴스로 복제해서 같은 오브젝트에 같은 칼이 숨겨져 있다 하더라도 상호작용을 통해 사라지는 상태를 개별상태를 유지하게 한다.

그리고 상세보기/월드에서 상태를 바꿀 수 있는 유일한 진입점이기도 하다.

 

코드를 짜면서 제일 첫번째의 고민은 아무래도 동일한 오브젝트를 재활용하고 상태에 따라 바뀌는 형식을 구현해야하는데

같은 SO를 활용하게 될 경우 월드의 모든 오브젝트가 동일한 상태변경에 처할 것을 고려하다 보니 오브젝트 전용 런타임 상태 생성의 형식을 구성하게 됐다.

 

그렇기에 같은 프리펩, 다른 상태가 구현됐다.

그래서 얼핏보기엔 상세보기/월드 오브젝트는 같은 SO에셋을 보는 것처럼 보이지만 SO는 상태라는 데이터를 갖고 이벤트를 통해 변화를 알려주는 것일 뿐이고 HiddenItemHolder가 만든 런타임 인스턴스가 런타임시 실제 오브젝트의 상태를 가르킨다.

그래서 definition이라는 표현을 썼다.

KnifeSO는 상태라는 정의를 표현한 것이고 실제로 보는 것은 다르기에

 

 

이후 팀원이 만든 랜덤 이상현상 배치 SO에 정상/의심 형태의 프리펩을 각각 배치해두면

감방ID에 따라 랜덤으로 배치된다.

 

아직은 상세보기 상호작용을 통한 트리거나 이벤트가 없지만 이 구조를 그대로 가져가게 되면 각각의 InstanceID가 다르기 때문에

플레이어가 얼마나 캐치했는지 데이터로 저장할 수 있게 될 거 같아서 확장성 측면에서 얼마나 활용할 수 있을지 기대가 된다.