Как я могу вращать объект со случайной скоростью с некоторыми задержками? - PullRequest
0 голосов
/ 03 мая 2020
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Turn_Move : MonoBehaviour {
    public int TurnX;
    public int TurnY;
    public int TurnZ;

    public int MoveX;
    public int MoveY;
    public int MoveZ;

    public bool World;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (World == true) {
            transform.Rotate(TurnX * Time.deltaTime,TurnY * Time.deltaTime,TurnZ * Time.deltaTime, Space.World);
            transform.Translate(MoveX * Time.deltaTime, MoveY * Time.deltaTime, MoveZ * Time.deltaTime, Space.World);
        }else{
            transform.Rotate(TurnX * Time.deltaTime,Random.Range(3,300) * Time.deltaTime,TurnZ * Time.deltaTime, Space.Self);
            transform.Translate(MoveX * Time.deltaTime, MoveY * Time.deltaTime, MoveZ * Time.deltaTime, Space.Self);
        }
    }
}

Это случайная часть:

Random.Range(3,300)

но так как она меняет случайные числа слишком быстро, изменения почти не видны. Я хочу каким-то образом сделать так, чтобы, например, следующий случайный номер оставался, например, на 5 секунд при этом числе скорости, затем переходил к следующему случайному числу и снова оставался с этим номером 5 секунд и т. Д.

Попробовал это:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Turn_Move : MonoBehaviour {
    public int TurnX;
    public int TurnY;
    public int TurnZ;

    public int MoveX;
    public int MoveY;
    public int MoveZ;

    public bool World;

    private bool IsGameRunning = false;

    // Use this for initialization
    void Start () 
    {
        IsGameRunning = true;
        StartCoroutine(SpeedWaitForSeconds());
    }

    // Update is called once per frame
    void Update () {

    }

    IEnumerator SpeedWaitForSeconds()
    {
        var delay = new WaitForSeconds(3);//define ONCE to avoid memory leak
        while (IsGameRunning)
        {
            if (World == true)
            {
                transform.Rotate(TurnX * Time.deltaTime, TurnY * Time.deltaTime, TurnZ * Time.deltaTime, Space.World);
                transform.Translate(MoveX * Time.deltaTime, MoveY * Time.deltaTime, MoveZ * Time.deltaTime, Space.World);
            }
            else
            {
                transform.Rotate(TurnX * Time.deltaTime, Random.Range(3, 300) * Time.deltaTime, TurnZ * Time.deltaTime, Space.Self);
                transform.Translate(MoveX * Time.deltaTime, MoveY * Time.deltaTime, MoveZ * Time.deltaTime, Space.Self);
            }

            yield return delay;//wait
        }
    }
}

, но это только вращает объект один раз каждые 3 секунды. и не вращать его все время со скоростью, изменяющейся каждые 3 секунды.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы можете иметь Invoke("changeSpeedFuntion", 5) и поместить его в цикл, чтобы повторить его

0 голосов
/ 03 мая 2020

У вас есть несколько способов отложить рандомизацию. Вы можете либо добавить Time.deltaTime, пока не достигнете определенного времени c, либо вы можете использовать InvokeRepeating и вызвать ваш if-case. https://docs.unity3d.com/ScriptReference/MonoBehaviour.InvokeRepeating.html

Если вам нужна дополнительная помощь или код, просто скажите.

РЕДАКТИРОВАТЬ: Если игровой объект должен вращаться с постоянной скоростью, попробуйте использовать Rigidbody.addtorque https://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html, но поскольку это сила, не забудьте сбросить его, прежде чем установить новое значение.

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