using UnityEngine; namespace Funique { /// /// Degree of freedom behaviour
/// ------------------------------------------------
/// 自由角 行為 ///
[AddComponentMenu("Funique/Core/DOF")] public class DOF : MonoBehaviour { // 變數 #region Field [SerializeField] Transform HeadsetTransform; [SerializeField] public float Scale = 1.5f; [SerializeField] public float Len; [SerializeField] public bool Resize; [SerializeField] public bool DebugSwitch; [SerializeField] public bool IslookAtHeadset; public float dis { private set; get; } float sixDoflimit = 1.74f; float min = 1.7f; #endregion // Unity 事件 #region Unity Event private void Start() { //headsetTransform = Singleton
.Instance.HeadSet.transform; } private void Update() { //Len = Singleton
.Instance.XRManager.Len; Fade(); if (Resize) { ScaleByDistance(); if (IslookAtHeadset) { LookAtHeadset(); } } } #endregion // 功能 #region Utility private void LookAtHeadset() { transform.LookAt(HeadsetTransform); transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y - 90f, transform.eulerAngles.z); } private void Fade() { float num = Vector3.Distance(transform.position - transform.right * transform.localScale.x, HeadsetTransform.transform.position); if (num < sixDoflimit) { Color color = GetComponent().material.color; float a = MinMax(num, sixDoflimit, min, 1f, 0f); GetComponent().material.color = new Color(color.r, color.g, color.b, a); } else { GetComponent().material.color = Color.white; } } public float MinMax(float x, float max, float min, float new_max, float new_min) { x = (x - min) / (max - min); x *= new_max - new_min; x += new_min; return x; } private void ScaleByDistance() { if (DebugSwitch) { MonoBehaviour.print(Vector3.Distance(HeadsetTransform.transform.position, transform.position)); } dis = Mathf.Lerp(Scale + 1f, 1f, Vector3.Distance(HeadsetTransform.transform.position, transform.position) / Len); if (Vector3.Distance(HeadsetTransform.transform.position, transform.position) > Len) { dis = Mathf.Max(0f, Mathf.Lerp(0f - Scale + 1f, 1f, Len / Vector3.Distance(HeadsetTransform.transform.position, transform.position))); } transform.localScale = new Vector3(dis, dis, dis); } #endregion } }