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