summaryrefslogtreecommitdiff
path: root/Assets/Samples/XR Interaction Toolkit/3.1.2/Hands Interaction Demo/HandsDemoSceneAssets/Scripts/ObjectResetPlane.cs
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-07-02 08:46:23 -0700
committerpryazha <pryadeiniv@mail.ru>2025-07-02 08:46:23 -0700
commit8263edd59284aba390aca011d25b79efecef4c48 (patch)
tree6346e2afaaabd32156601cafaf20d4ee813befaf /Assets/Samples/XR Interaction Toolkit/3.1.2/Hands Interaction Demo/HandsDemoSceneAssets/Scripts/ObjectResetPlane.cs
Diffstat (limited to 'Assets/Samples/XR Interaction Toolkit/3.1.2/Hands Interaction Demo/HandsDemoSceneAssets/Scripts/ObjectResetPlane.cs')
-rw-r--r--Assets/Samples/XR Interaction Toolkit/3.1.2/Hands Interaction Demo/HandsDemoSceneAssets/Scripts/ObjectResetPlane.cs96
1 files changed, 96 insertions, 0 deletions
diff --git a/Assets/Samples/XR Interaction Toolkit/3.1.2/Hands Interaction Demo/HandsDemoSceneAssets/Scripts/ObjectResetPlane.cs b/Assets/Samples/XR Interaction Toolkit/3.1.2/Hands Interaction Demo/HandsDemoSceneAssets/Scripts/ObjectResetPlane.cs
new file mode 100644
index 0000000..68f2817
--- /dev/null
+++ b/Assets/Samples/XR Interaction Toolkit/3.1.2/Hands Interaction Demo/HandsDemoSceneAssets/Scripts/ObjectResetPlane.cs
@@ -0,0 +1,96 @@
+using System.Collections;
+using System.Collections.Generic;
+
+namespace UnityEngine.XR.Interaction.Toolkit.Samples.Hands
+{
+ /// <summary>
+ /// Provides the ability to reset specified objects if they fall below a certain position - designated by this transform's height.
+ /// </summary>
+ public class ObjectResetPlane : MonoBehaviour
+ {
+ [SerializeField]
+ [Tooltip("Which objects to reset if falling out of range.")]
+ List<Transform> m_ObjectsToReset = new List<Transform>();
+
+ [SerializeField]
+ [Tooltip("How often to check if objects should be reset.")]
+ float m_CheckDuration = 2f;
+
+ [SerializeField]
+ [Tooltip("The object root used to compute local positions relative to. Objects will respawn relative to their position in this transform's hierarchy.")]
+ Transform m_ObjectRoot = null;
+
+ readonly List<Pose> m_OriginalPositions = new List<Pose>();
+
+ float m_CheckTimer;
+
+ /// <summary>
+ /// See <see cref="MonoBehaviour"/>.
+ /// </summary>
+ protected void Start()
+ {
+ foreach (var currentTransform in m_ObjectsToReset)
+ {
+ if (currentTransform != null)
+ {
+ var position = currentTransform.position;
+
+ if (m_ObjectRoot != null)
+ position = m_ObjectRoot.InverseTransformPoint(currentTransform.position);
+
+ m_OriginalPositions.Add(new Pose(position, currentTransform.rotation));
+ }
+ else
+ {
+ Debug.LogWarning("Objects To Reset contained a null element. Update the reference or delete the array element of the missing object.", this);
+ m_OriginalPositions.Add(new Pose());
+ }
+ }
+ }
+
+ /// <summary>
+ /// See <see cref="MonoBehaviour"/>.
+ /// </summary>
+ protected void Update()
+ {
+ m_CheckTimer -= Time.deltaTime;
+
+ if (m_CheckTimer > 0)
+ return;
+
+ m_CheckTimer = m_CheckDuration;
+
+ var resetPlane = transform.position.y;
+
+ for (var transformIndex = 0; transformIndex < m_ObjectsToReset.Count; transformIndex++)
+ {
+ var currentTransform = m_ObjectsToReset[transformIndex];
+ if (currentTransform == null)
+ continue;
+
+ if (currentTransform.position.y < resetPlane)
+ {
+ var originalWorldPosition = m_OriginalPositions[transformIndex].position;
+ if (m_ObjectRoot != null)
+ originalWorldPosition = m_ObjectRoot.TransformPoint(originalWorldPosition);
+
+ currentTransform.SetPositionAndRotation(originalWorldPosition, m_OriginalPositions[transformIndex].rotation);
+
+ var rigidBody = currentTransform.GetComponentInChildren<Rigidbody>();
+ if (rigidBody != null)
+ {
+ StartCoroutine(ResetRigidbodyRoutine(rigidBody));
+ }
+ }
+ }
+ }
+
+ IEnumerator ResetRigidbodyRoutine(Rigidbody body)
+ {
+ body.isKinematic = true;
+ yield return new WaitForFixedUpdate();
+ body.isKinematic = false;
+
+ }
+ }
+}