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.3 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
using UnityEngine;
 | 
						|
using System.Collections;
 | 
						|
 | 
						|
namespace RootMotion.FinalIK {
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Posing the children of a Transform to match the children of another Transform
 | 
						|
	/// </summary>
 | 
						|
	public class HandPoser : Poser {
 | 
						|
 | 
						|
		public override void AutoMapping() {
 | 
						|
			if (poseRoot == null) poseChildren = new Transform[0];
 | 
						|
			else poseChildren = (Transform[])poseRoot.GetComponentsInChildren<Transform>();
 | 
						|
			
 | 
						|
			_poseRoot = poseRoot;
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void InitiatePoser() {
 | 
						|
			// Find the children
 | 
						|
			children = (Transform[])GetComponentsInChildren<Transform>();
 | 
						|
			
 | 
						|
			StoreDefaultState();
 | 
						|
		}
 | 
						|
		
 | 
						|
		protected override void FixPoserTransforms() {
 | 
						|
			for (int i = 0; i < children.Length; i++) {
 | 
						|
				children[i].localPosition = defaultLocalPositions[i];
 | 
						|
				children[i].localRotation = defaultLocalRotations[i];
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected override void UpdatePoser() {
 | 
						|
			if (weight <= 0f) return;
 | 
						|
			if (localPositionWeight <= 0f && localRotationWeight <= 0f) return;
 | 
						|
			
 | 
						|
			// Get the children, if we don't have them already
 | 
						|
			if (_poseRoot != poseRoot) AutoMapping();
 | 
						|
			
 | 
						|
			if (poseRoot == null) return;
 | 
						|
			
 | 
						|
			// Something went wrong
 | 
						|
			if (children.Length != poseChildren.Length) {
 | 
						|
				Warning.Log("Number of children does not match with the pose", transform);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			
 | 
						|
			// Calculate weights
 | 
						|
			float rW = localRotationWeight * weight;
 | 
						|
			float pW = localPositionWeight * weight;
 | 
						|
			
 | 
						|
			// Lerping the localRotation and the localPosition
 | 
						|
			for (int i = 0; i < children.Length; i++) {
 | 
						|
				if (children[i] != transform) {
 | 
						|
					children[i].localRotation = Quaternion.Lerp(children[i].localRotation, poseChildren[i].localRotation, rW);
 | 
						|
					children[i].localPosition = Vector3.Lerp(children[i].localPosition, poseChildren[i].localPosition, pW);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected Transform[] children;
 | 
						|
 | 
						|
		private Transform _poseRoot;
 | 
						|
		private Transform[] poseChildren;
 | 
						|
		private Vector3[] defaultLocalPositions;
 | 
						|
		private Quaternion[] defaultLocalRotations;
 | 
						|
 | 
						|
		protected void StoreDefaultState() {
 | 
						|
			defaultLocalPositions = new Vector3[children.Length];
 | 
						|
			defaultLocalRotations = new Quaternion[children.Length];
 | 
						|
 | 
						|
			for (int i = 0; i < children.Length; i++) {
 | 
						|
				defaultLocalPositions[i] = children[i].localPosition;
 | 
						|
				defaultLocalRotations[i] = children[i].localRotation;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |