ZeroVR/ZeroPacientVR/Assets/Scripts/IKAnimation.cs

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;
}