improved door grabbing. Sometimes leaves ghost hands.
This commit is contained in:
108
Assets/_PROJECT/Models/DoorHandReplacer.cs
Normal file
108
Assets/_PROJECT/Models/DoorHandReplacer.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
using _PROJECT.NewHandPresence;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public enum GrabbingHand
|
||||
{
|
||||
Right,
|
||||
Left
|
||||
}
|
||||
|
||||
public class DoorHandReplacer : MonoBehaviour
|
||||
{
|
||||
public GameObject LeftHand;
|
||||
public GameObject RightHand;
|
||||
|
||||
private GrabbingHand? hand = null; // nullable
|
||||
private SmartHandPresence currentHand = null;
|
||||
private bool isGrabbing;
|
||||
|
||||
// Tracks all hands currently inside the trigger
|
||||
private HashSet<SmartHandPresence> handsInTrigger = new HashSet<SmartHandPresence>();
|
||||
|
||||
public void ManifestDoorHand()
|
||||
{
|
||||
if (currentHand == null || hand == null) return;
|
||||
isGrabbing = true;
|
||||
switch (hand.Value)
|
||||
{
|
||||
case GrabbingHand.Left:
|
||||
RightHand.SetActive(false);
|
||||
LeftHand.SetActive(true);
|
||||
Debug.Log("Dissapearing hand");
|
||||
break;
|
||||
|
||||
case GrabbingHand.Right:
|
||||
LeftHand.SetActive(false);
|
||||
RightHand.SetActive(true);
|
||||
Debug.Log("Dissapearing hand");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void DeManifestDoorHand()
|
||||
{
|
||||
isGrabbing = false;
|
||||
LeftHand.SetActive(false);
|
||||
RightHand.SetActive(false);
|
||||
if (currentHand == null) return;
|
||||
}
|
||||
|
||||
private void OnTriggerEnter(Collider other)
|
||||
{
|
||||
if (isGrabbing) return;
|
||||
|
||||
// IMPORTANT: in case hands have multiple colliders
|
||||
SmartHandPresence playerHand = other.GetComponentInParent<SmartHandPresence>();
|
||||
if (playerHand == null) return;
|
||||
|
||||
handsInTrigger.Add(playerHand);
|
||||
|
||||
currentHand = playerHand;
|
||||
|
||||
string name = playerHand.gameObject.name;
|
||||
|
||||
if (name.Contains("left", System.StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
hand = GrabbingHand.Left;
|
||||
}
|
||||
else if (name.Contains("right", System.StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
hand = GrabbingHand.Right;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTriggerExit(Collider other)
|
||||
{
|
||||
if (isGrabbing) return;
|
||||
|
||||
SmartHandPresence playerHand = other.GetComponentInParent<SmartHandPresence>();
|
||||
if (playerHand == null) return;
|
||||
|
||||
handsInTrigger.Remove(playerHand);
|
||||
|
||||
// If no hands remain, clear everything
|
||||
if (handsInTrigger.Count == 0)
|
||||
{
|
||||
currentHand = null;
|
||||
hand = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Pick any remaining hand as current
|
||||
foreach (var remainingHand in handsInTrigger)
|
||||
{
|
||||
currentHand = remainingHand;
|
||||
|
||||
string name = remainingHand.gameObject.name;
|
||||
hand = name.Contains("left", System.StringComparison.OrdinalIgnoreCase)
|
||||
? GrabbingHand.Left
|
||||
: GrabbingHand.Right;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user