- Unity 教程
- Unity - 首页
- Unity - 简介
- Unity - 安装和设置
- Unity - 创建精灵
- Unity - 修改精灵
- 变换和对象父子关系
- Unity - 内部资源
- Unity - 保存和加载场景
- Unity - 基本移动脚本
- Unity - 理解碰撞
- Unity - 刚体和物理
- Unity - 自定义碰撞边界
- 理解预制体和实例化
- Unity - 游戏对象销毁
- Unity - 协程
- Unity - 控制台
- Unity - 音频入门
- Unity - UI入门
- Unity - 按钮
- Unity - 文本元素
- Unity - 滑块
- Unity - 材质和着色器
- Unity - 粒子系统
- Unity - 使用资源商店
- Unity 有用资源
- Unity - 快速指南
- Unity - 有用资源
- Unity - 讨论
Unity - 刚体和物理
上一章中碰撞的主要问题在于代码。我们现在将直接修改游戏对象的坐标值。如果玩家按下按键,我们只是向坐标添加一个值。我们需要一种方法让玩家移动,使其能够正确地对边界和其他游戏对象做出反应。
为此,我们需要了解什么是刚体。刚体是允许游戏对象对实时物理做出反应的组件。这包括对力、重力、质量、阻力和动量的反应。
您可以通过单击添加组件并在搜索字段中键入Rigidbody2D来将刚体附加到您的游戏对象。
单击Rigidbody2D会将组件附加到您的游戏对象。附加后,您会注意到许多新字段已打开。
使用默认设置,由于重力,游戏对象将垂直向下坠落。为避免这种情况,请将重力缩放设置为0。
现在,游戏运行时不会显示任何明显的差异,因为游戏对象尚未与其物理组件有任何关联。
为了解决我们的问题,让我们再次打开我们的代码并重写它。
public class Movement : MonoBehaviour { public float speed; public Rigidbody2D body; // Update is called once per frame void Update() { float h = Input.GetAxisRaw(“Horizontal”); float v = Input.GetAxisRaw(“Vertical”); body.velocity = new Vector2(h * speed, v * speed); } }
我们可以看到,我们在声明中创建了对Rigidbody2D的引用,并且我们的更新代码作用于该引用而不是对象的变换。这意味着刚体现在承担了移动的责任。
您可能期望body引用抛出NullReferenceException,因为我们尚未为其分配任何值。如果您按原样编译并运行游戏,您将在编辑器的左下角看到以下错误。
为了解决这个问题,让我们考虑一下脚本创建的组件。请记住,公共属性会在Unity中创建它们自己的字段,就像我们对speed变量所做的那样。
将速度调整到更高的值,大约5,然后运行游戏。
您的碰撞现在将正常工作!
广告