using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class IKAnimation : MonoBehaviour { [SerializeField] private float distanceToStep; [SerializeField] private Transform body; [SerializeField] private List targets; [SerializeField] private float timeAnimation; [SerializeField] private List timing; private int timeIndex; private Vector3 oldPos; private float timeToNext; private void Awake() { for(var index = 0; index < targets.Count; index++) { var ikTarget = targets[index]; ikTarget.FixedPosition = ikTarget.IK.position; ikTarget.OffsetPosition = ikTarget.IK.localPosition; ikTarget.Timing = timing[index]; } oldPos = transform.position; } private void LateUpdate() { if(Vector3.Distance(oldPos, transform.position) > distanceToStep) { StartCoroutine(ToSteps()); IEnumerator ToSteps() { for(var index = 0; index < targets.Count; index++) { var ikTarget = targets[index]; var origPosition = transform.position + ikTarget.OffsetPosition; Debug.DrawRay(origPosition, Vector3.up, Color.magenta); var distance = Vector3.Distance(ikTarget.FixedPosition, origPosition); if(distance > distanceToStep) { if(ikTarget.IsAnimation == false && ikTarget.Timing <= 0f) { ikTarget.IsAnimation = true; timeIndex += 1; if(timeIndex >= timing.Count) timeIndex = 0; ikTarget.Timing = timing[index]; StartCoroutine(Animation()); IEnumerator Animation() { var t = timeAnimation; var oldPos = ikTarget.FixedPosition; var newPos = origPosition; var dir = (oldPos - newPos).normalized * distanceToStep; newPos -= dir; while(t >= 0) { Debug.DrawRay(newPos, Vector3.up, Color.cyan); var lerp = Vector3.Lerp(oldPos, newPos, timeAnimation - t); ikTarget.FixedPosition = lerp; t -= Time.deltaTime; yield return null; } ikTarget.FixedPosition = newPos; yield return null; ikTarget.IsAnimation = false; } } yield return new WaitForSeconds(timeAnimation); ikTarget.Timing -= Time.deltaTime; } ikTarget.IK.position = ikTarget.FixedPosition; } } } foreach(var ikTarget in targets) { ikTarget.IK.position = ikTarget.FixedPosition; } } } [Serializable] public class IKTarget { public Transform IK; public Vector3 FixedPosition; public Vector3 OffsetPosition; public bool IsAnimation; public float Timing; }