Files
2026-03-04 10:03:45 +08:00

79 lines
1.8 KiB
C#

using UnityEngine;
namespace RootMotion.Demos
{
public abstract class CharacterAnimationBase : MonoBehaviour
{
public bool smoothFollow = true;
public float smoothFollowSpeed = 20f;
protected bool animatePhysics;
private Vector3 lastPosition;
private Vector3 localPosition;
private Quaternion localRotation;
private Quaternion lastRotation;
public virtual bool animationGrounded => true;
public virtual Vector3 GetPivotPoint()
{
return base.transform.position;
}
public float GetAngleFromForward(Vector3 worldDirection)
{
Vector3 vector = base.transform.InverseTransformDirection(worldDirection);
return Mathf.Atan2(vector.x, vector.z) * 57.29578f;
}
protected virtual void Start()
{
if (base.transform.parent.GetComponent<CharacterBase>() == null)
{
Debug.LogWarning("Animation controllers should be parented to character controllers!", base.transform);
}
lastPosition = base.transform.position;
localPosition = base.transform.localPosition;
lastRotation = base.transform.rotation;
localRotation = base.transform.localRotation;
}
protected virtual void LateUpdate()
{
if (!animatePhysics)
{
SmoothFollow();
}
}
protected virtual void FixedUpdate()
{
if (animatePhysics)
{
SmoothFollow();
}
}
private void SmoothFollow()
{
if (smoothFollow)
{
base.transform.position = Vector3.Lerp(lastPosition, base.transform.parent.TransformPoint(localPosition), Time.deltaTime * smoothFollowSpeed);
base.transform.rotation = Quaternion.Lerp(lastRotation, base.transform.parent.rotation * localRotation, Time.deltaTime * smoothFollowSpeed);
}
else
{
base.transform.localPosition = localPosition;
base.transform.localRotation = localRotation;
}
lastPosition = base.transform.position;
lastRotation = base.transform.rotation;
}
}
}