Как я могу сделать случайное направление вращения? - PullRequest
0 голосов
/ 14 апреля 2020
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateAndScale : MonoBehaviour
{
    public Transform target; // Target to scale
    public Vector3 minScale; // Minimum scale value
    public Vector3 maxScale; // Maximum scale value
    public Vector3 minRotate; // Minimum rotate value
    public Vector3 maxRotate; // Maximum rotate value
    public float speed; // Scale and rotate speed
    public bool interruptCoroutine = false; // Can interrupt coroutine in the middle
    public bool randomRotDir = false; // If true object will rotate randomly or to left or to right

    // Flag for blocking input until one routine is done
    private bool isMoving;

    // Flag for deciding in which direction to go next
    // Via the Inspector set this to the direction it shall initially go towards
    [SerializeField] bool towardsMaxMin;

    private float t = 0.0f;

    private void Start()
    {
        Init(towardsMaxMin);
    }

    void Update()
    {


        if (interruptCoroutine == true)
        {
            if (Input.GetKeyDown(KeyCode.C))
            {
                StopAllCoroutines();
                StartCoroutine(DoMove());
            }
        }
        else
        {
            if (!isMoving && Input.GetKeyDown(KeyCode.C))
            {
                StartCoroutine(DoMove());
            }
        }
    }

    // Once started via a StartCoroutine call this will be executed
    // every frame until the next yield command
    IEnumerator DoMove()
    {
        // Invert direction for the next time
        towardsMaxMin = !towardsMaxMin;

        if (interruptCoroutine == false)
        {
            // Just in case block concurrent routines
            if (isMoving) yield break;

            // Block input
            isMoving = true;
        }

        // Decide if going to Max or min
        var targetRot = Quaternion.Euler(towardsMaxMin ? minRotate : maxRotate);
        var targetScale = towardsMaxMin ? minScale : maxScale;

        // Store Start values
        var startRot = target.localRotation;
        var startScale = target.localScale;

        var duration = 1 / speed;
        var timePassed = 0f;
        while (timePassed < duration)
        {
            t = timePassed / duration;

            target.localScale = Vector3.Lerp(startScale, targetScale, t);
            target.localRotation = Quaternion.Lerp(startRot, targetRot, t);

            // Increase the time passed since last frame
            timePassed += Time.deltaTime;

            // This tells Unity to "pause" the routine here,
            // render this frame and continue from here
            // in the next frame
            yield return null;
        }

        // Just to be sure to end with exact values apply them hard once
        target.localScale = targetScale;
        target.localRotation = targetRot;

        if (interruptCoroutine == false)
        {
            // Done -> unlock input
            isMoving = false;
        }
    }

    private void Init(bool towardsMaxMin)
    {
        if (towardsMaxMin == true)
        {
            // True = min
            transform.localScale = minScale;
            transform.rotation = Quaternion.Euler(minRotate);
        }
        else
        {
            // False = max
            transform.localScale = maxScale;
            transform.rotation = Quaternion.Euler(maxRotate);
        }
    }
}

Я добавил для этого глобальный флаг: randomRotDir

Когда я нажимаю C, один раз он будет масштабироваться и поворачивать объект одновременно от минимума до максимума или от максимума до минимума. Но он всегда будет снова поворачиваться влево либо с минимума на максимум, либо с максимума на мин.

левая сторона. Я имею в виду, что он будет вращаться на Y от 0 до -180, например, но я хочу, чтобы, когда я нажимал на c, иногда это будет вращаться от 0 до -180, а иногда от 180 до 0 и то же самое от максимума до мин -180 до 0 или от 180 до 0.

Это рисование того, что я имею в виду случайным образом Y направления влево или вправо:

Random direction rotation sometimes from left to right sometimes from right to left either if min to max or max to min. Now everything is rotating and scaling fine but I want to add a random option for the rotation.

Некоторые скриншоты. При запуске игры объект для вращения и масштабирования NAVI в этом случае его вращение составляет 0,0,0

When starting the game the NAVI rotation is 0,0,0

Следующий снимок экрана, который я сделал в посередине после нажатия C теперь вращение NAVI по Y равно -131,259

In the middle of the Coroutine the NAVI rotation is 0, -131.259,0

Когда сопрограмма будет завершена, вращение NAVI будет максимальным:

NAVI rotation is at max now when the Coroutine has finished the NAVI rotation 0,180,0 at Max

Теперь, если я снова нажму C, он будет вращаться и снова уменьшаться до минимума, он будет вращаться на Y влево. И я хочу, чтобы случайным образом при нажатии на C иногда он вращался слева, а иногда справа.

Это пример того, что я имею в виду вращение справа: теперь вращение NAVI в середине составляет 0,149,68,0

Раньше, когда он вращался слева, он был в середине отрицательным -131.259

To the right side

Это то, что я имею в виду, чтобы случайно повернуть один раз слева один раз справа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...