using System.Collections; using System.Collections.Generic; using UnityEngine; namespace BNG { /// <summary> /// Controls collision state of Hand Model. /// </summary> public class HandCollision : MonoBehaviour { /// <summary> /// Used to determine if pointing or gripping /// </summary> public HandController HandControl; /// <summary> /// Used to determine if Grabbing something /// </summary> public Grabber HandGrabber; /// <summary> /// If false we will not check for Hand Collision at all /// </summary> public bool EnableHandCollision = true; /// <summary> /// Should we enable hand colliders when pointing /// </summary> public bool EnableCollisionOnPoint = true; /// <summary> /// Should we enable hand colliders when making a fist /// </summary> public bool EnableCollisionOnFist = true; /// <summary> /// Should we enable hand colliders at all times (still respects EnableCollisionDuringGrab) /// </summary> public bool EnableCollisionOnAllPoses = false; /// <summary> /// Set to false to Disable Hand Colliders during grab or remote grab /// </summary> public bool EnableCollisionDuringGrab = false; public float PointAmount; public float GripAmount; public bool MakingFist; // Colliders to keep track of List<Collider> handColliders; void Start() { handColliders = new List<Collider>(); var tempColliders = GetComponentsInChildren<Collider>(true); // Only accept non-trigger colliders. foreach(var c in tempColliders) { if(!c.isTrigger) { handColliders.Add(c); } } } void Update() { if(!EnableHandCollision) { return; } bool grabbing = HandGrabber != null && HandGrabber.HoldingItem; bool makingFist = HandControl != null && HandControl.GripAmount > 0.9f && (HandControl.PointAmount < 0.1 || HandControl.PointAmount > 1); MakingFist = makingFist; PointAmount = HandControl != null ? HandControl.PointAmount : 0; GripAmount = HandControl != null ? HandControl.GripAmount : 0; bool pointing = HandControl != null && HandControl.PointAmount > 0.9f && HandControl.GripAmount > 0.9f; for (int x = 0; x < handColliders.Count; x++) { Collider col = handColliders[x]; // Immediately disable collider if no collision on grab if (EnableCollisionDuringGrab == false && grabbing) { col.enabled = false; continue; } // Immediately disable collider if we just released an item. // This is so we don't enable the collider right when we are trying to drop something if(HandGrabber != null && (Time.time - HandGrabber.LastDropTime < 0.5f )) { col.enabled = false; continue; } bool enableCollider = false; if (EnableCollisionDuringGrab && grabbing) { enableCollider = true; } else if (EnableCollisionOnPoint && pointing) { enableCollider = true; } else if (EnableCollisionOnFist && makingFist) { enableCollider = true; } else if (EnableCollisionOnAllPoses) { enableCollider = true; } col.enabled = enableCollider; } } } }