如何将此统一运动脚本转换为刚体?

Posted

技术标签:

【中文标题】如何将此统一运动脚本转换为刚体?【英文标题】:how can i convert this unity movement script to be with rigidbody? 【发布时间】:2022-01-02 04:08:46 【问题描述】:

大家好,基本上我想知道如何将这个运动脚本更改为使用刚体。它按照我想要的方式工作,wasd 改变外观方向,然后空间从那个方向向前移动,但我想将它全部转换为使用刚体完成,这样我就可以进行碰撞。谢谢!!

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

public class Fly : MonoBehaviour


public float moveSpeed;
void Start()

    



void Update()

    if (Input.GetKey(KeyCode.Space))
    
        transform.Translate(new Vector3(0,0,moveSpeed) * Time.deltaTime, Space.Self);
    
    

    float rotatex = Input.GetAxis("Vertical");
    float rotatey = Input.GetAxis("Horizontal");
    
    transform.Rotate(0, rotatey, 0, Space.World);
    transform.Rotate(-rotatex * 0.5f, 0, 0);

【问题讨论】:

您可能想要添加 RigidBody 并使用 FixedUpdate 调用 RigidBody.MovePosition 和 RigidBody.MoveRotation。 请使用正确的标签!请注意,unityscript 是或更好的是曾经是一种 javascript 风格,类似于早期 Unity 版本中使用的自定义语言,并且现在已经不推荐使用了!您的代码显然在c# ... 【参考方案1】:

您编写的代码存在很多错误。没问题,但您可能需要在代码开始按预期工作之前修复所有这些问题。此答案旨在为您提供一个跳板,让您可以在其中一些错误上进行谷歌搜索,并围绕 Update() 方法及其在 Unity 中的工作原理展开思考。

首先,您需要确保 RigidBody2d 组件位于您的游戏对象上。这很容易做到,右键单击检查器并添加组件。 Google:“如何在 Unity 中向游戏对象添加组件”

接下来,您需要了解Update() 的调用频率及其工作原理。剧透警报 - 它的调用速度与您的计算机一样快。这意味着每次调用都使用transform.Rotate 更改旋转可能会导致对象旋转得非常快。也许速度足够快,以至于它每帧旋转超过 360 度,并且看起来只是随机“抽搐”。您需要扩展您的轮换,因此请在 Google 上调高“Unity 更新中的增量时间”。

最后,你会想要收集你的输入,你用Input.GetKey() 做的很正确,尽管有很多方法可以给这只猫剥皮。也许最直接的方法是在一个名为GetAllInputs() 的方法中收集您的输入,在该方法中设置一些布尔值,例如IsMovingRightIsJumping,然后在您的Update 方法中对它们进行操作。这只是一种方法,实际上有几十种方法可以改进它们。谷歌搜索“Unity Input System”、“Unity 2D Physics”和“Finite State Machines”(因为你最终会想要有“状态”,比如蹲下、跳跃、跑步、挂在墙上等)。看起来你正在编写一个平台游戏,所以我也会观看一些关于它的 youtube 教程,以及像“创建 Unity 平台游戏教程”这样的谷歌短语。

【讨论】:

感谢您的回复,但一切都按预期进行,这是一款 3D 游戏,您是一只苍蝇,您使用 wasd 来改变您面对的方式,然后有空间继续前进方向。我只是想知道如何不使用 trasnform 和 translate 和 stuf,而是对所有内容使用刚体(这很困难,因为对于 ex,如果我要使用 rb.rotate 那么它只会采用四元数等)【参考方案2】:

假设它以您想要的方式工作,这里是使用刚体的代码(确保刚体附加到对象)此代码必须在固定更新中编写,因为基于刚体的计算必须在固定更新中完成:

        public class Fly : MonoBehaviour
        
            public float moveSpeed;
            [SerializeField] private Rigidbody rb;

            void Start()
            
                rb = GetComponent<Rigidbody>();

            


            void FixedUpdate()
            
              if (Input.GetKey(KeyCode.Space))
              
                  //transform.Translate(new Vector3(0,0,moveSpeed) * 
                  //Time.deltaTime, Space.Self);
                  if (rb)
                  
                      rb.MovePosition(new Vector3(0,0,moveSpeed) * 
                      Time.deltaTime);
                  
                  
              
              

              float rotatex = Input.GetAxis("Vertical");
              float rotatey = Input.GetAxis("Horizontal");
              
              // transform.Rotate(0, rotatey, 0, Space.World);
              // transform.Rotate(-rotatex * 0.5f, 0, 0);
              if (rb)
              
                  rb.MoveRotation(Quaternion.Euler(rotatex , rotatey , 0));
              

            
        

【讨论】:

以上是关于如何将此统一运动脚本转换为刚体?的主要内容,如果未能解决你的问题,请参考以下文章

physx之刚体运动

创建简单的Nape刚体

视觉SLAM三维空间刚体运动的描述

视觉SLAM三维空间刚体运动的描述

转载 unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger)

《视觉slam十四讲》之第3讲-三维刚体运动