Untitled

 avatar
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