Files
Master-Arbeit-Tom-Hempel/Unity-Master/Assets/Convai/ConvaiXR/Scripts/XRFixedUIPositionHandler.cs
2025-09-21 22:42:26 +02:00

94 lines
3.0 KiB
C#

using UnityEngine;
/// <summary>
/// Manages the UI element's position and rotation in a XR environment
/// so that it maintains a fixed position relative to the player camera.
/// </summary>
public class XRFixedUIPositionHandler : MonoBehaviour
{
// Offset from the camera's position
[SerializeField] private Vector3 _offset;
// Speed of the interpolation for smooth movement
[SerializeField] private float lerpSpeed;
// Whether the UI is allowed to move along the X axis
[SerializeField] private bool allowXMovement = true;
// Whether the UI is allowed to move along the Y axis
[SerializeField] private bool allowYMovement = true;
// Whether the UI is allowed to move along the Z axis
[SerializeField] private bool allowZMovement = true;
// Reference to the main camera
private Camera playerCamera;
/// <summary>
/// Initializes the reference to the main camera.
/// </summary>
private void Awake()
{
playerCamera = Camera.main;
}
/// <summary>
/// Updates the UI's position and rotation each frame.
/// </summary>
private void LateUpdate()
{
UpdateUIPosition();
}
/// <summary>
/// Calculates the target position for the UI element and smoothly moves it to that position.
/// </summary>
private void UpdateUIPosition()
{
Vector3 targetPosition = CalculateTargetPosition();
transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * lerpSpeed);
UpdateUIRotation();
}
/// <summary>
/// Calculates the target position of the UI element relative to the player's camera.
/// </summary>
/// <returns>The calculated target position.</returns>
private Vector3 CalculateTargetPosition()
{
Vector3 targetOffset = CalculateTargetOffset();
Vector3 targetPosition = playerCamera.transform.position + targetOffset;
// Apply fixed offsets if movement is not allowed
if (!allowXMovement) targetPosition.x = _offset.x;
if (!allowYMovement) targetPosition.y = _offset.y;
if (!allowZMovement) targetPosition.z = _offset.z;
return targetPosition;
}
/// <summary>
/// Calculates the offset vector based on the allowed movement directions.
/// </summary>
/// <returns>The calculated offset vector.</returns>
private Vector3 CalculateTargetOffset()
{
Vector3 targetOffset = Vector3.zero;
if (allowXMovement)
targetOffset += _offset.x * playerCamera.transform.right;
if (allowYMovement)
targetOffset += _offset.y * playerCamera.transform.up;
if (allowZMovement)
targetOffset += _offset.z * playerCamera.transform.forward;
return targetOffset;
}
/// <summary>
/// Updates the rotation of the UI element to face the camera.
/// </summary>
private void UpdateUIRotation()
{
Vector3 direction = transform.position - playerCamera.transform.position;
transform.rotation = Quaternion.LookRotation(direction);
}
}