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#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								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;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |