using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks.Linq; using Cysharp.Threading.Tasks.Triggers; using PMaker.Await; using PMaker.DependencyInjection; using PMaker.HighlightPlus; using PMaker.Set; using Sirenix.OdinInspector; using System.Collections.Generic; using System.Linq; using System.Threading; using UniRx; using UniRx.Triggers; using UnityEngine; public class ObjectItem : InstanceMonobehaviour { public bool ignoreObjectVisibility = false; public GameObject[] objects; public async UniTask WaitClickHighlightAsync(CancellationToken cancellationToken) { var source = new CancellationTokenSource(); source.AddTo(cancellationToken); foreach (var obj in objects) { obj.OnHightlight(ignoreObjectVisibility); } var list = objects.Select(_ => _.WaitClick(source.Token)).ToList(); //list.Add(UniTask.FromCanceled(cancellationToken)); var (IsCanceled, Result) = await UniTask.WhenAny(list).SuppressCancellationThrow(); Debug.Log(this.name + "Cancel!"); foreach (var obj in objects) { obj.OffHightlight(); } source.Cancel(); return IsCanceled; } public void OnHightlight() { foreach (var obj in objects) { obj.OnHightlight(); } } public void OffHightlight() { foreach (var obj in objects) { obj.OffHightlight(); } } #if UNITY_EDITOR [Button] [HideInEditorMode] private async UniTask WaitAsyncTest() { await this.WaitClickHighlightAsync(this.GetCancellationTokenOnDestroy()); } #endif } public static class BaseBehaviourExtensionObjectItem { public static async UniTask WaitItemHighlightClick(this BaseBehaviour baseBehaviour, string name, CancellationToken cancellationToken) { var item = IoC.GetInstance().First(_ => _.name == name); await item.WaitClickHighlightAsync(cancellationToken); } public static async UniTask WaitHighlightPlayerTo(this BaseBehaviour baseBehaviour, string name, CancellationToken cancellationToken) { var item = IoC.GetInstance().First(_ => _.name == name); var player = IoC.GetSingleton(); var collider = item.GetComponentInChildren(true); item.OnHightlight(); await collider.GetAsyncTriggerEnterTrigger() .FirstAsync(_ => _.tag == "Player") .SuppressCancellationThrow(); item.OffHightlight(); } }