Add ultimate xr

This commit is contained in:
2024-08-06 21:58:35 +02:00
parent 864033bf10
commit 7165bacd9d
3952 changed files with 2162037 additions and 35 deletions

View File

@@ -0,0 +1,94 @@
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="UxrAlignOnRelease.cs" company="VRMADA">
// Copyright (c) VRMADA, All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using System.Collections.Generic;
using UltimateXR.Animation.Interpolation;
using UltimateXR.Core.Components;
using UnityEngine;
namespace UltimateXR.Manipulation.Helpers
{
/// <summary>
/// Aligns an object smoothly whenever it is released to keep it leveled. Should be used on non physics-driven
/// grabbable objects, which remain floating in the air when being released.
/// </summary>
public class UxrAlignOnRelease : UxrComponent
{
#region Inspector Properties/Serialized Fields
[SerializeField] private bool _onlyLevel = true;
[SerializeField] [Range(0.0f, 1.0f)] private float _smoothFactor = 0.2f;
[SerializeField] private List<UxrGrabbableObject> _grabbableObjects;
#endregion
#region Unity
/// <summary>
/// Caches the transform component.
/// </summary>
protected override void Awake()
{
base.Awake();
_selfTransform = transform;
}
/// <summary>
/// Updates the transform while the object is not being grabbed.
/// </summary>
private void Update()
{
if (!IsBeingGrabbed)
{
// Smoothly rotate towards horizontal orientation when not being grabbed
if (_onlyLevel == false)
{
_selfTransform.rotation = UxrInterpolator.SmoothDampRotation(_selfTransform.rotation, Quaternion.FromToRotation(_selfTransform.up, Vector3.up) * _selfTransform.rotation, _smoothFactor);
}
else
{
Vector3 projectedRight = Vector3.ProjectOnPlane(transform.right, Vector3.up);
Quaternion targetRotation = Quaternion.FromToRotation(_selfTransform.right, projectedRight) * _selfTransform.rotation;
if ((targetRotation * Vector3.up).y < 0.0f)
{
targetRotation = targetRotation * Quaternion.AngleAxis(180.0f, Vector3.forward);
}
_selfTransform.rotation = UxrInterpolator.SmoothDampRotation(_selfTransform.rotation, targetRotation, _smoothFactor);
}
}
}
#endregion
#region Private Types & Data
/// <summary>
/// Gets whether the object is being grabbed using any of the registered grabbable objects.
/// </summary>
private bool IsBeingGrabbed
{
get
{
foreach (UxrGrabbableObject grabbableObject in _grabbableObjects)
{
if (UxrGrabManager.Instance.IsBeingGrabbed(grabbableObject))
{
return true;
}
}
return false;
}
}
private Transform _selfTransform;
#endregion
}
}