Unity如何生成具有旋转速度的GameObject

Posted

技术标签:

【中文标题】Unity如何生成具有旋转速度的GameObject【英文标题】:Unity how to spawn a GameObject with a rotation velocity 【发布时间】:2019-11-04 23:01:09 【问题描述】:

我想在按下空格键后生成具有旋转速度的方块。我认为以下代码不起作用,因为它每次都会产生一个新的GameObject

public GameObject blockPrefab;
void Update()

    if (Input.GetKeyDown(KeyCode.Space))
    
        Vector3 randomSpawnPosition = new Vector2(Random.Range(Player.screenHalfWidth, -Player.screenHalfWidth), 0);
        Vector3 randomSpawnRotation = new Vector3(0, 0, Random.Range(0, 360));
        GameObject block = Instantiate(blockPrefab, randomSpawnPosition, Quaternion.Euler(randomSpawnRotation));
        block.transform.parent = transform;

        // How do I set a rotation velocity here?
        block.transform.Rotate(new Vector3(0, 0, Random.Range(0, 30)* Time.deltaTime), Space.Self);
    

我不确定该怎么做,因为所有示例都说要使用 Rotate(),但据我所知,这在这种情况下永远行不通。

【问题讨论】:

一般来说检查 API 总是好的。 Rotate 是对象在所有三个轴上围绕某个角度进行的旋转变换,该变换完成一次。如果您想要连续旋转,请在Update 中使用它,如下所述,或者使用Rigidbody 并给它一定的angularVelocity(如果您不使用物理,这将是性能过度杀伤) 你应该考虑使用FixedUpdate()而不是Update()来处理这些与物理相关的事情。 Update() 每帧运行一次,而FixedUpdate() 有自己的时间步长,可以消除抖动。 Read more. 【参考方案1】:

将您的实例化与您的轮换分开。你在同一个“if”语句中做这两个。为实例化和旋转创建一个单独的脚本。将旋转脚本附加到您的“块”预制件中。

如果您要创建用于旋转预制件的新脚本,以下是 Rotator.cs Update() 方法的示例:

//...
void Update()

    transform.Rotate(new Vector3(0, 0, Random.Range(0, 30)* Time.deltaTime), Space.Self);

//...

【讨论】:

这看起来很有希望,但是所有立方体实例都有相同的旋转 - 有没有办法在每个实例的基础上做到这一点? 我不明白。您是在问如何使所有立方体具有相同的旋转?还是您要求使它们全部独立旋转? @userqwert 我希望它们都围绕 z 轴随机且独立地旋转,此时它们在生成后都使用相同的旋转速度和方向。 如果您将 Random.Range 移动到 Rotator.cs 脚本中的 start 方法并引用它,则此代码允许每个对象独立旋转。【参考方案2】:

如果你的方块连接了刚体,你可以像这样获得随机旋转:

    cube.GetComponent<Rigidbody>().angularVelocity = Random.insideUnitSphere;

【讨论】:

以上是关于Unity如何生成具有旋转速度的GameObject的主要内容,如果未能解决你的问题,请参考以下文章

《Unity_API解析》 第八章 Quaternion类

Unity编辑器生成可配置编辑文件

如何使相机具有与对象相同的旋转但具有偏移(Unity)

UNITY3D:如何将 NavMeshAgent 行走速度设置为 0,但让他向玩家旋转

unity3d如何使物体一直旋转 ,既按下按键后物体一直旋转,再按一次则停止,切换两种旋转速度时不冲突

unity scroll rect的速度怎么调整