土鍋で雑多煮

UnityでXR・ゲーム開発をしています。学んだことや備忘録、趣味の記録などを書いていきます。

MENU

【Unity ECS】 Entity情報をUI ToolkitのUIに表示する

どうも、土鍋です。

前回の記事の続きからで、取得したオブジェクトの情報をUIToolkitのUIに表示する方法を解説します。

donabenabe.hatenablog.com

実装

Rayで取得したEntity情報を流す

    public partial class ECSPlayerInput : SystemBase
    {
        public Observable<CitizenInfoData> onShowInfo => showInfoSubject;
        private Subject<CitizenInfoData> showInfoSubject = new Subject<CitizenInfoData>();
        
        ComponentLookup<CitizenBase> CitizenLookup;
        
        ~中略~

        protected override void OnUpdate()
        {
            CitizenLookup = SystemAPI.GetComponentLookup<CitizenBase>();
        }

        public void ClickRaycast(Vector3 inputOrigin, Vector3 inputDirection)
        {

            ~中略~

            if (physics.CastRay(input, out var hit))
            {
                var name = this.EntityManager.GetName(hit.Entity);
                showInfoSubject.OnNext(new CitizenInfoData
                {
                    pocketMoney = CitizenLookup[hit.Entity].pocketMoney,
                    appetite = CitizenLookup[hit.Entity].appetite
                });
                Debug.Log(name);
            }
        }
    }
}

ComponentLookupでRayがヒットしたEntityのコンポーネントを取得。
取得した情報をUIに流し込むためのObservableに渡しています。

ECSとUIToolkitをつなぐ

public class UIManager : MonoBehaviour
{
    [SerializeField] 
    private SelectEntityInfoView selectEntityInfoView;
    private ECSPlayerInput ecsPlayerInput;
    
    void Start()
    {
        var world = World.DefaultGameObjectInjectionWorld;
        ecsPlayerInput = world.GetExistingSystemManaged<ECSPlayerInput>();

        ecsPlayerInput.onShowInfo.Subscribe(data=>
        {
            selectEntityInfoView.ChangeView(data);
        }).AddTo(this);
    }
}

Entityの情報が流れてきたらUIに流すクラス。

UI Toolkit

public class SelectEntityInfoView : MonoBehaviour
{
    private VisualElement root;
    void Start()
    {
        root = GetComponent<UIDocument>().rootVisualElement;
    }

    public void ChangeView(CitizenInfoData citizenBase)
    {
        root.Q<Label>("pocketMoney").text = citizenBase.pocketMoney.ToString();
        root.Q<Label>("appetite").text = citizenBase.appetite.ToString();
    }
}

送られてきたデータをUIに表示する処理

完成