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#

6 months 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;
}
}
}
}
}