250614

lililllilillll·2025년 6월 14일

개발 일지

목록 보기
202/350

✅ What I did today


  • R&D : TextTree Editor : Day 13


🛠️ R&D : TextTree Editor : Day 13


다른 건 다 저장되는데 conditionList가 저장 안되는 문제 발생.
custom Inspector를 만들기 위해 따로 tempCondSO로 감싸서 생긴 문제 같은데,
엣지를 처음 만들었을 땐 저장이 안되고, 다시 load했을 땐 저장이 되는 증상.
: 디버그를 통해 확인해보니 런타임에 만든 edge는 conditionlist가 null로 뜸.
fromNode에 넣기 위해 새로 만든 TextEdge 인스턴스 안에 conditionList가 들어있는데,
이를 EdgeElement와는 연결시켜주지 않아서 생겼던 일.

edge에 이벤트도 같이 넣기
: conditionList의 참조만 edgeElement에 넣어놓는게 아니라 아예 TextEdge를 참조하는 것으로 변경.

갑자기 멀쩡히 작동하던 클래스의 namespace가 망가져버림. 클래스 이름 바꾼 다음 다시 컴파일해보니 멀쩡해짐.

tempSO를 CreateInstance<T>()를 사용해서 만들고 있었는데, 이걸로 만들면 custom 생성자 사용 못 하는 거였음. 불필요한 생성자들 다 제거함.

UnityEvent도 할당할 수 있게 변경했는데, 이번에는 이벤트가 저장이 안됨. 참조 값이 어떤 상황에서도 저장이 안됨.

  • edgeList null 체크 해봤는데 당연히 null도 아님.
  • gemini에게 물어봤더니 tempEventSO는 곧 사라질 근본 없는 놈이라 유니티가 이벤트 저장을 안 해주는 거였음.
  • 그냥 ScriptableObject로 바꿨으니 굳이 새로운 SrciptableObject 만들지 말고 저장된 textTreeSO를 가져오면 임시 객체가 아니라 실제 파일이라서 이벤트도 잘 저장할 수 있음. 하지만 이렇게 하면 nodeElement, edgeElement 로직을 죄다 바꿔줘야 해서 곤란.
  • tempEventSO를 잠시 asset 파일로 저장해두는 방식을 사용했다. 근데 이러니까 오브젝트가 type mismatch 뜨면서 연결이 안됨. o3에게 물어봤더니 애셋은 씬 인스턴스를 참조할 수가 없다고 함.
  • ExposedReference<T>라는게 있다길래 사용해보려고 했는데, 이건 결국 오브젝트 정보 테이블이 필요하다고 함. 이럴바에 진짜 오브젝트 정보를 저장하는게 낫다고 함.
  • 자꾸 serializedObject 기반으로 코드 베이스를 갈아엎으라길래 그건 안된다고, 우회책과 그 조건을 설명했더니 이벤트 값이 바뀌었을 때 임시 SO > C# 객체 > TextTree SO 순으로 수동 저장시키는 방식을 알려줌.
  • 적용했더니 NotSupportedException: An element can track properties on only one serializedObject at a time 오류가 뜸.
  • Unbind()로는 TrackSerializedObjectValue 콜백을 지워주지 못하는 것 같다고 함. 지우고 다시 만드는게 깔끔하다고 함.
  • 만들 때 파라미터에 property 넣어서 바인딩하길래 .BindProperty()를 왜 또 호출하나 했는데, Tree에 추가된 이후에 bind를 해야 보여서 그랬던 것.
  • 이제 모든 오류는 해결했는데, 막상 저장이 안됨. gemini가 날 속인거였음.
  • 근본적 원인 : 수명이 긴 객체(SO)가 수명이 짧은 객체(Scene Object)를 강한 참조(Strong Reference)로 직접 소유하는 것은 메모리 누수의 원인이라 이렇게 설계돼있음.
  • 내일 ExposedReference<T>로 시도해보기. timeline도 이걸로 구현된거니 괜찮을 것.

event object field에 있는 객체가 아예 접근 불가능하진 않음.
debug.Log로 확인해봄. 에디터 임시 객체에 씬 인스턴스를 잠시 할당하고 있는 것까지는 확실히 된다.
이거면 구현 가능.

profile
너 정말 **핵심**을 찔렀어

0개의 댓글