using System; using System.Collections; using System.Collections.Generic; using Lean.Pool; using UnityEngine; using UnityEngine.Serialization; namespace Ichni.RhythmGame { /// /// 将物体的z轴指向目标物体,注意,LookAt的启用期间,物体的旋转将被锁定 /// public class LookAt : AnimationBase { public TransformSubmodule targetTransformSubmodule; public BaseElement lookAtObject; public FlexibleBool enabling; public static LookAt GenerateElement(string elementName, BaseElement targetObject, BaseElement lookAtTarget, FlexibleBool enabling) { LookAt swirl = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); swirl.NewInitialize(elementName, targetObject); swirl.lookAtObject = lookAtTarget; swirl.enabling = enabling; swirl.animationReturnType = FlexibleReturnType.Before; if (targetObject.transformSubmodule != null) { swirl.targetTransformSubmodule = targetObject.transformSubmodule; } else { throw new System.Exception("Target object does not have a TransformSubmodule"); } swirl.SetTimeDuration(-999, 999); //TODO: 换为(-delay, songLength) return swirl; } private void Start() { targetTransformSubmodule = targetObject.transformSubmodule; } protected override void UpdateAnimation(float songTime) { enabling.UpdateFlexibleBool(songTime); if (enabling.value) { animationReturnType = FlexibleReturnType.MiddleExecuting; Vector3 lookingDirection = (lookAtObject.transform.position - targetObject.transform.position).normalized; Vector3 eulerAnglesOffset = Quaternion.LookRotation(lookingDirection).eulerAngles; targetTransformSubmodule.eulerAnglesOffsetLock = true; targetTransformSubmodule.currentEulerAngles = eulerAnglesOffset; } else { animationReturnType = FlexibleReturnType.MiddleInterval; targetTransformSubmodule.eulerAnglesOffsetLock = false; } } } }