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.
		
		
		
		
		
			
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace RootMotion.FinalIK
 | 
						|
{
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Automatic stretch and squash for CCDIK.
 | 
						|
    /// </summary>
 | 
						|
    public class CCDStretch : MonoBehaviour
 | 
						|
    {
 | 
						|
 | 
						|
        public CCDIK ik;
 | 
						|
        [Range(0f, 0.999f)] public float maxSquash = 0f;
 | 
						|
        public float maxStretch = 2f;
 | 
						|
 | 
						|
        private Vector3[] defaultLocalPositions = new Vector3[0];
 | 
						|
 | 
						|
        private void Start()
 | 
						|
        {
 | 
						|
            // Store default localPositions
 | 
						|
            defaultLocalPositions = new Vector3[ik.solver.bones.Length - 1];
 | 
						|
            for (int i = 1; i < ik.solver.bones.Length; i++)
 | 
						|
            {
 | 
						|
                defaultLocalPositions[i - 1] = ik.solver.bones[i].transform.localPosition;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void LateUpdate()
 | 
						|
        {
 | 
						|
            // Reset to default localPositions
 | 
						|
            for (int i = 1; i < ik.solver.bones.Length; i++)
 | 
						|
            {
 | 
						|
                ik.solver.bones[i].transform.localPosition = defaultLocalPositions[i - 1];
 | 
						|
            }
 | 
						|
 | 
						|
            // Get distance from first bone to target
 | 
						|
            float targetDist = Vector3.Magnitude((ik.solver.target != null ? ik.solver.target.position : ik.solver.IKPosition) - ik.solver.bones[0].transform.position);
 | 
						|
 | 
						|
            // Get bone chain length
 | 
						|
            float chainLength = 0f;
 | 
						|
            for (int i = 1; i < ik.solver.bones.Length; i++)
 | 
						|
            {
 | 
						|
                chainLength += Vector3.Magnitude(ik.solver.bones[i].transform.position - ik.solver.bones[i - 1].transform.position);
 | 
						|
            }
 | 
						|
 | 
						|
            // Compare target distance to chain length...
 | 
						|
            maxStretch = Mathf.Max(maxStretch, 1f);
 | 
						|
            float mlp = Mathf.Clamp(targetDist / chainLength, 1f - maxSquash, maxStretch);
 | 
						|
 | 
						|
            // Stretch
 | 
						|
            for (int i = 1; i < ik.solver.bones.Length; i++)
 | 
						|
            {
 | 
						|
                ik.solver.bones[i].transform.localPosition *= mlp;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |