Untitled
unknown
plain_text
10 months ago
2.4 kB
17
Indexable
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
public class Mover : MonoBehaviour
{
[SerializeField] Movement[] movement;
[SerializeField] float UseSpeed;
[SerializeField] float ResetWaitTime;
[SerializeField] MoverType Type;
[SerializeField] UnityEvent CompletionEvent;
Vector3 IdlePos;
Quaternion IdleRot;
bool lerping;
enum MoverType
{
Loop,
Additive,
}
[System.Serializable] struct Movement
{
public Vector3 pos;
public Quaternion rot;
}
void Start()
{
IdlePos = transform.localPosition;
IdleRot = transform.localRotation;
}
public void Move()
{
if(!lerping)
{
foreach(Movement mov in movement)
{
switch (Type)
{
case MoverType.Loop:
StartCoroutine(MergeLerp(IdlePos, mov.pos, IdleRot, mov.rot, true, ResetWaitTime));
break;
case MoverType.Additive:
StartCoroutine(MergeLerp(transform.localPosition, transform.localPosition + mov.pos, transform.localRotation, transform.localRotation * mov.rot, false));
break;
}
}
}
}
public IEnumerator MergeLerp(Vector3 curpos, Vector3 newpos, Quaternion currot, Quaternion newrot, bool reset, float holdtime = 0)
{
float timer = 0;
lerping = true;
while (timer <= 1)
{
timer += Time.deltaTime / UseSpeed;
timer = Mathf.Clamp01(timer);
transform.localPosition = Vector3.Lerp(curpos, newpos, timer);
transform.localRotation = Quaternion.Slerp(currot, newrot, timer);
if (timer >= 1)
{
timer = 0;
if(reset)
{
yield return new WaitForSeconds(holdtime);
StartCoroutine(MergeLerp(transform.localPosition, IdlePos, transform.localRotation, IdleRot, false));
}
else
{
CompletionEvent.Invoke();
lerping = false;
}
break;
}
yield return null;
}
}
}Editor is loading...
Leave a Comment