如何以随机的速度旋转一个物体,并有一些延迟?

问题描述 投票:0回答:1
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秒旋转一次,而且速度也在变化。

c# unity3d
1个回答
0
投票

你有多种方法来延迟你的随机化。你可以将Time.deltaTime加起来,直到你达到一个特定的时间量,或者你可以使用InvokeRepeating并调用你的if-case。https:/docs.unity3d.comScriptReferenceMonoBehaviour.InvokeRepeating.html。

如果你需要更多的帮助或代码就说出来。

EDIT: 如果游戏对象需要以恒定的速度旋转,请尝试使用Rigidbody.addtorque。https:/docs.unity3d.comScriptReferenceRigidbody.AddTorque.html。但因为它是一个力,所以记得在你设置新的值之前先把它复位。


0
投票

你可以有 Invoke("changeSpeedFuntion", 5) 循环往复

© www.soinside.com 2019 - 2024. All rights reserved.