どうも、土鍋です。
前回の記事の続きからで、取得したオブジェクトの情報をUIToolkitのUIに表示する方法を解説します。
実装
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に表示する処理
完成
