You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			193 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			193 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using UnityEngine.Events;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand{
							 | 
						||
| 
								 | 
							
								    public delegate void HandEvent(Hand hand);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public class HandTriggerAreaEvents : MonoBehaviour{
							 | 
						||
| 
								 | 
							
								        [Header("Trigger Events Settings")]
							 | 
						||
| 
								 | 
							
								        [Tooltip("Whether or not first hand to enter should take ownership and be the only one to call events")]
							 | 
						||
| 
								 | 
							
								        public bool oneHanded = true;
							 | 
						||
| 
								 | 
							
								        public HandType handType = HandType.both;
							 | 
						||
| 
								 | 
							
								        [Tooltip("Whether or not to call the release event if exiting while grab event activated")]
							 | 
						||
| 
								 | 
							
								        public bool exitTriggerRelease = true;
							 | 
						||
| 
								 | 
							
								        [Tooltip("Whether or not to call the release event if exiting while grab event activated")]
							 | 
						||
| 
								 | 
							
								        public bool exitTriggerUnsqueeze = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Header("Events")]
							 | 
						||
| 
								 | 
							
								        public UnityHandEvent HandEnter;
							 | 
						||
| 
								 | 
							
								        public UnityHandEvent HandExit;
							 | 
						||
| 
								 | 
							
								        public UnityHandEvent HandGrab;
							 | 
						||
| 
								 | 
							
								        public UnityHandEvent HandRelease;
							 | 
						||
| 
								 | 
							
								        public UnityHandEvent HandSqueeze;
							 | 
						||
| 
								 | 
							
								        public UnityHandEvent HandUnsqueeze;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //For Programmers <3
							 | 
						||
| 
								 | 
							
								        public HandEvent HandEnterEvent;
							 | 
						||
| 
								 | 
							
								        public HandEvent HandExitEvent;
							 | 
						||
| 
								 | 
							
								        public HandEvent HandGrabEvent;
							 | 
						||
| 
								 | 
							
								        public HandEvent HandReleaseEvent;
							 | 
						||
| 
								 | 
							
								        public HandEvent HandSqueezeEvent;
							 | 
						||
| 
								 | 
							
								        public HandEvent HandUnsqueezeEvent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        List<Hand> hands;
							 | 
						||
| 
								 | 
							
								        bool grabbing;
							 | 
						||
| 
								 | 
							
								        bool squeezing;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected virtual void OnEnable() {
							 | 
						||
| 
								 | 
							
								            hands = new List<Hand>();
							 | 
						||
| 
								 | 
							
								            HandEnterEvent += (hand) => HandEnter?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandExitEvent += (hand) => HandExit?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandGrabEvent += (hand) => HandGrab?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandReleaseEvent += (hand) => HandRelease?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandSqueezeEvent += (hand) => HandSqueeze?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandUnsqueezeEvent += (hand) => HandUnsqueeze?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected virtual void OnDisable() {
							 | 
						||
| 
								 | 
							
								            HandEnterEvent -= (hand) => HandEnter?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandExitEvent -= (hand) => HandExit?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandGrabEvent -= (hand) => HandGrab?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandReleaseEvent -= (hand) => HandRelease?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandSqueezeEvent -= (hand) => HandSqueeze?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            HandUnsqueezeEvent -= (hand) => HandUnsqueeze?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            for (int i = hands.Count - 1; i >= 0; i--){
							 | 
						||
| 
								 | 
							
								                hands[i].RemoveHandTriggerArea(this);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected virtual void Update(){
							 | 
						||
| 
								 | 
							
								            foreach (var hand in hands){
							 | 
						||
| 
								 | 
							
								                if (!hand.enabled) {
							 | 
						||
| 
								 | 
							
								                    Exit(hand);
							 | 
						||
| 
								 | 
							
								                    Release(hand);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public virtual void Enter(Hand hand) {
							 | 
						||
| 
								 | 
							
								            if (enabled == false || handType == HandType.none || (hand.left && handType == HandType.right) || (!hand.left && handType == HandType.left))
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(!hands.Contains(hand)) {
							 | 
						||
| 
								 | 
							
								                hands.Add(hand);
							 | 
						||
| 
								 | 
							
								                if(oneHanded && hands.Count == 1)
							 | 
						||
| 
								 | 
							
								                    HandEnterEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                    HandEnterEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public virtual void Exit(Hand hand) {
							 | 
						||
| 
								 | 
							
								            if (enabled == false || handType == HandType.none || (hand.left && handType == HandType.right) || (!hand.left && handType == HandType.left))
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(hands.Contains(hand)) {
							 | 
						||
| 
								 | 
							
								                if(oneHanded && hands[0] == hand){
							 | 
						||
| 
								 | 
							
								                    HandExit?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(grabbing && exitTriggerRelease){
							 | 
						||
| 
								 | 
							
								                        HandReleaseEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                        grabbing = false;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    if(squeezing && exitTriggerUnsqueeze){
							 | 
						||
| 
								 | 
							
								                        HandUnsqueezeEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                        squeezing = false;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    //If there is another hand, it enters
							 | 
						||
| 
								 | 
							
								                    if(hands.Count > 1)
							 | 
						||
| 
								 | 
							
								                        HandEnterEvent?.Invoke(hands[1]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else if(!oneHanded){
							 | 
						||
| 
								 | 
							
								                    HandExitEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                    if(grabbing && exitTriggerRelease){
							 | 
						||
| 
								 | 
							
								                        HandReleaseEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                        grabbing = false;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    if(squeezing && exitTriggerUnsqueeze){
							 | 
						||
| 
								 | 
							
								                        HandUnsqueezeEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                        squeezing = false;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                hands.Remove(hand);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public virtual void Grab(Hand hand) {
							 | 
						||
| 
								 | 
							
								            if (enabled == false || handType == HandType.none || (hand.left && handType == HandType.right) || (!hand.left && handType == HandType.left))
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(grabbing)
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(oneHanded && hands[0] == hand){
							 | 
						||
| 
								 | 
							
								                HandGrabEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                grabbing = true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if(!oneHanded){
							 | 
						||
| 
								 | 
							
								                HandGrabEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                grabbing = true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public virtual void Release(Hand hand) {
							 | 
						||
| 
								 | 
							
								            if (enabled == false || handType == HandType.none || (hand.left && handType == HandType.right) || (!hand.left && handType == HandType.left))
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(!grabbing)
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(oneHanded && hands[0] == hand){
							 | 
						||
| 
								 | 
							
								                HandReleaseEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                grabbing = false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if(!oneHanded){
							 | 
						||
| 
								 | 
							
								                HandReleaseEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                grabbing = false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public virtual void Squeeze(Hand hand) {
							 | 
						||
| 
								 | 
							
								            if (enabled == false || handType == HandType.none || (hand.left && handType == HandType.right) || (!hand.left && handType == HandType.left))
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(squeezing)
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(oneHanded && hands[0] == hand){
							 | 
						||
| 
								 | 
							
								                HandSqueezeEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                squeezing = true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if(!oneHanded){
							 | 
						||
| 
								 | 
							
								                squeezing = true;
							 | 
						||
| 
								 | 
							
								                HandSqueezeEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public virtual void Unsqueeze(Hand hand) {
							 | 
						||
| 
								 | 
							
								            if (enabled == false || handType == HandType.none || (hand.left && handType == HandType.right) || (!hand.left && handType == HandType.left))
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(!squeezing)
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(oneHanded && hands[0] == hand){
							 | 
						||
| 
								 | 
							
								                HandUnsqueezeEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								                squeezing = false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if(!oneHanded){
							 | 
						||
| 
								 | 
							
								                squeezing = false;
							 | 
						||
| 
								 | 
							
								                HandUnsqueezeEvent?.Invoke(hand);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								}
							 |