250611

lililllilillll·2025년 6월 10일

개발 일지

목록 보기
199/350

✅ What I did today


  • LD Challenge : L001 : Day 13


🎯 LD Challenge : L001 : Day 13


한 것

[CustomPropertyDrawer(typeof(Condition))]
public class ConditionDrawer : PropertyDrawer

Condition을 위한 Custom Property Drawer 구현

드롭 다운과 게임 로직에선 필드 이름만 필요하다.
static 클래스인 GameContextInspector에서 필드 이름만 넣어주면 생성자에서 초기화할 때 갖고 있던 초기 fieldinfo dict에서 필드 이름을 통해 값을 가져온다.

IComparable left = fieldValue as IComparable;
IComparable right = parsedCondValue as IComparable;

int result = left.CompareTo(right);

switch (cond.compFunc)
{
    case CompFunc.Same: return result == 0;
    case CompFunc.Diff: return result != 0;

string을 동적으로 field의 타입으로 캐스팅해서 비교하려고 했더니 object는 비교 안된다면서 오류 뜸.
IComparable이라는 내장 인터페이스를 사용하면 된다고 홤.

value는 string으로 바꾼 후에, 값 바꿀 때마다 field의 type으로 캐스팅이 되는지 안 되는지 확인하고, 캐스팅 안되면 경고 띄우고 저장도 안 하기.
field type이 bool일때만 따로 dropdown로 만드는 로직 넣어두기.

GameContext instance들을 onenable() ondisable()에서 static class에 등록하도록 관리

GameContextInspector를 GameContextToolbox로 이름 변경하고 Editor와 런타임에 쓰일 GameContext 관련 static 메서드 정리

런타임 json manager 따로 관리 (기존 editor용은 data를 nodeElement 등으로 담아냈었고, editor 폴더 안에 들어가있어서 외부에서 쓰지도 못함)

배운 것

targetObject를 사용하는 이유
SerializedObject는 Unity의 인스펙터에서 값을 직렬화하고 편집하기 위해 사용하는 래퍼 클래스다.
하지만 이것은 진짜 객체 자체가 아니다. 직렬화된 필드 정보를 통해 간접적으로 데이터를 다루는 것이다.
SerializedObject를 통해 실제 원본 객체에 접근하려면 .targetObject를 써야 한다.

IsAssignableFrom(A) : A가 해당 타입을 상속하거나 구현하고 있는지 판단

var fields = type.GetFields(
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly
);
  • BindingFlags.Instance: 인스턴스 필드 (static 제외)
  • BindingFlags.Public: public 필드 포함
  • BindingFlags.NonPublic: private, protected 필드 포함
  • BindingFlags.DeclaredOnly: 해당 클래스에 직접 선언된 필드만 포함, 부모 클래스에서 상속된 필드는 제외


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

0개의 댓글