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.
		
		
		
		
		
			
		
			
	
	
		
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public enum AnimationPoint
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        start,
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public class AutoAnimation : MonoBehaviour
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        [Tooltip("This each transform that will be animated")]
							 | 
						||
| 
								 | 
							
								        public AnimationCurve animationCurve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
							 | 
						||
| 
								 | 
							
								        public bool recordChildTransforms = true;
							 | 
						||
| 
								 | 
							
								        public bool setPositions = true;
							 | 
						||
| 
								 | 
							
								        public bool setRotations = true;
							 | 
						||
| 
								 | 
							
								        public bool setScale = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [SerializeField,HideInInspector]
							 | 
						||
| 
								 | 
							
								        private Transform[] transformReferences;
							 | 
						||
| 
								 | 
							
								        [SerializeField, HideInInspector]
							 | 
						||
| 
								 | 
							
								        private Vector3[] maxValuePositions;
							 | 
						||
| 
								 | 
							
								        [SerializeField, HideInInspector]
							 | 
						||
| 
								 | 
							
								        private Quaternion[] maxValueRotations;
							 | 
						||
| 
								 | 
							
								        [SerializeField, HideInInspector]
							 | 
						||
| 
								 | 
							
								        private Vector3[] maxValueScales;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [SerializeField, HideInInspector]
							 | 
						||
| 
								 | 
							
								        private Vector3[] minValuePositions;
							 | 
						||
| 
								 | 
							
								        [SerializeField, HideInInspector]
							 | 
						||
| 
								 | 
							
								        private Quaternion[] minValueRotations;
							 | 
						||
| 
								 | 
							
								        [SerializeField, HideInInspector]
							 | 
						||
| 
								 | 
							
								        private Vector3[] minValueScales;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Transform transformRoot;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public void SetAnimation(float point)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (setPositions)
							 | 
						||
| 
								 | 
							
								                for (int i = 0; i < transformReferences.Length; i++)
							 | 
						||
| 
								 | 
							
								                    transformReferences[i].localPosition = Vector3.Lerp(minValuePositions[i], maxValuePositions[i], animationCurve.Evaluate(point));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (setRotations)
							 | 
						||
| 
								 | 
							
								                for (int i = 0; i < transformReferences.Length; i++)
							 | 
						||
| 
								 | 
							
								                    transformReferences[i].localRotation = Quaternion.Lerp(minValueRotations[i], maxValueRotations[i], animationCurve.Evaluate(point));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (setScale)
							 | 
						||
| 
								 | 
							
								                for (int i = 0; i < transformReferences.Length; i++)
							 | 
						||
| 
								 | 
							
								                    transformReferences[i].localScale = Vector3.Lerp(minValueScales[i], maxValueScales[i], animationCurve.Evaluate(point));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        internal Vector3 GetTransformPositionAtPoint(int index, float point)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return Vector3.Lerp(minValuePositions[index], maxValuePositions[index], animationCurve.Evaluate(point));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        internal int GetTransformIndex(Transform transform)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            for (int i = 0; i < transformReferences.Length; i++)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (transformReferences[i].Equals(transform))
							 | 
						||
| 
								 | 
							
								                    return i;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return -1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [NaughtyAttributes.Button("Save Start"), ContextMenu("Save Start")]
							 | 
						||
| 
								 | 
							
								        public void SaveAnimationStart()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            Debug.Log("Saved Start Pose");
							 | 
						||
| 
								 | 
							
								            SaveAnimation(AnimationPoint.start);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [NaughtyAttributes.Button("Save End"), ContextMenu("Save End")]
							 | 
						||
| 
								 | 
							
								        public void SaveAnimationEnd() {
							 | 
						||
| 
								 | 
							
								            Debug.Log("Saved End Pose");
							 | 
						||
| 
								 | 
							
								            SaveAnimation(AnimationPoint.end);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Range(0, 1)]
							 | 
						||
| 
								 | 
							
								        public float setTestValue = 0;
							 | 
						||
| 
								 | 
							
								        [NaughtyAttributes.Button("Set")]
							 | 
						||
| 
								 | 
							
								        public void SetAnimation()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            SetAnimation(setTestValue);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public void SaveAnimation(AnimationPoint animationPoint)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if(transformRoot == null)
							 | 
						||
| 
								 | 
							
								                transformRoot = transform;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            int count = 0;
							 | 
						||
| 
								 | 
							
								            void GetRecursiveChildCount(Transform obj){
							 | 
						||
| 
								 | 
							
								                count++;
							 | 
						||
| 
								 | 
							
								                if (recordChildTransforms)
							 | 
						||
| 
								 | 
							
								                    for (int k = 0; k < obj.childCount; k++)
							 | 
						||
| 
								 | 
							
								                        GetRecursiveChildCount(obj.GetChild(k));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            GetRecursiveChildCount(transformRoot);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            transformReferences = new Transform[count];
							 | 
						||
| 
								 | 
							
								            if (animationPoint == AnimationPoint.end)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                maxValuePositions = new Vector3[count];
							 | 
						||
| 
								 | 
							
								                maxValueRotations = new Quaternion[count];
							 | 
						||
| 
								 | 
							
								                maxValueScales = new Vector3[count];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if(animationPoint == AnimationPoint.start)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                minValuePositions = new Vector3[count];
							 | 
						||
| 
								 | 
							
								                minValueRotations = new Quaternion[count];
							 | 
						||
| 
								 | 
							
								                minValueScales = new Vector3[count];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            int currIndex = 0;
							 | 
						||
| 
								 | 
							
								            AssignChildrenPose(transformRoot);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            void AssignChildrenPose(Transform obj) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                AssignPoint(currIndex, obj.localPosition, obj.localRotation, obj.localScale, obj);
							 | 
						||
| 
								 | 
							
								                currIndex++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if (recordChildTransforms)
							 | 
						||
| 
								 | 
							
								                    for (int j = 0; j < obj.childCount; j++)
							 | 
						||
| 
								 | 
							
								                        AssignChildrenPose(obj.GetChild(j));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            void AssignPoint(int point, Vector3 pos, Quaternion rot, Vector3 scale, Transform joint)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                transformReferences[point] = joint;
							 | 
						||
| 
								 | 
							
								                if (animationPoint == AnimationPoint.end)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    maxValuePositions[point] = pos;
							 | 
						||
| 
								 | 
							
								                    maxValueRotations[point] = rot;
							 | 
						||
| 
								 | 
							
								                    maxValueScales[point] = scale;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else if (animationPoint == AnimationPoint.start)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    minValuePositions[point] = pos;
							 | 
						||
| 
								 | 
							
								                    minValueRotations[point] = rot;
							 | 
						||
| 
								 | 
							
								                    minValueScales[point] = scale;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |