AniDriver_RotateBySelf.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using ChivaXR;
  5. using DG.Tweening;
  6. using System;
  7. public class AniDriver_RotateBySelf : AnimationDriverBase
  8. {
  9. public Transform target;
  10. public Axis axis;
  11. public Vector3 initAngle;
  12. public Vector3 targetAngle;
  13. public float duration;
  14. public override void FinishedState()
  15. {
  16. target.DOKill();
  17. target.transform.localEulerAngles = targetAngle;
  18. }
  19. public override void InitState()
  20. {
  21. target.DOKill();
  22. target.transform.localEulerAngles = initAngle;
  23. }
  24. public override void StartPlay(Action finishedCallBack = null)
  25. {
  26. target.DOLocalRotateQuaternion(Quaternion.Euler(targetAngle.x, targetAngle.y, targetAngle.z), duration).OnComplete(() => finishedCallBack?.Invoke());
  27. //StartAniCoroutine(RotateBySelf(finishedCallBack));
  28. }
  29. /// <summary>
  30. /// 根据路径点移动
  31. /// </summary>
  32. /// <param name="points"></param>
  33. /// <param name="moveObj"></param>
  34. /// <param name="moveSpeed"></param>
  35. /// <param name="rotateSpeed"></param>
  36. /// <returns></returns>
  37. IEnumerator RotateBySelf(Action finishedCallBack = null)
  38. {
  39. bool moveToTarget = false;
  40. float timer = 0;
  41. float lerp = 0;
  42. //初始角度
  43. Quaternion tmpInitQuaternion = target.rotation;
  44. Quaternion tmpTargetQuaternion = new Quaternion(targetAngle.x, targetAngle.y, targetAngle.z, 0);
  45. while (!moveToTarget)
  46. {
  47. target.transform.rotation = Quaternion.Lerp(tmpInitQuaternion, tmpTargetQuaternion, lerp);
  48. if (Quaternion.Angle(target.transform.rotation, tmpTargetQuaternion) < 5)
  49. {
  50. target.transform.rotation = tmpTargetQuaternion;
  51. moveToTarget = true;
  52. }
  53. timer += Time.deltaTime;
  54. lerp = timer / duration;
  55. yield return new WaitForEndOfFrame();
  56. }
  57. Debug.Log("MoveEnd is true");
  58. finishedCallBack?.Invoke();
  59. }
  60. }