버전:2021.3+
이 예시는 전환 이벤트의 수명 주기를 보여줍니다.
이 예시에서는 버튼과 컬러 팔레트가 있는 커스텀 에디터 창을 만듭니다.버튼을 클릭하면 다음이 나타납니다.
이 예시에서 생성한 완성된 파일은 이 GitHub 저장소에서 찾을 수 있습니다.
이 가이드는 Unity 에디터, UI 툴킷, C# 스크립팅에 익숙한 개발자용입니다.시작하기 전에 먼저 다음을 숙지하십시오.
템플릿을 사용하여 Unity에서 프로젝트를 생성합니다.
메뉴에서 Assets > Create > UI Toolkit > Editor Window를 선택합니다.
UI Toolkit Editor Window Creator 창에서 TransitionExample
을 입력합니다.
변경 사항을 저장합니다.이렇게 하면 TransitionExample.cs
, TransitionExample.uss
, TransitionExample.uxml
로 세 개의 파일이 생성됩니다.
TransitionExample.cs
를 다음 콘텐츠로 바꿉니다.
using System;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class TransitionExample :EditorWindow
{
[SerializeField] private VisualTreeAsset m_VisualTreeAsset = default;
private Button clickMeButton;
private VisualElement colorChanger;
private Label eventLabel;
private Label timeLabel;
private DateTime lastEvent;
private static readonly TimeSpan NearlyInstantaneousThreshold = TimeSpan.FromMilliseconds(10);
private static readonly string ClickMeButtonClass = "click-me";
private static readonly string ColorChangerClass = "color-changer";
private static readonly string ColorChangerTransitionClass = "color-transition";
private static readonly string EventLabelName = "eventLabel";
private static readonly string TimeLabelName = "timeLabel";
private static readonly string TimeBelowThresholdText = "Almost instantaneous.";
[MenuItem("Window/UI Toolkit/Transition Example")]
public static void ShowExample()
{
TransitionExample wnd = GetWindow<TransitionExample>();
wnd.titleContent = new GUIContent("TransitionExample");
wnd.minSize = new Vector2(500f, 400f);
}
public void CreateGUI()
{
lastEvent = DateTime.Now;
// Each editor window contains a root VisualElement object
VisualElement root = rootVisualElement;
// Instantiate UXML
VisualElement uxmlAsset = m_VisualTreeAsset.Instantiate();
root.Add(uxmlAsset);
// Get the relevant elements by querying the root element
clickMeButton = root.Q<Button>(className:ClickMeButtonClass);
colorChanger = root.Q<VisualElement>(className:ColorChangerClass);
eventLabel = root.Q<Label>(name:EventLabelName);
timeLabel = root.Q<Label>(name:TimeLabelName);
// Add callbacks for clicking on the button and monitoring the color changing element.
clickMeButton.RegisterCallback<ClickEvent>(OnClickEvent);
colorChanger.RegisterCallback<TransitionRunEvent>(OnTransitionRun);
colorChanger.RegisterCallback<TransitionStartEvent>(OnTransitionStart);
colorChanger.RegisterCallback<TransitionEndEvent>(OnTransitionEnd);
colorChanger.RegisterCallback<TransitionCancelEvent>(OnTransitionCancel);
}
private void OnDisable()
{
clickMeButton.UnregisterCallback<ClickEvent>(OnClickEvent);
colorChanger.UnregisterCallback<TransitionRunEvent>(OnTransitionRun);
colorChanger.UnregisterCallback<TransitionStartEvent>(OnTransitionStart);
colorChanger.UnregisterCallback<TransitionEndEvent>(OnTransitionEnd);
colorChanger.UnregisterCallback<TransitionCancelEvent>(OnTransitionCancel);
}
private void OnClickEvent(ClickEvent evt)
{
colorChanger.ToggleInClassList(ColorChangerTransitionClass);
}
private void OnTransitionRun(TransitionRunEvent evt)
{
DisplayLatestEvent("TransitionRunEvent", DateTime.Now);
}
private void OnTransitionStart(TransitionStartEvent evt)
{
DisplayLatestEvent("TransitionStartEvent", DateTime.Now);
}
private void OnTransitionEnd(TransitionEndEvent evt)
{
DisplayLatestEvent("TransitionEndEvent", DateTime.Now);
}
private void OnTransitionCancel(TransitionCancelEvent evt)
{
DisplayLatestEvent("TransitionCancelEvent", DateTime.Now);
}
private void DisplayLatestEvent(string eventType, DateTime timestamp)
{
// If two events are sent too close together, add both to the Latest event line.
// This happens if the delay is set to 0 and the TransitionRun and TransitionStart
// are sent at the same time, or if the button was pressed before the transition
// was over, thus sending TransitionCancel and TransitionRun (and potentially
// TransitionStart) events close together.
var elapsed = timestamp - lastEvent;
if (elapsed <= NearlyInstantaneousThreshold)
{
timeLabel.text = TimeBelowThresholdText;
eventLabel.text += eventType;
}
else
{
timeLabel.text = $"{elapsed:s\\.ff} s";
eventLabel.text = eventType;
}
lastEvent = timestamp;
}
}
TransitionExample.uxml
을 다음 콘텐츠로 바꿉니다.
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements"
xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements"
noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<Style src="TransitionExample.uss"/>
<ui:VisualElement class="main-container">
<ui:Button text="Click Me!" class="click-me"/>
<ui:VisualElement class="color-changer"/>
<ui:VisualElement class="label-section">
<ui:VisualElement class="label-line">
<ui:Label text="Latest event(s) : "/>
<ui:Label name="eventLabel"/>
</ui:VisualElement>
<ui:VisualElement class="label-line">
<ui:Label text="Time since last event : "/>
<ui:Label name="timeLabel"/>
</ui:VisualElement>
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
TransitionExample.uss
를 다음 콘텐츠로 바꿉니다.
.click-me {
width:250px;
height:50px;
font-size:40px;
-unity-font-style: bold-and-italic;
margin:30px;
}
.color-changer {
margin:10px;
width:150px;
height:150px;
border-width:10px;
border-radius:75px;
background-color: rgb(0, 31, 138);
transition: background-color 3s ease-in-out 1s;
}
.main-container {
align-items: center;
justify-content: space-between;
flex-grow:1;
background-color: rgb(60, 60, 60);
}
.label-section {
margin:10px;
border-width:2px;
width:95%;
align-items: center;
}
.label-line {
flex-direction: row;
margin:5px;
flex-grow:1;
align-items: center;
width:90%;
height:25px;
font-size:14px;
padding:0;
}
.color-transition {
background-color: rgb(177, 221, 111);
}
TransitionExample.cs
를 선택하고 TransitionExample.uxml
이 아직 없는 경우 인스펙터의 Visual Tree Asset 필드에 끌어다 놓습니다.
이 예시를 사용해 보려면 메뉴에서 Window > UI Toolkit > Transition Example을 선택합니다.
버튼을 클릭하면 컬러 전환과 전송된 이벤트에 대한 설명을 볼 수 있습니다.TransitionRunEvent
와 TransitionStartEvent
사이에 긴 지연이 있습니다.긴 기간 동안 버튼을 다시 클릭하여 전환을 인터럽트할 수 있습니다.