EditorScripting 7

Unity 에디터 도구 설정이 재컴파일마다 초기화될 때, ScriptableSingleton 저장 위치부터 확인하세요

서론빌드 경로, 개발 빌드 여부, 마지막으로 선택한 플랫폼처럼 에디터 도구가 기억해야 할 값이 있다. 이를 EditorWindow 필드나 static 변수에만 넣으면 스크립트 재컴파일과 에디터 재시작 뒤에 값이 사라진다.EditorPrefs로 옮기면 저장은 되지만 프로젝트별 설정과 사용자 개인 설정이 섞이기 쉽다. Unity의 ScriptableSingleton을 사용하면 에디터 전용 상태를 직렬화하고, 저장 위치까지 명시적으로 결정할 수 있다.1. static 필드가 해결책이 아닌 이유static은 접근하기 편하지만 영속 저장소가 아니다. Domain Reload가 발생하면 초기화되며, Reload Domain을 꺼도 에디터 재시작까지 버티지는 못한다.Unity 공식 문서에 따르면 ScriptableS..

Unreal Engine Details 패널 확장하기: IDetailCustomization으로 반복 설정 버튼 만들기

언리얼 엔진에서 데이터 에셋이나 설정 오브젝트를 만들다 보면 여러 프로퍼티를 한꺼번에 특정 값으로 맞추는 작업이 반복된다. 공격력, 사거리, 이동 속도를 테스트용 값으로 초기화할 때마다 각 필드를 직접 수정하면 실수하기 쉽고 작업 속도도 느려진다.IDetailCustomization을 사용하면 기존 Details 패널에 버튼, 경고문, 조건부 UI를 추가할 수 있다. 별도의 에디터 창을 만들지 않고도 디자이너가 보고 있는 프로퍼티 바로 옆에 도구를 배치할 수 있다는 점이 핵심이다.편집할 설정 클래스 준비하기예제로 적 밸런스 설정을 담는 UObject를 만든다. 실제 프로젝트에서는 UDataAsset이나 컴포넌트에도 같은 방식을 적용할 수 있다.UCLASS(BlueprintType)class UEnemyB..

Unity BuildPlayerWindow 커스텀 빌드 버튼으로 실수 없는 팀 빌드 파이프라인 만들기

Unity 프로젝트가 커질수록 빌드는 단순히 Build 버튼을 누르는 일이 아니게 됩니다. 개발 빌드인지, 릴리즈 빌드인지, 서버 주소는 맞는지, 버전 번호는 올렸는지, 테스트용 씬이 섞이지 않았는지까지 확인해야 합니다.문제는 이런 체크가 사람 손에 맡겨지면 언젠가는 빠진다는 점입니다. 특히 팀 프로젝트에서는 한 명은 Android, 한 명은 Windows, 한 명은 QA 빌드를 만들면서 설정이 조금씩 달라지기 쉽습니다.이럴 때 Unity의 BuildPlayerWindow.RegisterBuildPlayerHandler를 쓰면 기본 Build 버튼을 우리 팀 전용 빌드 파이프라인으로 바꿀 수 있습니다. 오늘은 에디터에서 버튼을 누르는 순간 검증, 경로 생성, 빌드 옵션 적용까지 한 번에 처리하는 구조를 ..

Unreal Engine C++ Data Validation: UEditorValidator로 에셋 오류와 빌드 크래시 사전 방지하기

게임 프로젝트가 커질수록 다루는 에셋의 양은 빠르게 불어납니다. 기획자, 아티스트, 프로그래머가 매일 수많은 캐릭터 모델, 텍스처, 사운드, 데이터 에셋을 에디터로 임포트하고 수정하죠. 이 과정에서 밉맵(Mipmap) 설정이 빠진 큰 텍스처가 들어오거나, LOD(Level of Detail)가 하나도 없는 무거운 스태틱 메시가 배치되는 실수가 자주 생깁니다.이런 작은 세팅 실수는 단순히 빌드 용량을 키우는 데 그치지 않습니다. 밉맵이 없어 텍스처 메모리가 폭증하거나, 잘못 구성된 데이터 에셋이 런타임에서 널 포인터 참조 크래시로 이어지기도 합니다. 최악의 경우 패키징 단계의 쿡(Cook) 과정에서 에러가 나면서 전체 빌드 파이프라인이 멈춰 서기도 합니다.에셋 임포트 가이드를 문서로 배포하는 것만으로는 이..

Unity 씬 뷰에서 직접 편집하기, Handles API와 OnSceneGUI로 웨이포인트 비주얼 에디터 만들기

순찰 경로, 카메라 이동 라인, 트리거 영역 같은 데이터를 인스펙터에서 Vector3 배열 숫자로 입력해 본 사람은 안다. X, Y, Z 값을 손으로 치고, 씬 뷰로 시선을 옮겨 위치를 확인하고, 다시 인스펙터로 돌아와 숫자를 고친다. 점이 다섯 개만 넘어가도 이 왕복은 고통스럽다. 머릿속에는 "그냥 씬에서 마우스로 끌면 안 되나?"라는 생각이 떠오른다.된다. 유니티 에디터에는 씬 뷰 위에 조작 가능한 손잡이(핸들)를 그리는 Handles API가 있고, 컴포넌트마다 씬 뷰 그리기 로직을 끼워 넣는 OnSceneGUI 콜백이 있다. 이 둘을 합치면 인스펙터 숫자 입력을 마우스 드래그로 바꾸는 인-씬(in-scene) 에디터를 만들 수 있다. 데이터는 그대로 두고, 편집 경험만 바꾸는 것이다.이 글에서는 ..

Unity UI Toolkit 실전 — IMGUI 없이 커스텀 EditorWindow 제작하기

Unity 에디터 도구를 만들 때 오랫동안 표준이었던 OnGUI 기반 IMGUI는 단점이 뚜렷하다. 매 프레임 전체 UI를 다시 그리고, 레이아웃 코드와 로직 코드가 뒤섞이며, 복잡한 UI일수록 유지보수가 기하급수적으로 어려워진다. "이 슬라이더 위에 레이블 하나 얹으려면 GUILayout 세 줄을 수정해야 한다"는 상황이 낯설지 않을 것이다.Unity 2021.1부터 안정화된 UI Toolkit(구 UIElements)은 이 문제를 구조적으로 해결한다. HTML에 해당하는 UXML로 레이아웃을 선언하고, CSS에 해당하는 USS로 스타일을 분리하며, C# 코드는 이벤트 처리와 데이터 바인딩만 담당한다. 역할이 명확히 나뉘어 UI 디자이너와 프로그래머가 같은 화면을 동시에 작업할 수 있고, Unity 6..

Unity PropertyDrawer 실전 — 커스텀 Attribute로 Inspector 필드를 직접 디자인하기

왜 PropertyDrawer인가Unity Inspector의 기본 [Range], [Header], [Tooltip] Attribute는 편리하지만, 팀 프로젝트가 커지면 한계가 뚜렷하다. "이 float는 런타임에만 바뀌어야 하니 읽기 전용으로 잠가 달라", "이 필드는 특정 bool이 true일 때만 보여야 한다", "min/max 두 값을 슬라이더 하나로 표현하고 싶다"처럼 내장 Attribute만으로 해결이 안 되는 요구사항이 금방 쌓인다.흔한 대안은 CustomEditor로 MonoBehaviour 전체를 직접 그리는 방법인데, 이 방식은 클래스마다 별도의 Editor 클래스를 작성해야 하고 다른 스크립트에서 재사용이 안 된다. 결국 비슷한 OnGUI 코드가 프로젝트 곳곳에 복붙된다.Prope..