using UnityEngine; namespace Funique { /// /// Facing direction reflection
/// Dynamically copy a rotation to another object
/// This could apply offset, multiple with eularangle, and with ignore direction flag
/// ------------------------------------------------
/// 面向方向映射
/// 動態的映射一個物件的旋轉至另一個物件
/// 可以套用位移, 乘積到歐拉角, 還有忽略座標軸 ///
[AddComponentMenu("Funique/Core/Dynamic Direction")] public class DynamicDirection : MonoBehaviour { // 欄位 #region Field [SerializeField] Transform Player; [SerializeField] Transform Center; [SerializeField] Transform Target; [SerializeField] Vector3 Offset; [SerializeField] Vector3 Multiple = Vector3.one; [SerializeField] DirectionFlag Ignore; Vector3 dir; Quaternion qb; #endregion // 屬性 #region Property /// /// A vector that player pointing to center
/// ------------------------------------------------
/// 玩家指向中心的向量 ///
public Vector3 Dir => dir; /// /// The quaternion of the direction vector
/// ------------------------------------------------
/// 方向向量的四元數換算 ///
public Quaternion QB => qb; #endregion // Unity 事件 #region Unity Event private void Update() { if (Player == null || Center == null || Target == null) return; dir = (Center.position - Player.position).normalized; if (Ignore.HasFlag(DirectionFlag.X)) dir.x = 0; if (Ignore.HasFlag(DirectionFlag.Y)) dir.y = 0; if (Ignore.HasFlag(DirectionFlag.Z)) dir.z = 0; dir = new Vector3(dir.x * Multiple.x, dir.y * Multiple.y, dir.z * Multiple.z); qb = Quaternion.LookRotation(dir); Target.rotation = qb; Target.localEulerAngles += Offset; } #endregion } }