101 lines
3.5 KiB
C#
101 lines
3.5 KiB
C#
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<IKTarget> targets;
|
|
|
|
[SerializeField] private float timeAnimation;
|
|
[SerializeField] private List<float> 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;
|
|
} |