using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Cysharp.Threading.Tasks; using DG.Tweening; using Stary.Evo; using Stary.Evo.AudioCore; using Stary.Evo.RKTools; using UnityEngine; using YooAsset; namespace Main { public interface IClickSystem : ISystem { void AddClickIntervalEvent(Action callback); void StartTime(); void EndClick(); void ResumeTouchClick(Transform tweenTarget); Task BindClickEvent(List clickElementChildrens, Action callback, bool isOneByOne = false); void ClickBreatheTween(List tweenList, Transform tweenTarget); void ClickBreatheTween(List tweenList, Transform tweenTarget, bool isOneByOne); int ElementChildrenClickCount(); bool IsElementChildrenClick(); } public class ClickSystem : AbstractSystem, IClickSystem { // public Sequence loopTargetTween; private AudioClip _clickSound; /// /// 点击计时器 /// public float time; private CancellationTokenSource tokenSource; private List clickElementChildrens; private Action ClickIntervalEvent; protected override void OnInit() { } public void StartTime() { time = 0; Update(); } public async Task BindClickEvent(List clickElementChildrens, Action callback, bool isOneByOne = false) { StartTime(); this.clickElementChildrens = clickElementChildrens; //绑定点击事件 for (int i = 0; i < clickElementChildrens.Count; i++) { clickElementChildrens[i].transform.gameObject.ObjectAddTouchEvent(callback); if (isOneByOne && i > 0) { clickElementChildrens[i].transform.gameObject.ObjectPauseTouchEvent(); } } //播放音效 var package = YooAssets.GetPackage("Main"); var sfxhandle = package.LoadAssetAsync("Audios_au_effect_click"); await sfxhandle.Task; _clickSound = sfxhandle.GetAssetObject(); } public void ClickBreatheTween(List tweenList, Transform tweenTarget) { Debug.Log("UnityEvo: 点击呼吸"); AudioCoreManager.PlaySFX(new AudioData() { clip = _clickSound }); time = 0; foreach (var tween in tweenList) { tween.transform.gameObject.ObjectResumeTouchEvent(); // if (tween.transform == tweenTarget) // { // tween.isClick = true; // } if (tween.transform == tweenTarget) { tween.isClick = true; tween.transform.GetComponent().CrossFade("dianji_idle", 0.01f); this.SendEvent(ModeType.PLayAudioOrVideo, tween); tweenTarget.gameObject.ObjectPauseTouchEvent(); continue; } tween.transform.GetComponent().CrossFade("dianji_nood", 0.01f); } } public void ClickBreatheTween(List tweenList, Transform tweenTarget,bool isOneByOne) { Debug.Log("UnityEvo: 点击呼吸"); AudioCoreManager.PlaySFX(new AudioData() { clip = _clickSound }); time = 0; for (int i = 0; i < tweenList.Count; i++) { var tween = tweenList[i]; // if (tween.transform == tweenTarget) // { // tween.isClick = true; // } if (tween.transform == tweenTarget) { tween.isClick = true; tween.transform.gameObject.ObjectPauseTouchEvent(); tween.transform.GetComponent().CrossFade("dianji_disappear", 0.01f); this.SendEvent(ModeType.PLayAudioOrVideo, tween); if (isOneByOne&& i+1 < tweenList.Count) { tweenList[i+1].transform.gameObject.ObjectResumeTouchEvent(); } } } } public void AddClickIntervalEvent(Action callback) { this.ClickIntervalEvent = callback; } public int ElementChildrenClickCount() { int count = 0; //是否全部已经点击 for (int i = 0; i < clickElementChildrens.Count; i++) { if (clickElementChildrens[i].isClick == true) { count++; } } return count; } public bool IsElementChildrenClick() { //是否全部已经点击 for (int i = 0; i < clickElementChildrens.Count; i++) { if (clickElementChildrens[i].isClick == false) { return false; } } return true; } public void ResumeTouchClick( Transform tweenTarget) { // if (loopTargetTween != null) // { // loopTargetTween.Kill(); // loopTargetTween = null; // } time = 0; if (tokenSource != null) { tokenSource?.Cancel(); tokenSource?.Dispose(); tokenSource = null; } foreach (var children in clickElementChildrens) { if (children.transform != tweenTarget ) { var animator = children.transform.GetComponent(); // 获取当前动画状态 var currentState = animator.GetCurrentAnimatorStateInfo(0); if (currentState.IsName("dianji_disappear")) { children.transform.gameObject.ObjectResumeTouchEvent(); animator.CrossFade("dianji_appear", 0.01f); } } } } public void EndClick() { // if (loopTargetTween != null) // { // loopTargetTween.Kill(); // loopTargetTween = null; // } time = 0; if (tokenSource != null) { tokenSource?.Cancel(); tokenSource?.Dispose(); tokenSource = null; } foreach (var children in clickElementChildrens) { children.transform.gameObject.ObjectRemoveTouchEvent(); children.transform.GetComponent().CrossFade("dianji_disappear", 0.01f); } } private async void Update() { //TODO暂时禁用 if (tokenSource != null) { tokenSource?.Cancel(); } tokenSource = new CancellationTokenSource(); try { while (time <= 15 && !tokenSource.IsCancellationRequested) { time += Time.deltaTime; if (time >= 15) { Debug.Log("UnityEvo:执行未点击间隔事件"); time = 0; ClickIntervalEvent?.Invoke(); } await UniTask.Yield(tokenSource.Token); } } catch (OperationCanceledException e) { Debug.Log("UnityEvo: 取消任务:" + e); } } public override void Dispose() { if (tokenSource != null) { tokenSource?.Cancel(); tokenSource?.Dispose(); tokenSource = null; } // if (loopTargetTween != null) // { // loopTargetTween.Kill(); // loopTargetTween = null; // } } } public class ClickElementChildren { public bool isClick = false; public string[] auid; public string vid; public Transform transform; public Transform targetTransform; public ClickElementChildren(Transform child) { this.transform = child; } public ClickElementChildren(Transform child, string[] auid, string vid) { this.auid = auid; this.vid = vid; this.transform = child; } public ClickElementChildren(Transform child, Transform targetTransform, string[] auid, string vid) { this.auid = auid; this.vid = vid; this.transform = child; this.targetTransform = targetTransform; } } }