๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ PropertyDrawer์— uitoolkit์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž„.


๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ƒํ™ฉ์„ ๋งŒ๋“ค๊ณ  ์ปค์Šคํ…€ui๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ณธ๋‹ค.

์œ ๋‹ˆํ‹ฐ๋กœ ๊ฒŒ์ž„์„ ๋งŒ๋“ค๋ฉด์„œ ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ผ์€ ๊ธธ๊ฐ€์— ์ฑ„์ด๋Š” ๋Œ์ฒ˜๋Ÿผ ๋งŽ๋‹ค.

๊ฐ€๋ น ๊ฐ„๋‹จํ•œ ๊ฒ€์‚ฌ( ๋ฌธ์ž "$"๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.) ๊ฐ€ ํ•„์š”ํ•œ ์ŠคํŠธ๋ง์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•ด๋ณด๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.


[Serializable]

public class MyString

{

// ์ด๊ฒƒ์€ "$" ๋ฅผ ํฌํ•จํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ŠคํŠธ๋ง์ด๋‹ค. ์ด์œ ๋Š” ์—†๋‹ค ์™œ๋ƒํ•˜๋ฉด ์ด ์ฝ”๋“œ๋Š” ์˜ˆ์ œ์ฝ”๋“œ๋‹ˆ๊นŒ.

// ์—๋””ํ„ฐ์—์„œ ์ˆ˜์ •ํ•œ ์ดํ›„์— ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ๋ณ€๊ฒฝ๋  ํ•„์š”๊ฐ€ ์—†๋Š” ์ŠคํŠธ๋ง.

[SerializeField] private string doNotUseDollar;

public string Value => doNotUseDollar;


#if UNITY_EDITOR

public static bool CheckValidation(string value)

{

return !value.Contains("$");

}

#endif

}


๊ทผ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด ์ŠคํŠธ๋ง๊ฐ’์€ ์‚ฌ๋žŒ์ด ์—๋””ํ„ฐ์—์„œ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฐ’์ธ๋ฐ, ์ž…๋ ฅ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๊ฐ€ ์ผ์–ด๋‚  ํ™•๋ฅ ์ด ๋†’๋‹ค.

๋Ÿฐํƒ€์ž„์—์„œ ์—๋””ํ„ฐ๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋œ ๊ฐ’์„ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ ์ „์— ์˜ค๋ฅ˜ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌ๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ,

์‚ฌ์‹ค ์ €๋Ÿฐ๊ฒƒ์€ ์• ์ดˆ์— ์ž˜๋ชป๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋˜๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์—๋””ํ„ฐ์—์„œ๋งŒ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ˆ˜๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ์ž˜๋ชป๋œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋ฉด ๊ฒฝ๊ณ ๋ฅผ ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์Œ.

์ผ๋‹จ ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.


public class MyMonoComponent : MonoBehaviour

{

[SerializeField] private MyString test;

[SerializeField] private MyString[] testArray;


private void Awake()

{

Debug.Log(test.Value);

}

}


๊ทธ๋ฆฌ๊ณ  ์œ ๋‹ˆํ‹ฐ์— ์ถ”๊ฐ€ํ•˜๋ฉด

a15714ab041eb360be3335625683746f0053452ad6a4e3890b9df62c37a1c32c8e70692aaf9ec2346b37ae5cb1e0fe949a08362a33


์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๊ฒ ์ง€?

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๋•Œ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋ฉด (์—ฌ๊ธฐ์„œ๋Š” $๋ฅผ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ)

์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ž˜๋ชป ์ž…๋ ฅํ•œ ํ•„๋“œ๊ฐ€ ๋นจ๊ฐ›๊ฒŒ ๋˜๋ฉด ๊ฐ’์„ ์ž…๋ ฅํ•˜๋‹ค๊ฐ€ ์‹ค์ˆ˜ํ–ˆ์„ ๋•Œ ๋ฐ”๋กœ ์•Œ์ˆ˜์žˆ๊ฒ ์ง€?

a15714ab041eb360be3335625683746f0053452ad6a4e3890b9df62c37a1c32c8e70652aaf94c2346b37ae5cb1e0fe943316a9e6ae


์ด๊ฑธ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ตฌํ˜„๋ฐฉ๋ฒ•์ด ์žˆ์Œ. ์ทจํ–ฅ์— ๋งž๊ฒŒ ์ข‹์•„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์“ฐ๋ฉด ๋˜๋Š”๊ฑด๋ฐ

๋‚˜๋Š” uitoolkit์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋งค์šฐ ์ข‹์•„ํ•˜๊ฒŒ ๋˜์—ˆ์Œ.



uitoolkit์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๊ณต๋ถ€ํ–ˆ๋‹ค๋ฉด,

์‘๋‹น uitoolkit์—์„œ ๋นŒ๋”ฉ๋ธ”๋ก์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” VisualElement๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฒƒ์ž„.

uitoolkit์—์„œ ์ œ๊ณตํ•˜๋Š” UIBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ uxmlํŒŒ์ผ์„ ํŽธ์ง‘ํ• ์ˆ˜ ์žˆ์Œ

ํŽธ์ง‘๋œ uxmlํŒŒ์ผ์€ VisualTree๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€์— ๋Œ€ํ•ด ์ ์–ด๋…ผ ํŒŒ์ผ์ž„.

VisualTree๋Š” VisualElement๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ 

์ด๋ฆ„์ฒ˜๋Ÿผ ํŠธ๋ฆฌ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ƒ๋‹จ root์—์„œ๋ถ€ํ„ฐ ํ•˜์œ„ VisualElement๊นŒ์ง€ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด

ํ•˜์œ„๊ตฌ์กฐ๋ฅผ ์ฟผ๋ฆฌํ•ด์˜ค๊ธฐ ์œ„ํ•œ Q<T> ๋˜๋Š” Query(string id) ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•จ.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค VisualElement ํ•˜์œ„์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด, id๋‚˜, ํ•ด๋‹น ์š”์†Œ์˜ ํด๋ž˜์Šค์ด๋ฆ„์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ์•Œ๊ณ  ์žˆ์„๊ฑฐ์ž„

์ด์ œ ์ด๊ฑธ ์ด์šฉํ• ๊ฑฐ์ž„.


UIBuilder์—์„œ ๋ณด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” UIElement ๋“ค์ด ์žˆ๋‹ค.

a15714ab041eb360be3335625683746f0053452ad6a4e3890b9df62c37a1c32c8e77652aaf93c2346b37ae5cb1e0fe94fb81478ded


์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ท€์ฐฎ์•„์„œ ๋ฐ‘์— 3๊ฐœ๋งŒ ์ ์Œ)

UnityEngine.UIElements.Label

UnityEngine.UIElements.TextField

UnityEngine.UIElements.PropertyField


์—ฌ๊ธฐ์„œ UnityEngine.UIElements.TextField์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์ž.


a15714ab041eb360be3335625683746f0053452ad6a4e3890b9df62c37a1c32c8e77682aab91c2346b37ae5cb1e0fe94d20d3f490a


์ตœ์ƒ๋‹จ VisualElement๋กœ "TextField"๊ฐ€ ์žˆ๊ณ  ๊ทธ ํ•˜์œ„๋กœ "Label"๊ณผ "#unity-text-input"์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋”ฐ.


๊ทธ๋Ÿฌ๋ฉด MyString.doNotUseDollar ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , ์ŠคํŠธ๋ง์„ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์„œ ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ

"#unity-text-input"์˜ background ์ปฌ๋Ÿฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ ๊ฑฐ์ž„.


๊ทธ๊ฒƒ์„ ์œ„ํ•ด ์ผ๋‹จ Editorํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  MyStringProperyDrawer.cs ํŒŒ์ผ์„ ๋งŒ๋“ค์ž.

(namespace์— ๋งž๋Š” ์œ„์น˜์— ์ƒ์„ฑํ•ด์ฃผ์ž, ์—ฌ๊ธฐ์„œ๋Š” Asset/Editor/MyStringProperyDrawer.cs)

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ณด์ž.

using UnityEditor;

using UnityEngine;

using UnityEngine.UIElements;


[CustomPropertyDrawer(typeof(MyString))]

public class MySerializableClassPropertyDrawer : PropertyDrawer

{

public override VisualElement CreatePropertyGUI(SerializedProperty property)

{

}

}

์–ผ๋งˆ์ „์˜ ๋‚˜์ฒ˜๋Ÿผ PropertyDrawer๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ž ๊น ์„ค๋ช…ํ•˜๊ณ  ๋„˜์–ด๊ฐ.

ProperyDrawerํด๋ž˜์Šค๋Š” ํŠน์ • Serializable Class๊ฐ€ ์œ ๋‹ˆํ‹ฐ ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ๊ทธ๋ ค์ง€๋Š” ๋ฐฉ๋ฒ•์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ž„.

๊ณต์‹๋ฌธ์„œ๊ฐ€ ์„ค๋ช…์ด ๋” ์ž˜๋˜์–ด์žˆ์Œ. ์„ค๋ช…์ด ํ•„์š”ํ•œ ์‚ฌ๋žŒ์€ ์ฝ์–ด๋ณด๊ณ  ์˜ค๋„๋ก


https://docs.unity3d.com/kr/2021.3/Manual/editor-PropertyDrawers.html

ํ”„๋กœํผํ‹ฐ ๋“œ๋กœ์–ด - Unity ๋งค๋‰ด์–ผํ”„๋กœํผํ‹ฐ ๋“œ๋กœ์–ด๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํŠน์ • Serializable ํด๋ž˜์Šค๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•˜์—ฌ ์ธ์ŠคํŽ™ํ„ฐ(Inspector) ์ฐฝ ์— ํŠน์ • ์ปจํŠธ๋กค์ด ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.docs.unity3d.com



https://docs.unity3d.com/kr/2022.3/Manual/editor-PropertyDrawers.html

ํ”„๋กœํผํ‹ฐ ๋“œ๋กœ์–ด - Unity ๋งค๋‰ด์–ผ์ฐธ๊ณ :Unity ์—๋””ํ„ฐ๋ฅผ ํ™•์žฅํ•˜๋ ค๋ฉด UI Toolkit์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•˜๋ฉฐ, ์ด๋Š” IMGUI๋ณด๋‹ค ๋” ์ตœ์‹ ์˜ ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.docs.unity3d.com




๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์žฌ๋ฏธ๋‚œ์ ์€ ๋‚ด๊ฐ€ ์ฝฉ์˜ ์ €์ฃผ๋กœ ๋งํฌ๋ฅผ ๋‘๋ฒˆ๋‹จ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์ž„

๊ฐ๊ฐ 2021.3๊ณผ 2022.3 ๋ฒ„์ „์˜ ๋‹ค๋ฅธ ๋ฌธ์„œ์ž„.

๊ทธ๋Ÿฐ๋ฐ 2022.3 ๋ฒ„์ „ ๋ฌธ์„œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์žˆ์Œ.

a15714ab041eb360be3335625683746f0053452ad6a4e3890b9df62c37a1c32d62593f6996189d6bf0c56731a889d926c70eeb480e


์ปค์Šคํ…€ํˆด ๋งŒ๋“ค ๋•Œ๋Š” uitoolkit์„ ์จ๋ผ๋Š” ๊ฑฐ์ž„. ๊ทธ๋ ‡๋‹ค๋ฉด ํ•œ๋ฒˆ ์จ์ค˜์•ผ ๋˜์ง€ ์•Š์„๊นŒ??

(๋‚˜๋Š” ์œ ๋‹ˆํ‹ฐ๊ฐ€ uitoolkit์„ ๊ณ„์† ๋ฐœ์ „์‹œ์ผœ์„œ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์›น/์•ฑ๋””์ž์ธ์ฒ ํ•™์„ ์ธ๊ฒŒ์ž„์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ ,

๋”๋ถˆ์–ด flutter๋‚˜ react native์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ui๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋งŒ๋“ค์–ด ๊ฒŒ์ž„ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์‹œ์žฅ์„ ๋…ธ๋ฆฌ๋ ค๋Š” ์‹œ๋„๋กœ ๋ณด๊ณ ์žˆ์Œ)


๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์“ธ๊นŒ?

๋ฌธ์„œ์— ์˜ˆ์ œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด OnGUIํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๋ผ๊ณ  ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.


using UnityEditor;

using UnityEngine;


[CustomPropertyDrawer(typeof(Ingredient))]

public class IngredientDrawer :PropertyDrawer

{

// Draw the property inside the given rect

public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)

{

...์ƒ๋žต...

}

}


๊ทธ๋Ÿฌ๋‚˜ CreatePropertyGUIํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ฉด VisualElement๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ย CreatePropertyGUIํ•จ์ˆ˜๋Š”ย ํŠน์ • Serializable Class๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ VisualElement๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.


์ผ๋‹จ์€ MyString์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด

1) TextField๋ฅผ ์ƒ์„ฑํ•˜๊ณ 

2) TextField์™€ MyString.doNotUseDollar ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ 

3) TextField์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋  ๋•Œ 4) ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ์œผ๋กœ ๋“ฑ๋ก

4) string๊ฐ’์„ ๊ฒ€์‚ฌํ•ด์„œ "#unity-text-input"์˜ background๋ฅผ true๋ฉด ์ง„ํ•œํšŒ์ƒ‰๋ฐฐ๊ฒฝ, false๋ฉด ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ.

์„ ํ• ๊ฑฐ์ž„.

์•„๋ž˜ ์ฃผ์„์„ ๋‹ฌ์•„๋…ผ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์„ค๋ช…ํ•˜๊ฒ ์Œ.


using UnityEditor;

using UnityEngine;

// VisualElement๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

using UnityEngine.UIElements;


// MyString์„ ์–ด๋–ป๊ฒŒ ์ธ์ŠคํŽ™ํ„ฐ์— ๊ทธ๋ฆด ๊ฒƒ์ธ๊ฐ€.

[CustomPropertyDrawer(typeof(MyString))]

public class MySerializableClassPropertyDrawer : PropertyDrawer

{


// ์•„๋ž˜์—์„œ ์‚ฌ์šฉํ•  ์ƒ‰์ƒ์„ ๋ฏธ๋ฆฌ ์ •ํ•ด๋‘์—ˆ๋‹ค.

private static readonly Color InvalidBackgroundColor = Color.red;

private static readonly Color BackgroundColor = new Color(0.157f, 0.157f, 0.157f);


public override VisualElement CreatePropertyGUI(SerializedProperty property)

{

// ๋ฃจํŠธ VisualElement ์ƒ์„ฑ

var container = new VisualElement();


var doNotUseDollarProperty = property.FindPropertyRelative("doNotUseDollar");


// TextField (VisualElement) ์ƒ์„ฑ.


var doNotUseDollarField = new TextField

{

// mvvm๋ชจ๋ธ์˜ binding์ด๋ผ๋Š” ๊ฐœ๋…์„ ๊ณต๋ถ€ํ•ด๋ณด์ž. ์—ฌ๊ธฐ์„œ ์„ค๋ช…ํ•˜๊ธฐ์—๋Š” ๊ธธ๋‹ค.

// ๋Œ€์ถฉ ๋งํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ๋ฐ”์ธ๋”ฉํŒจ์Šค๋Š” ํ‚ค๊ฐ€ ๋œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

bindingPath = doNotUseDollarProperty.propertyPath,

label = property.displayName

};


// TextField์— ์ฝœ๋ฐฑ ๋“ฑ๋ก.

doNotUseDollarField.Reg1sterValueChangedCallback(value =>

{

// ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๊ฒ€์‚ฌ.

var isValid = MyString.CheckValidation(value.newValue);

//UI Builder์—์„œ TextField์˜ ๊ตฌ์กฐ๋ฅผ ๋ดค๋˜๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š”๊ฐ€? (๊ธฐ์–ต ์•ˆ๋‚˜๋ฉด ์œ„์— ๊ทธ๋ฆผ ๋‹ค์‹œ ๋ณด๊ณ ์˜ค๋ฉด ์ข‹์„๋“ฏ)

// TextField๋Š” ํ•˜์œ„์— unity-text-input๋ผ๊ณ  ์ด๋ฆ„๋ถ™์—ฌ์ง„ VisualElement๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

var textInput = doNotUseDollarField.Q("unity-text-input");

// ์œ—์ค„์ฒ˜๋Ÿผ ํ•˜๋ฉด "unity-text-input" VisualElement๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

// ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ€์ผ์„ ์„ค์ •ํ•ด์ฃผ์ž.

textInput.style.backgroundColor = isValid ? BackgroundColor : InvalidBackgroundColor;

});


// ๋งจ์ฒ˜์Œ ๋งŒ๋“  ์ปจํ…Œ์ด๋„ˆ ํ•˜์œ„์— ํ…์ŠคํŠธํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

container.Add(doNotUseDollarField);


return container;

}

}

UIBuilder์—์„œ VisualTree๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•ด propertyDrawer๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.