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.
		
		
		
		
		
			
		
			
				
	
	
		
			87 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace Autohand {
 | 
						|
    public enum HeldAnimationDriver {
 | 
						|
        squeeze,
 | 
						|
        grip,
 | 
						|
        custom
 | 
						|
    }
 | 
						|
 | 
						|
    public class GrabbablePoseAnimaion : MonoBehaviour {
 | 
						|
        public AnimationCurve animationCurve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
 | 
						|
        [Tooltip("Determines the default hand value to activate this pose while it's being held")]
 | 
						|
        public HeldAnimationDriver animationDriver = HeldAnimationDriver.squeeze;
 | 
						|
 | 
						|
        [NaughtyAttributes.ShowIf("animationDriver", HeldAnimationDriver.custom)]
 | 
						|
        public float customValue;
 | 
						|
        [Space]
 | 
						|
        [Tooltip("The pose the hand will have by default")]
 | 
						|
        public GrabbablePose fromPose;
 | 
						|
        [Tooltip("The pose the hand will move to match given the animation driver value")]
 | 
						|
        public GrabbablePose toPose;
 | 
						|
        [Tooltip("Additional animations to run alongside the given driver value (good for things like a gun trigger that is separate from the hand but still needs to move with the hand during the animation)")]
 | 
						|
        public AutoAnimation[] additionalAnimations;
 | 
						|
        [Space]
 | 
						|
 | 
						|
        HandPoseData fromPoseData, toPoseData;
 | 
						|
        int lastPosingHandsCount;
 | 
						|
 | 
						|
 | 
						|
        public void Update() {
 | 
						|
            var posingHandCount = fromPose.posingHands.Count + toPose.posingHands.Count;
 | 
						|
            if(posingHandCount == 0)
 | 
						|
                return;
 | 
						|
 | 
						|
            foreach(var hand in fromPose.posingHands) {
 | 
						|
                if(hand.IsGrabbing())
 | 
						|
                    continue;
 | 
						|
                Animate(hand);
 | 
						|
            }
 | 
						|
            foreach(var hand in toPose.posingHands) {
 | 
						|
                if(hand.IsGrabbing())
 | 
						|
                    continue;
 | 
						|
                Animate(hand);
 | 
						|
            }
 | 
						|
 | 
						|
            if(lastPosingHandsCount != 0 && posingHandCount == 0)
 | 
						|
                foreach(var autoAnim in additionalAnimations)
 | 
						|
                    autoAnim.SetAnimation(0);
 | 
						|
 | 
						|
            lastPosingHandsCount = posingHandCount;
 | 
						|
 | 
						|
        }   
 | 
						|
 | 
						|
        public void Animate(Hand hand) {
 | 
						|
            fromPoseData = fromPose.GetHandPoseData(hand);
 | 
						|
            toPoseData = toPose.GetHandPoseData(hand);
 | 
						|
            var animationValue = GetAnimationValue(hand);
 | 
						|
            HandPoseData.LerpPose(fromPoseData, toPoseData, animationValue).SetPose(hand);
 | 
						|
            foreach(var autoAnim in additionalAnimations)
 | 
						|
                autoAnim.SetAnimation(animationCurve.Evaluate(animationValue));
 | 
						|
 | 
						|
 | 
						|
            float GetAnimationValue(Hand hand1) {
 | 
						|
                if(animationDriver == HeldAnimationDriver.squeeze)
 | 
						|
                    return hand1.GetSqueezeAxis();
 | 
						|
                else if(animationDriver == HeldAnimationDriver.grip)
 | 
						|
                    return hand1.GetGripAxis();
 | 
						|
                else if(animationDriver == HeldAnimationDriver.custom)
 | 
						|
                    return customValue;
 | 
						|
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        public void Animate(Hand hand, float value) {
 | 
						|
            fromPoseData = fromPose.GetHandPoseData(hand);
 | 
						|
            toPoseData = toPose.GetHandPoseData(hand);
 | 
						|
            HandPoseData.LerpPose(fromPoseData, toPoseData, value).SetPose(hand);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
} |