LaboratoryProtection/Assets/UnityTest/Common/Scripts/Object/ObjectItem.cs

90 lines
2.6 KiB
C#
Raw Normal View History

2023-09-12 15:55:51 +08:00
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<bool> 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<ObjectItem>().First(_ => _.name == name);
await item.WaitClickHighlightAsync(cancellationToken);
}
public static async UniTask WaitHighlightPlayerTo(this BaseBehaviour baseBehaviour, string name, CancellationToken cancellationToken)
{
var item = IoC.GetInstance<ObjectItem>().First(_ => _.name == name);
var player = IoC.GetSingleton<FirstPersonLogic>();
var collider = item.GetComponentInChildren<Collider>(true);
item.OnHightlight();
await collider.GetAsyncTriggerEnterTrigger()
.FirstAsync(_ => _.tag == "Player")
.SuppressCancellationThrow();
item.OffHightlight();
}
}