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#
		
	
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);
 | 
						|
            }
 | 
						|
        }
 | 
						|
}
 | 
						|
}
 |