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.
		
		
		
		
		
			
		
			
	
	
		
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using RootMotion;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace RootMotion.FinalIK {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// <summary>
							 | 
						||
| 
								 | 
							
									/// Controls LookAtIK for the InteractionSystem
							 | 
						||
| 
								 | 
							
									/// </summary>
							 | 
						||
| 
								 | 
							
									[System.Serializable]
							 | 
						||
| 
								 | 
							
									public class InteractionLookAt {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// (Optional) reference to the LookAtIK component that will be used to make the character look at the objects that it is interacting with.
							 | 
						||
| 
								 | 
							
										[Tooltip("(Optional) reference to the LookAtIK component that will be used to make the character look at the objects that it is interacting with.")]
							 | 
						||
| 
								 | 
							
										public LookAtIK ik;
							 | 
						||
| 
								 | 
							
										/// <summary>
							 | 
						||
| 
								 | 
							
										/// Interpolation speed of the LookAtIK target.
							 | 
						||
| 
								 | 
							
										/// </summary>
							 | 
						||
| 
								 | 
							
										[Tooltip("Interpolation speed of the LookAtIK target.")]
							 | 
						||
| 
								 | 
							
										public float lerpSpeed = 5f;
							 | 
						||
| 
								 | 
							
										/// <summary>
							 | 
						||
| 
								 | 
							
										/// Interpolation speed of the LookAtIK weight.
							 | 
						||
| 
								 | 
							
										/// </summary>
							 | 
						||
| 
								 | 
							
										[Tooltip("Interpolation speed of the LookAtIK weight.")]
							 | 
						||
| 
								 | 
							
										public float weightSpeed = 1f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/// <summary>
							 | 
						||
| 
								 | 
							
										/// Look the specified target for the specified time.
							 | 
						||
| 
								 | 
							
										/// </summary>
							 | 
						||
| 
								 | 
							
										public void Look(Transform target, float time) {
							 | 
						||
| 
								 | 
							
											if (ik == null) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (ik.solver.IKPositionWeight <= 0f) ik.solver.IKPosition = ik.solver.GetRoot().position + ik.solver.GetRoot().forward * 3f;
							 | 
						||
| 
								 | 
							
											lookAtTarget = target;
							 | 
						||
| 
								 | 
							
											stopLookTime = time;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										[HideInInspector] public bool isPaused;
							 | 
						||
| 
								 | 
							
										private Transform lookAtTarget; // The target Transform to look at
							 | 
						||
| 
								 | 
							
										private float stopLookTime; // Time to start fading out the LookAtIK
							 | 
						||
| 
								 | 
							
										private float weight; // Current weight
							 | 
						||
| 
								 | 
							
										private bool firstFBBIKSolve; // Has the FBBIK already solved for this frame? In case it is solved more than once, for example when using the ShoulderRotator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										public void OnFixTransforms() {
							 | 
						||
| 
								 | 
							
											if (ik == null) return;
							 | 
						||
| 
								 | 
							
											if (ik.fixTransforms) ik.solver.FixTransforms();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										public void Update() {
							 | 
						||
| 
								 | 
							
											if (ik == null) return;
							 | 
						||
| 
								 | 
							
											if (ik.enabled) ik.enabled = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (lookAtTarget == null) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (isPaused) stopLookTime += Time.deltaTime;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// Interpolate the weight
							 | 
						||
| 
								 | 
							
											float add = Time.time < stopLookTime? weightSpeed: -weightSpeed;
							 | 
						||
| 
								 | 
							
											weight = Mathf.Clamp(weight + add * Time.deltaTime, 0f, 1f);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// Set LookAtIK weight
							 | 
						||
| 
								 | 
							
											ik.solver.IKPositionWeight = Interp.Float(weight, InterpolationMode.InOutQuintic);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// Set LookAtIK position
							 | 
						||
| 
								 | 
							
											ik.solver.IKPosition = Vector3.Lerp(ik.solver.IKPosition, lookAtTarget.position, lerpSpeed * Time.deltaTime);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// Release the LookAtIK for other tasks once we're weighed out
							 | 
						||
| 
								 | 
							
											if (weight <= 0f) lookAtTarget = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											firstFBBIKSolve = true;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
										public void SolveSpine() {
							 | 
						||
| 
								 | 
							
											if (ik == null) return;
							 | 
						||
| 
								 | 
							
											if (!firstFBBIKSolve) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											float headWeight = ik.solver.headWeight;
							 | 
						||
| 
								 | 
							
											float eyesWeight = ik.solver.eyesWeight;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											ik.solver.headWeight = 0f;
							 | 
						||
| 
								 | 
							
											ik.solver.eyesWeight = 0f;
							 | 
						||
| 
								 | 
							
											ik.solver.Update();
							 | 
						||
| 
								 | 
							
											ik.solver.headWeight = headWeight;
							 | 
						||
| 
								 | 
							
											ik.solver.eyesWeight = eyesWeight;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										public void SolveHead() {
							 | 
						||
| 
								 | 
							
											if (ik == null) return;
							 | 
						||
| 
								 | 
							
											if (!firstFBBIKSolve) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											float bodyWeight = ik.solver.bodyWeight;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											ik.solver.bodyWeight = 0f;
							 | 
						||
| 
								 | 
							
											ik.solver.Update();
							 | 
						||
| 
								 | 
							
											ik.solver.bodyWeight = bodyWeight;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											firstFBBIKSolve = false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |