using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; using XericLibrary.Runtime.Type; namespace XericLibrary { /// /// 看向某物 /// public class LookAtSomething : WeaklyMonoBase { #region 字段属性 /// /// 看向目标的名称 /// public string lookAtTargetName = ""; /// /// 看向的目标 /// [SerializeField] private Transform lookAtTarget = null; /// /// 设定看向的目标 /// public Transform LookAtTarget { get => lookAtTarget; set { lookAtTarget = value; targetValid = lookAtTarget != null; } } /// /// 反转看向轴 /// public bool ReversLookVector = false; /// /// 看向的轴 /// public Vector3 LookAtVector = Vector3.forward; /// /// 启用旋转的轴 /// public Vector3 UseableRotateVector = Vector3.one; /// /// 旋转角速度 /// public float RotateSpeed = 1; /// /// 看向的目标有效 /// private bool targetValid = true; #endregion #region 生命周期 private void Awake() { if(lookAtTarget == null && lookAtTargetName != null && lookAtTargetName != "") { lookAtTarget = GameObject.Find(lookAtTargetName)?.transform; } } public void OnEnable() { targetValid = lookAtTarget != null; } public void Update() { if(!targetValid) return; var lookvec = ReversLookVector ? transform.position - lookAtTarget.position: lookAtTarget.position - transform.position; Quaternion targetRotation = Quaternion.LookRotation(lookvec, LookAtVector); // 使用 slerp 插值平滑旋转 float step = RotateSpeed * Time.deltaTime; transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, step); } #endregion } }