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
}
}