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

public class RotateCamera : MonoBehaviour
{
    public GameObject objectToSpin;
    public float spinX;
    public float spinY;
    public float spinZ;
    public bool randomSpin = false;

    private void Start()
    {
        var rb = GetComponent<Rigidbody>();
        rb.angularVelocity = Random.insideUnitSphere;
    }

    private void Update()
    {
        if (randomSpin == true)
        {
            objectToSpin.transform.Rotate(Random.Range(spinX, 360), Random.Range(spinY, 360), Random.Range(spinZ, 360));
        }
        else
        {
            objectToSpin.transform.Rotate(spinX, spinY, spinZ);
        }
    }
}

Теперь при изменении флага randomSpin на true он будет вращаться случайным образом без остановки, изменяя случайный угол на xyz каждого кадра.

Но я хочу, чтобы он вращался случайным образом в течение 5 секунд через 5 секунд, чтобы измениться на случайныйЗначения XYZ и продолжить с последней точки, а затем через 5 секунд случайных углов и т. д.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Если вам нужна постоянная скорость и просто случайное направление, вы можете случайным образом выбрать ось для вращения, используя Random.onUnitSphere, а затем вращаться вокруг нее со скоростью.

Вот решение, которое использует сопрограмму. Если вы хотите остановить сопрограмму, вы можете использовать StopCoroutine("Spin"), чтобы остановить сопрограмму и запустить ее позже с помощью StartCoroutine("Spin"):

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

public class RotateCamera : MonoBehaviour
{
    public GameObject objectToSpin;
    public Vector3 spinAxis;
    public float timeToSpin = 5f;
    public float spinSpeed = 20f;
    public bool randomSpin = false;

    private void Start()
    {
        var rb = GetComponent<Rigidbody>();
        rb.angularVelocity = Random.insideUnitSphere;
        StartCoroutine("Spin");
    }

    private void Update()
    {
    }
}

IEnumerator Spin() 
{
    float spinTimer;
    while (true)
    {
        if (randomSpin == true)
        { 
            spinAxis = Random.onUnitSphere;
        }

        spinTimer = timeToSpin;
        while (spinTimer > 0f) 
        {
            objectToSpin.transform.Rotate(spinAxis, Time.deltaTime * spinSpeed);
            spinTimer -= Time.deltaTime;
            yield return null;
        }
    }
}
1 голос
/ 28 мая 2019

Например, используйте простой таймер, используя Time.deltaTime, например,

private float timer = 5;

private void Update()
{
    if (randomSpin == true)
    {
         timer -= Time.deltaTime;
         if(timer <= 0)
         {
            objectToSpin.transform.Rotate(Random.Range(spinX, 360), Random.Range(spinY, 360), Random.Range(spinZ, 360));

            timer = 5;
        }
    }
    else
    {
        objectToSpin.transform.Rotate(spinX, spinY, spinZ);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...