【Unity】QuizU で UI Toolkit を学ぼう~TestScene の追加~

TestSceneの追加 Unity
TestSceneの追加

Unity の QuizU アセットに TestScene を追加してみます。

QuizU で UI Toolkit を学ぼう~TestScene の追加~

TestSceneの追加
TestSceneの追加

QuizU

QuizU – A UI toolkit sample

UI Toolkit の使い方が学べる、Unity公式の無料のアセットです。

TestScene の追加

QuizU の MainMenu に TEST ボタンを追加します。
TEST ボタンを押すと、自分で作成した TestScene に遷移します。

TESTボタンの追加
TESTボタンの追加

Test フォルダを作成して、その下に必要なファイルを作成していきます。

Projectビュー
Projectビュー
TEST ボタンを追加する

MainMenuScreen アセットをダブルクリックして UI Builder を開きます。
#menu__button-more を複製して、#menu__button-test を作成します。
Attributes の Text も TEST に変更します。

Buttonの複製
Buttonの複製
UI Document の作成

Projectビューの Assets/Test/UI/Uxml フォルダで右クリックして、Create -> UI Toolkit -> UI Document をクリックします。
名前は TestScreen にします。
TestScreen をダブルクリックすると UI Builder が開きます。
Visual Element と Button を追加します。

Uxmlの編集
Uxmlの編集

#back-button の Style Class List には .back-button を追加します。
#character-sprite の Position Mode は Absolute に設定します。

TestScene の作成

TestScene シーンを作成します。

TestSceneの作成
TestSceneの作成

TestScree プレハブを追加します。

TestScreenプレハブ
TestScreenプレハブ

SceneLoader プレハブを追加します。
SceneLoader プレハブは QuizU に含まれています。

SceneLoaderの追加
SceneLoaderの追加

TempCamera プレハブを追加します。
TempCamera プレハブは QuizU に含まれています。

TempCameraの追加
TempCameraの追加
TestEvents スクリプトの作成

TestEvent.cs を作成します。

using System;

namespace MyApp {
    public static class TestEvents {
        #region Public Fields
        public static Action SetupCompleted;
        public static Action BackButtonClicked;
        public static Action CharacterSpriteClicked;
        #endregion // Public Fields.

        #region Private Fields
        #endregion // Private Fields.

        #region Public Properties
        #endregion // Public Properties.

        #region Private Properties
        #endregion // Private Properties.

        #region Unity Methods
        #endregion // Unity Methods.

        #region Public Methods
        #endregion // Public Methods.

        #region Private Methods
        #endregion // Private Methods.
    }
}
TestPresenter スクリプトの作成

TestPresenter.cs を作成します。

using Quiz;
using UnityEngine;

namespace MyApp {
    public class TestPresenter : MonoBehaviour {
        #region Public Fields
        #endregion // Public Fields.

        #region Private Fields
        private TestScreen m_rTestScreen;
        #endregion // Private Fields.

        #region Public Properties
        public TestScreen TestScreen { get => m_rTestScreen; set => m_rTestScreen = value; }
        #endregion // Public Properties.

        #region Private Properties
        #endregion // Private Properties.

        #region Unity Methods
        private void OnEnable() {
            TestEvents.SetupCompleted += TestEvents_SetupCompleted;
            TestEvents.CharacterSpriteClicked += TestEvents_CharacterSpriteClicked;
        }

        private void OnDisable() {
            TestEvents.SetupCompleted -= TestEvents_SetupCompleted;
            TestEvents.CharacterSpriteClicked -= TestEvents_CharacterSpriteClicked;
        }
        #endregion // Unity Methods.

        #region Public Methods
        #endregion // Public Methods.

        #region Private Methods
        private void Initialize() {
            NullRefChecker.Validate(this);
        }

        private void TestEvents_SetupCompleted() {
            Initialize();
        }

        private void TestEvents_CharacterSpriteClicked() {
            m_rTestScreen.UpdateCharacterSpritePosition();
        }
        #endregion // Private Methods.
    }
}
TestScreen スクリプトの作成

TestScreen.cs を作成します。

using UnityEngine;
using Quiz;
using UnityEngine.UIElements;

namespace MyApp {
    public class TestScreen : UIScreen {
        #region Public Fields
        #endregion // Public Fields.

        #region Private Fields
        private Button m_rBackButton;
        private VisualElement m_rCharacterSprite;
        #endregion // Private Fields.

        #region Public Properties
        public Button BackButton => m_rBackButton;
        public VisualElement CharacterSprite => m_rCharacterSprite;
        #endregion // Public Properties.

        #region Private Properties
        #endregion // Private Properties.

        #region Unity Methods
        #endregion // Unity Methods.

        #region Public Methods
        public TestScreen(VisualElement rParentElement) : base(rParentElement) {
            m_RootElement = rParentElement;
            SetVisualElements();
            m_HideOnAwake = false;
        }

        public void RegisterCallbacks() {
            m_EventRegistry.RegisterCallback<ClickEvent>(m_rBackButton, rEvent => TestEvents.BackButtonClicked?.Invoke());
            m_EventRegistry.RegisterCallback<ClickEvent>(m_rCharacterSprite, rEvent => TestEvents.CharacterSpriteClicked?.Invoke());
        }

        public void UnregisterCallbacks() {
            m_EventRegistry.Dispose();
        }

        public void UpdateCharacterSpritePosition() {
            float fPosX = Random.Range(0, Screen.width);
            float fPosY = Random.Range(0, Screen.height);
            m_rCharacterSprite.transform.position = new Vector3(fPosX, fPosY, m_rCharacterSprite.transform.position.z);
        }
        #endregion // Public Methods.

        #region Private Methods
        private void SetVisualElements() {
            m_rBackButton = m_RootElement.Q<Button>("back-button");
            m_rCharacterSprite = m_RootElement.Q<VisualElement>("character-sprite");
        }
        #endregion // Private Methods.
    }
}
TestSetup スクリプトの作成

TestSetup.cs を作成します。

using Quiz;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

namespace MyApp {
    public class TestSetup : MonoBehaviour {
        #region Public Fields
        #endregion // Public Fields.

        #region Private Fields
        [SerializeField] private UIDocument m_rDocument;
        private TestPresenter m_rTestPresenter;
        private TestScreen m_rTestScreen;
        private const string C_SCENE_PATH_TO_UNLOAD = "Assets/Test/Scenes/TestScene.unity";
        #endregion // Private Fields.

        #region Public Properties
        #endregion // Public Properties.

        #region Private Properties
        #endregion // Private Properties.

        #region Unity Methods
        private void OnEnable() {
            if (m_rDocument == null) {
                m_rDocument = GetComponent<UIDocument>();
            }
            if (m_rTestPresenter == null) {
                m_rTestPresenter = GetComponent<TestPresenter>();
            }
            NullRefChecker.Validate(this);
            if (!Coroutines.IsInitialized) {
                Coroutines.Initialize(this);
            }
            SetupTestScreen();
            TestEvents.BackButtonClicked += TestEvents_BackButtonClicked;
        }

        private void OnDisable() {
            TestEvents.BackButtonClicked -= TestEvents_BackButtonClicked;
            m_rTestScreen.Disable();
        }
        #endregion // Unity Methods.

        #region Public Methods
        #endregion // Public Methods.

        #region Private Methods
        private void SetupTestScreen() {
            VisualElement rRootElement = m_rDocument.rootVisualElement.Q<VisualElement>("test-container");
            m_rTestScreen = new TestScreen(rRootElement);
            m_rTestScreen.Initialize();
            m_rTestScreen.RegisterCallbacks();
            m_rTestScreen.Show();
            m_rTestPresenter.TestScreen = m_rTestScreen;
            TestEvents.SetupCompleted?.Invoke();
        }

        private void TestEvents_BackButtonClicked() {
#if UNITY_EDITOR
            if (!CheckSceneExists(C_SCENE_PATH_TO_UNLOAD)) {
                Debug.LogWarning($"[TestSetup]: Missing scene at path {C_SCENE_PATH_TO_UNLOAD}");
                return;
            }
#endif // UNITY_EDITOR.

            SceneEvents.UnloadSceneByPath?.Invoke(C_SCENE_PATH_TO_UNLOAD);
            Debug.Log($"[TestSetup] Unloading scene: {C_SCENE_PATH_TO_UNLOAD}");
        }

#if UNITY_EDITOR
        private bool CheckSceneExists(string rScenePath) {
            return AssetDatabase.LoadAssetAtPath<SceneAsset>(rScenePath) != null;
        }
#endif // UNITY_EDITOR.
#endregion // Private Methods.
    }
}
動作確認

Unity エディターの再生ボタンを押します。
MainMenu に TEST ボタンが追加されています。
TEST ボタンを押すと、TestScene に遷移します。
Sprite をクリックすると、ランダムな座標に移動します。

動作確認
動作確認

まとめ

QuizU は、UI Toolkit の使い方を学べるアセットになります。
今回は、TestScene を作成して、MainMenu から呼び出してみました。
クリックして遊ぶゲームを考えて作ってみましょう。

コメント

タイトルとURLをコピーしました