如何将此统一运动脚本转换为刚体?
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()
的方法中收集您的输入,在该方法中设置一些布尔值,例如IsMovingRight
或IsJumping
,然后在您的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));
【讨论】:
以上是关于如何将此统一运动脚本转换为刚体?的主要内容,如果未能解决你的问题,请参考以下文章