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, Guid id, List tags, BaseElement targetObject, BaseElement lookAtTarget, FlexibleBool enabling) { LookAt look = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); look.Initialize(elementName, id, tags); look.targetObject = targetObject; look.lookAtObject = lookAtTarget; look.enabling = enabling; look.animationReturnType = FlexibleReturnType.Before; if (targetObject.transformSubmodule != null) { look.targetTransformSubmodule = targetObject.transformSubmodule; } else { throw new System.Exception("Target object does not have a TransformSubmodule"); } look.SetParent(targetObject); look.timeDurationSubmodule.SetDuration(-999f, 999f); //TODO: 换为(-delay, songLength) return look; } 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; } } } }