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.
		
		
		
		
		
			
		
			
	
	
		
			65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace RootMotion.FinalIK {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// <summary>
							 | 
						||
| 
								 | 
							
									/// Offsets the transform from its (animated) position.
							 | 
						||
| 
								 | 
							
									/// </summary>
							 | 
						||
| 
								 | 
							
									[System.Serializable]
							 | 
						||
| 
								 | 
							
									public class ConstraintPositionOffset : Constraint {
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										#region Main Interface
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										/// <summary>
							 | 
						||
| 
								 | 
							
										/// The position offset in world space.
							 | 
						||
| 
								 | 
							
										/// </summary>
							 | 
						||
| 
								 | 
							
										public Vector3 offset;
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										public override void UpdateConstraint() {
							 | 
						||
| 
								 | 
							
											if (weight <= 0) return;
							 | 
						||
| 
								 | 
							
											if (!isValid) return;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Initiating
							 | 
						||
| 
								 | 
							
											if (!initiated) {
							 | 
						||
| 
								 | 
							
												// Storing default values
							 | 
						||
| 
								 | 
							
												defaultLocalPosition = transform.localPosition;
							 | 
						||
| 
								 | 
							
												lastLocalPosition = transform.localPosition;
							 | 
						||
| 
								 | 
							
												
							 | 
						||
| 
								 | 
							
												initiated = true;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Check if position has changed. If true, set default local position to current.
							 | 
						||
| 
								 | 
							
											if (positionChanged) defaultLocalPosition = transform.localPosition;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Offsetting the position
							 | 
						||
| 
								 | 
							
											transform.localPosition = defaultLocalPosition;
							 | 
						||
| 
								 | 
							
											transform.position += offset * weight;
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											// Store the current local position to check if it has changed in the next update.
							 | 
						||
| 
								 | 
							
											lastLocalPosition = transform.localPosition;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										#endregion Main Interface
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										public ConstraintPositionOffset() {}
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										public ConstraintPositionOffset(Transform transform) {
							 | 
						||
| 
								 | 
							
											this.transform = transform;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										private Vector3 defaultLocalPosition, lastLocalPosition;
							 | 
						||
| 
								 | 
							
										private bool initiated;
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										/*
							 | 
						||
| 
								 | 
							
										 * Check if position has been changed by animation or any other external script. 
							 | 
						||
| 
								 | 
							
										 * If not, consider the object to be static and offset only from the default rotation.
							 | 
						||
| 
								 | 
							
										 * */
							 | 
						||
| 
								 | 
							
										private bool positionChanged {
							 | 
						||
| 
								 | 
							
											get {
							 | 
						||
| 
								 | 
							
												return transform.localPosition != lastLocalPosition;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |