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