using System.Collections; using System.Collections.Generic; using UnityEngine; using ChivaXR; using Sirenix.OdinInspector; using System; public class AniDriver_SetUnityAnimationPose : AnimationDriverBase { public Animation animation; [ValueDropdown("GetAllAnimationNames")] public string aniName; public float initNormalize = 0; public float finishedNormalize = 1; public float speed = 1; public bool isPlay = false; public override void FinishedState() { AnimationToolkit.SetAnimationNormalizedToPose(animation, aniName, finishedNormalize); } public override void InitState() { AnimationToolkit.SetAnimationNormalizedToPose(animation, aniName, initNormalize); } public override void StartPlay(Action finishedCallBack = null) { if (isPlay) { AnimationToolkit.SetAnimationNormalizedToPlay(animation, aniName, initNormalize, speed); float waitTime = 0; AnimationState _aniState = animation[aniName]; if (speed == 0) { waitTime = 0; } else if (speed > 0) { waitTime = (1 - initNormalize) * _aniState.length / speed; } else { waitTime = (initNormalize) * _aniState.length / Mathf.Abs(speed); } SetIEnumeratorActionCallBackByTime(finishedCallBack, waitTime); } else { AnimationToolkit.SetAnimationNormalizedToPose(animation, aniName, finishedNormalize); finishedCallBack?.Invoke(); } } private IEnumerable GetAllAnimationNames() { List item = new List(); if (animation != null) { foreach (AnimationState state in animation) { item.Add(new ValueDropdownItem(state.name, state.name)); } } return item; } /// /// 协程等待时间执行委托 /// /// /// public static void SetIEnumeratorActionCallBackByTime(Action callBack, float time) { AnimationCoroutine.Instance.StartCoroutine(UnityAcitionCallBackByTime(callBack, time)); //ChivaTech.ChivaUtils.Singletons.Coroutine.Instance.StartCoroutine(UnityAcitionCallBackByTime(callBack, time)); } static IEnumerator UnityAcitionCallBackByTime(Action callBack, float time) { yield return new WaitForSeconds(time); callBack?.Invoke(); } }