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.
		
		
		
		
		
			
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
using UnityEngine;
 | 
						|
using System.Collections;
 | 
						|
 | 
						|
namespace RootMotion.Demos {
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// The base abstract class for all character animation controllers.
 | 
						|
	/// </summary>
 | 
						|
	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;
 | 
						|
 | 
						|
		// Gets the rotation pivot of the character
 | 
						|
		public virtual Vector3 GetPivotPoint() {
 | 
						|
			return transform.position;
 | 
						|
		}
 | 
						|
 | 
						|
		// Is the animator playing the grounded state?
 | 
						|
		public virtual bool animationGrounded { 
 | 
						|
			get {
 | 
						|
				return true;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Gets angle around y axis from a world space direction
 | 
						|
		public float GetAngleFromForward(Vector3 worldDirection) {
 | 
						|
			Vector3 local = transform.InverseTransformDirection(worldDirection);
 | 
						|
			return Mathf.Atan2 (local.x, local.z) * Mathf.Rad2Deg;
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual void Start() {
 | 
						|
			if (transform.parent.GetComponent<CharacterBase>() == null) {
 | 
						|
				Debug.LogWarning("Animation controllers should be parented to character controllers!", transform);
 | 
						|
			}
 | 
						|
 | 
						|
			lastPosition = transform.position;
 | 
						|
			localPosition = transform.localPosition;
 | 
						|
			lastRotation = transform.rotation;
 | 
						|
			localRotation = transform.localRotation;
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual void LateUpdate() {
 | 
						|
			if (animatePhysics) return;
 | 
						|
 | 
						|
			SmoothFollow();
 | 
						|
		}
 | 
						|
 | 
						|
		// Smooth interpolation of character position. Helps to smooth out hectic rigidbody motion
 | 
						|
		protected virtual void FixedUpdate() {
 | 
						|
			if (!animatePhysics) return;
 | 
						|
 | 
						|
			SmoothFollow();
 | 
						|
		}
 | 
						|
 | 
						|
		private void SmoothFollow() {
 | 
						|
			if (smoothFollow) {
 | 
						|
				transform.position = Vector3.Lerp(lastPosition, transform.parent.TransformPoint(localPosition), Time.deltaTime * smoothFollowSpeed);
 | 
						|
				transform.rotation = Quaternion.Lerp(lastRotation, transform.parent.rotation * localRotation, Time.deltaTime * smoothFollowSpeed);
 | 
						|
			} else
 | 
						|
            {
 | 
						|
                transform.localPosition = localPosition;
 | 
						|
                transform.localRotation = localRotation;
 | 
						|
            }
 | 
						|
 | 
						|
			lastPosition = transform.position;
 | 
						|
			lastRotation = transform.rotation;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 |