90 lines
2.6 KiB
C#
90 lines
2.6 KiB
C#
|
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();
|
||
|
}
|
||
|
}
|