Untitled

 avatar
unknown
plain_text
10 months ago
2.3 kB
15
Indexable
public class Mover : MonoBehaviour
{
    [SerializeField] Vector3 UsePos;
    [SerializeField] Quaternion UseRot;
    [SerializeField] float UseSpeed;
    [SerializeField] MoverType Type;
    Vector3 move;
    Quaternion rotate;
    bool use;
    Vector3 IdlePos;
    Quaternion IdleRot;

    enum MoverType
    {
        Loop,
        Constant,
        Additive,
    }

    void Awake()
    {
        IdlePos = transform.localPosition;
        IdleRot = transform.localRotation;
    }


    public void Move()
    {
        switch (Type)
        {
            case MoverType.Loop:
                StartCoroutine(LerpLoop());
                break;
            case MoverType.Constant:
                use = true;
                StartCoroutine(QuickLerp());
                break;
            case MoverType.Additive:
                StartCoroutine(AdditiveLerp());
                break;
        }

    }

    public IEnumerator QuickLerp()
    {
        while(transform.position != UsePos)
        {
            move = Vector3.Lerp(transform.localPosition, UsePos, UseSpeed * Time.deltaTime);
            transform.localPosition = move;

            transform.localRotation = Quaternion.Slerp(transform.localRotation, UseRot, UseSpeed * Time.deltaTime);
            yield return null;
        }

    }

    //Adds UsePos to the current transform, and lerps towards that. Use for things that never want to reset position.
    public IEnumerator AdditiveLerp()
    {
        float timer = 0;
        Vector3 newpos = transform.localPosition + UsePos;
        Quaternion newrot = transform.localRotation * UseRot;

        while (timer <= 1)
        {
            timer += Time.deltaTime /UseSpeed;
            timer = Mathf.Clamp01(timer);

            move = Vector3.Lerp(transform.localPosition, newpos, timer);
            rotate = Quaternion.Slerp(transform.localRotation,newrot, timer);

            transform.localPosition = move;
            transform.localRotation = rotate;
            Debug.Log(timer);

            if (timer >= 1)
            {
                timer = 0;
                break;
            }
            yield return null;
        }
    }
Editor is loading...
Leave a Comment