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.
		
		
		
		
		
			
		
			
				
	
	
		
			217 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			217 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C#
		
	
using UnityEngine;
 | 
						|
using System.Collections;
 | 
						|
using RootMotion;
 | 
						|
 | 
						|
namespace RootMotion.FinalIK {
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// The target of an effector in the InteractionSystem.
 | 
						|
	/// </summary>
 | 
						|
	[HelpURL("https://www.youtube.com/watch?v=r5jiZnsDH3M")]
 | 
						|
	[AddComponentMenu("Scripts/RootMotion.FinalIK/Interaction System/Interaction Target")]
 | 
						|
	public class InteractionTarget : MonoBehaviour {
 | 
						|
 | 
						|
        [System.Serializable]
 | 
						|
        public enum RotationMode
 | 
						|
        {
 | 
						|
            TwoDOF = 0,
 | 
						|
            ThreeDOF = 1
 | 
						|
        }
 | 
						|
 | 
						|
        // Open the User Manual URL
 | 
						|
        [ContextMenu("User Manual")]
 | 
						|
        void OpenUserManual()
 | 
						|
        {
 | 
						|
            Application.OpenURL("http://www.root-motion.com/finalikdox/html/page10.html");
 | 
						|
        }
 | 
						|
 | 
						|
        // Open the Script Reference URL
 | 
						|
        [ContextMenu("Scrpt Reference")]
 | 
						|
        void OpenScriptReference()
 | 
						|
        {
 | 
						|
            Application.OpenURL("http://www.root-motion.com/finalikdox/html/class_root_motion_1_1_final_i_k_1_1_interaction_target.html");
 | 
						|
        }
 | 
						|
 | 
						|
        // Open a video tutorial video
 | 
						|
        [ContextMenu("TUTORIAL VIDEO (PART 1: BASICS)")]
 | 
						|
		void OpenTutorial1() {
 | 
						|
			Application.OpenURL("https://www.youtube.com/watch?v=r5jiZnsDH3M");
 | 
						|
		}
 | 
						|
		
 | 
						|
		// Open a video tutorial video
 | 
						|
		[ContextMenu("TUTORIAL VIDEO (PART 2: PICKING UP...)")]
 | 
						|
		void OpenTutorial2() {
 | 
						|
			Application.OpenURL("https://www.youtube.com/watch?v=eP9-zycoHLk");
 | 
						|
		}
 | 
						|
		
 | 
						|
		// Open a video tutorial video
 | 
						|
		[ContextMenu("TUTORIAL VIDEO (PART 3: ANIMATION)")]
 | 
						|
		void OpenTutorial3() {
 | 
						|
			Application.OpenURL("https://www.youtube.com/watch?v=sQfB2RcT1T4&index=14&list=PLVxSIA1OaTOu8Nos3CalXbJ2DrKnntMv6");
 | 
						|
		}
 | 
						|
		
 | 
						|
		// Open a video tutorial video
 | 
						|
		[ContextMenu("TUTORIAL VIDEO (PART 4: TRIGGERS)")]
 | 
						|
		void OpenTutorial4() {
 | 
						|
			Application.OpenURL("https://www.youtube.com/watch?v=-TDZpNjt2mk&index=15&list=PLVxSIA1OaTOu8Nos3CalXbJ2DrKnntMv6");
 | 
						|
		}
 | 
						|
 | 
						|
		// Link to the Final IK Google Group
 | 
						|
		[ContextMenu("Support Group")]
 | 
						|
		void SupportGroup() {
 | 
						|
			Application.OpenURL("https://groups.google.com/forum/#!forum/final-ik");
 | 
						|
		}
 | 
						|
		
 | 
						|
		// Link to the Final IK Asset Store thread in the Unity Community
 | 
						|
		[ContextMenu("Asset Store Thread")]
 | 
						|
		void ASThread() {
 | 
						|
			Application.OpenURL("http://forum.unity3d.com/threads/final-ik-full-body-ik-aim-look-at-fabrik-ccd-ik-1-0-released.222685/");
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Multiplies the value of a weight curve for this effector target.
 | 
						|
		/// </summary>
 | 
						|
		[System.Serializable]
 | 
						|
		public class Multiplier {
 | 
						|
			/// <summary>
 | 
						|
			/// The curve type (InteractionObject.WeightCurve.Type).
 | 
						|
			/// </summary>
 | 
						|
			[Tooltip("The curve type (InteractionObject.WeightCurve.Type).")]
 | 
						|
			public InteractionObject.WeightCurve.Type curve;
 | 
						|
			/// <summary>
 | 
						|
			/// Multiplier of the curve's value.
 | 
						|
			/// </summary>
 | 
						|
			[Tooltip("Multiplier of the curve's value.")]
 | 
						|
			public float multiplier;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// The type of the FBBIK effector.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("The type of the FBBIK effector.")]
 | 
						|
		public FullBodyBipedEffector effectorType;
 | 
						|
		/// <summary>
 | 
						|
		/// InteractionObject weight curve multipliers for this effector target.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("InteractionObject weight curve multipliers for this effector target.")]
 | 
						|
		public Multiplier[] multipliers;
 | 
						|
		/// <summary>
 | 
						|
		/// The interaction speed multiplier for this effector. This can be used to make interactions faster/slower for specific effectors.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("The interaction speed multiplier for this effector. This can be used to make interactions faster/slower for specific effectors.")]
 | 
						|
		public float interactionSpeedMlp = 1f;
 | 
						|
		/// <summary>
 | 
						|
		/// The pivot to twist/swing this interaction target about. For symmetric objects that can be interacted with from a certain angular range.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("The pivot to twist/swing this interaction target about. For symmetric objects that can be interacted with from a certain angular range.")]
 | 
						|
		public Transform pivot;
 | 
						|
        /// <summary>
 | 
						|
        /// 2 or 3 degrees of freedom to match this InteractionTarget's rotation to the effector bone rotation.
 | 
						|
        /// </summary>
 | 
						|
        [Tooltip("2 or 3 degrees of freedom to match this InteractionTarget's rotation to the effector bone rotation.")]
 | 
						|
        public RotationMode rotationMode;
 | 
						|
		/// <summary>
 | 
						|
		/// The axis of twisting the interaction target.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("The axis of twisting the interaction target (blue line).")]
 | 
						|
		public Vector3 twistAxis = Vector3.up;
 | 
						|
		/// <summary>
 | 
						|
		/// The weight of twisting the interaction target towards the effector bone in the start of the interaction.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("The weight of twisting the interaction target towards the effector bone in the start of the interaction.")]
 | 
						|
		public float twistWeight = 1f;
 | 
						|
		/// <summary>
 | 
						|
		/// The weight of swinging the interaction target towards the effector bone in the start of the interaction. Swing is defined as a 3-DOF rotation around any axis, while twist is only around the twist axis.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("The weight of swinging the interaction target towards the effector bone in the start of the interaction. Swing is defined as a 3-DOF rotation around any axis, while twist is only around the twist axis.")]
 | 
						|
		public float swingWeight;
 | 
						|
        /// <summary>
 | 
						|
        /// The weight of rotating this InteractionTarget to the effector bone in the start of the interaction (and during if 'Rotate Once' is disabled
 | 
						|
        /// </summary>
 | 
						|
        [Tooltip("The weight of rotating this InteractionTarget to the effector bone in the start of the interaction (and during if 'Rotate Once' is disabled")]
 | 
						|
        [Range(0f, 1f)] public float threeDOFWeight = 1f;
 | 
						|
		/// <summary>
 | 
						|
		/// If true, will twist/swing around the pivot only once at the start of the interaction. If false, will continue rotating throuout the whole interaction.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("If true, will twist/swing around the pivot only once at the start of the interaction. If false, will continue rotating throuout the whole interaction.")]
 | 
						|
		public bool rotateOnce = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Will not set HandPoser's pose target and allows you to use a pose target from a previous interaction if disabled.
 | 
						|
        /// </summary>
 | 
						|
        [Tooltip("Will not set HandPoser's pose target and allows you to use a pose target from a previous interaction if disabled.")]
 | 
						|
        public bool usePoser = true;
 | 
						|
		/// <summary>
 | 
						|
		/// Used only together with UniversalPoser. List of bones must match UniversalPoser's list of bones in both array size and hierarchy.
 | 
						|
		/// </summary>
 | 
						|
		[Tooltip("Used only together with UniversalPoser. List of bones must match UniversalPoser's list of bones in both array size and hierarchy.")]
 | 
						|
		public Transform[] bones = new Transform[0];
 | 
						|
 | 
						|
		private Quaternion defaultLocalRotation;
 | 
						|
		private Transform lastPivot;
 | 
						|
 | 
						|
		// Should a curve of the Type be ignored for this effector?
 | 
						|
		public float GetValue(InteractionObject.WeightCurve.Type curveType) {
 | 
						|
			for (int i = 0; i < multipliers.Length; i++) if (multipliers[i].curve == curveType) return multipliers[i].multiplier;
 | 
						|
			return 1f;
 | 
						|
		}
 | 
						|
 | 
						|
        // Reset the twist and swing rotation of the target
 | 
						|
        public void ResetRotation() {
 | 
						|
			if (pivot != null) pivot.localRotation = defaultLocalRotation;
 | 
						|
		}
 | 
						|
 | 
						|
        // Rotate this target towards a position
 | 
						|
        public void RotateTo(Transform bone) {
 | 
						|
            if (pivot == null) return;
 | 
						|
 | 
						|
            if (pivot != lastPivot) {
 | 
						|
                defaultLocalRotation = pivot.localRotation;
 | 
						|
                lastPivot = pivot;
 | 
						|
            }
 | 
						|
 | 
						|
            // Rotate to the default local rotation
 | 
						|
            pivot.localRotation = defaultLocalRotation;
 | 
						|
 | 
						|
            switch (rotationMode)
 | 
						|
            {
 | 
						|
                case RotationMode.TwoDOF:
 | 
						|
                    // Twisting around the twist axis
 | 
						|
                    if (twistWeight > 0f)
 | 
						|
                    {
 | 
						|
                        Vector3 targetTangent = transform.position - pivot.position;
 | 
						|
                        Vector3 n = pivot.rotation * twistAxis;
 | 
						|
                        Vector3 normal = n;
 | 
						|
                        Vector3.OrthoNormalize(ref normal, ref targetTangent);
 | 
						|
 | 
						|
                        normal = n;
 | 
						|
                        Vector3 direction = bone.position - pivot.position;
 | 
						|
                        Vector3.OrthoNormalize(ref normal, ref direction);
 | 
						|
 | 
						|
                        Quaternion q = QuaTools.FromToAroundAxis(targetTangent, direction, n);
 | 
						|
                        pivot.rotation = Quaternion.Lerp(Quaternion.identity, q, twistWeight) * pivot.rotation;
 | 
						|
                    }
 | 
						|
 | 
						|
                    // Swinging freely
 | 
						|
                    if (swingWeight > 0f)
 | 
						|
                    {
 | 
						|
                        Quaternion s = Quaternion.FromToRotation(transform.position - pivot.position, bone.position - pivot.position);
 | 
						|
                        pivot.rotation = Quaternion.Lerp(Quaternion.identity, s, swingWeight) * pivot.rotation;
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
                case RotationMode.ThreeDOF:
 | 
						|
                    // Free rotation around all axes
 | 
						|
                    if (threeDOFWeight <= 0f) break;
 | 
						|
                    Quaternion fromTo = QuaTools.FromToRotation(transform.rotation, bone.rotation);
 | 
						|
                    if (threeDOFWeight >= 1f)
 | 
						|
                    {
 | 
						|
                        pivot.rotation = fromTo * pivot.rotation;
 | 
						|
                    } else
 | 
						|
                    {
 | 
						|
                        pivot.rotation = Quaternion.Slerp(Quaternion.identity, fromTo, threeDOFWeight) * pivot.rotation;
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |