62 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace UnityEngine.XR.Content.UI.Layout
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Makes this object face a target smoothly and along specific axes
 | |
|     /// </summary>
 | |
|     public class TurnToFace : MonoBehaviour
 | |
|     {
 | |
| #pragma warning disable 649
 | |
|         [SerializeField, Tooltip("Target to face towards. If not set, this will default to the main camera")]
 | |
|         Transform m_FaceTarget;
 | |
| 
 | |
|         [SerializeField, Tooltip("Speed to turn")]
 | |
|         float m_TurnToFaceSpeed = 5f;
 | |
| 
 | |
|         [SerializeField, Tooltip("Local rotation offset")]
 | |
|         Vector3 m_RotationOffset = Vector3.zero;
 | |
| 
 | |
|         [SerializeField, Tooltip("If enabled, ignore the x axis when rotating")]
 | |
|         bool m_IgnoreX;
 | |
| 
 | |
|         [SerializeField, Tooltip("If enabled, ignore the y axis when rotating")]
 | |
|         bool m_IgnoreY;
 | |
| 
 | |
|         [SerializeField, Tooltip("If enabled, ignore the z axis when rotating")]
 | |
|         bool m_IgnoreZ;
 | |
| #pragma warning restore 649
 | |
| 
 | |
|         void Awake()
 | |
|         {
 | |
|             // Default to main camera
 | |
|             if (m_FaceTarget == null)
 | |
|                 if (Camera.main != null)
 | |
|                     m_FaceTarget = Camera.main.transform;
 | |
|         }
 | |
| 
 | |
|         void Update()
 | |
|         {
 | |
|             if (m_FaceTarget != null)
 | |
|             {
 | |
|                 var facePosition = m_FaceTarget.position;
 | |
|                 var forward = facePosition - transform.position;
 | |
|                 var targetRotation = forward.sqrMagnitude > float.Epsilon ? Quaternion.LookRotation(forward, Vector3.up) : Quaternion.identity;
 | |
|                 targetRotation *= Quaternion.Euler(m_RotationOffset);
 | |
|                 if (m_IgnoreX || m_IgnoreY || m_IgnoreZ)
 | |
|                 {
 | |
|                     var targetEuler = targetRotation.eulerAngles;
 | |
|                     var currentEuler = transform.rotation.eulerAngles;
 | |
|                     targetRotation = Quaternion.Euler
 | |
|                         (
 | |
|                             m_IgnoreX ? currentEuler.x : targetEuler.x,
 | |
|                             m_IgnoreY ? currentEuler.y : targetEuler.y,
 | |
|                             m_IgnoreZ ? currentEuler.z : targetEuler.z
 | |
|                         );
 | |
|                 }
 | |
| 
 | |
|                 var ease = 1f - Mathf.Exp(-m_TurnToFaceSpeed * Time.unscaledDeltaTime);
 | |
|                 transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, ease);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |