Ui Builder Editor Scripting

Yumin·2025년 1월 26일

Unity

목록 보기
2/17

UI Builder를 사용해 Inspector제작

Editor 스크립팅보다 좋은 선택지가 될 것 같은데

문제점 問題点
스타일시트 관리의 어려움
패턴화 되어있거나 재사용 해야하는 형식이 나오면 고민의 필요 ( 디자인 시스템 )

スタイルシート管理の難しさ
パターン化されていたり、再利用しなければならない形式が出てきたら、
悩みの必要(デザインシステム)

해결법 解決法
UI Toolkit 핵심은 웹개발 접근법
uxml을 컴포넌트 단위로 쪼개서 재사용

UI Toolkitの核心はウェブ開発アプローチ
uxmlをコンポーネント単位に分けて再使用

DefaultUss

.unity-foldout__checkmark {
    background-image: url("project://database/Assets/Scripts/Editor/Icons/Lock.png?fileID=2800000&guid=0589837adb4686a4183efa8cc07bde31&type=3#Lock");
}

Foldout > Toggle:checked .unity-foldout__checkmark {
    background-image: url("project://database/Assets/Scripts/Editor/Icons/LockOpen.png?fileID=2800000&guid=7d185f72de3ccbe4f8fb6f9d9d1ff77e&type=3#LockOpen");
}

Toggle > VisualElement {
    justify-content: flex-end;
}

.default-foldout {
    background-color: rgb(4, 184, 238);
    align-items: center;
    -unity-font-definition: resource('Font/Editor/GalmuriMono9');
    font-size: 14px;
    color: rgb(255, 255, 255);
    -unity-font-style: bold;
    text-shadow: 35px 35px 0 rgba(0, 0, 0, 0.47);
    display: flex;
    justify-content: space-between;
}

Label {
    color: rgb(230, 230, 230);
    margin-right: 40px;
}

TurnManager_Inspector

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

[CustomEditor(typeof(TurnManager))]
public class TurnManager_Inspector : Editor
{
    public VisualTreeAsset m_InspectorXML;

    public override VisualElement CreateInspectorGUI()
    {
        // Create a new VisualElement to be the root of our inspector UI
        VisualElement myInspector = new VisualElement();

        // Load from default reference
        m_InspectorXML.CloneTree(myInspector);

        // Find the Foldout and Visual Elements
        var foldout = myInspector.Q<Foldout>("myFoldout");
        var visualElements = myInspector.Q<VisualElement>("myVisualElements");

        // Set initial state to false
        visualElements.style.display = DisplayStyle.None;

        // Register callback for Foldout state change
        foldout.RegisterValueChangedCallback(evt =>
        {
            visualElements.style.display = evt.newValue ? DisplayStyle.Flex : DisplayStyle.None;
        });
        
        // 버튼 가져오기
        Button myButton = myInspector.Q<Button>("StartButton");
        myButton.clicked += OnMyButtonClicked;

        // Return the finished inspector UI
        return myInspector;
    }

    public override bool UseDefaultMargins() => false;
    
    private void OnMyButtonClicked() {
        TurnManager myComponent = (TurnManager)target;
        myComponent.StartGame();
    }
}
profile
일본 게임회사에서 클라이언트 엔지니어로 활동중

0개의 댓글