using UnityEngine; using System.Collections; using RootMotion.FinalIK; namespace RootMotion.Demos { /// /// Basic Mecanim Animator controller for 3rd person view. /// public class AnimatorController3rdPerson : MonoBehaviour { public float rotateSpeed = 7f; // Speed of rotating the character public float blendSpeed = 10f; // Animation blending speed public float maxAngle = 90f; // Max angular offset from camera direction public float moveSpeed = 1.5f; // The speed of moving the character with no root motion public float rootMotionWeight; // Crossfading between procedural movement and root motion protected Animator animator; // The Animator protected Vector3 moveBlend, moveInput, velocity; protected virtual void Start() { animator = GetComponent(); } // Moving the character void OnAnimatorMove() { velocity = Vector3.Lerp (velocity, transform.rotation * Vector3.ClampMagnitude(moveInput, 1f) * moveSpeed, Time.deltaTime * blendSpeed); // Crossfading between procedural movement and root motion. transform.position += Vector3.Lerp(velocity * Time.deltaTime, animator.deltaPosition, rootMotionWeight); } // Move the character public virtual void Move(Vector3 moveInput, bool isMoving, Vector3 faceDirection, Vector3 aimTarget) { // Store variables that we need in other methods this.moveInput = moveInput; // Get the facing direction relative to the character rotation Vector3 faceDirectionLocal = transform.InverseTransformDirection(faceDirection); // Get the angle between the facing direction and character forward float angle = Mathf.Atan2(faceDirectionLocal.x, faceDirectionLocal.z) * Mathf.Rad2Deg; // Find the rotation float rotation = angle * Time.deltaTime * rotateSpeed; // Clamp the rotation to maxAngle if (angle > maxAngle) rotation = Mathf.Clamp(rotation, angle - maxAngle, rotation); if (angle < -maxAngle) rotation = Mathf.Clamp(rotation, rotation, angle + maxAngle); // Rotate the character transform.Rotate(Vector3.up, rotation); // Locomotion animation blending moveBlend = Vector3.Lerp(moveBlend, moveInput, Time.deltaTime * blendSpeed); // Set Animator parameters animator.SetFloat("X", moveBlend.x); animator.SetFloat("Z", moveBlend.z); animator.SetBool("IsMoving", isMoving); } } }