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