unity超级马里奥2d游戏开发-05角色移动与跳跃
大家好,我是小兵,今天给大家带来Untiy开发超级马里奥游戏的第5课,角色的移动与跳跃,如果你想查看完整的教程,请访问我的个人博客geekape.net。
什么是物理引擎
物理引擎是指能模拟现实中的各种物理行为,如碰撞,摩擦,流体等等。
你可以用它来模拟牛顿的力学,也可以模拟法拉弟的电磁学,爱因斯坦的光学等。
在任何游戏中,几乎都有用到物理引擎,最基本的就是刚体和碰撞体了,马里奥本身只是一张图片,它不具备任何的物理效果,不能碰撞,也没有重力,但是给它加上刚体,它就像一个真人了,再给它和地面加上碰撞体,马里奥就可以站在地面上了。
刚体
在Unity中,给元素添加 Rigidbody 2D 组件,它就具有重力,摩擦力等一些物理效果了。
2D和3D同样是使用这个组件,只是2D游戏的物理组件都加了多了2D名称。
碰撞体
Unity中的碰撞体是使用 Collider 2D,不过碰撞体有很多种类型,在马里奥中,我使用的是胶囊型状的碰撞体。
其它一些类型的碰撞体,如盒子型,圆型,点状型等等。
瓦片地图碰撞体
上面,我们已经给玛丽奥加上了刚体和碰撞体,但是它还是不能站在地面上,因为地面没有碰撞体,运行后马里奥由于重力的原因会掉出画面。
给地面瓦片地图元素添加 Tilemap Collider 2D碰撞体组件,可以看到每一块瓦片都加上了碰撞体,这运行不会有问题,但是会影响性能,怎么解决呢?
碰撞体合并
添加 Composite Collider 2D 组件来合并瓦片地图碰撞体,加上后会自动加一个 Rigidbody 2D组件,特别注意的是,要设置 Body Type 为 Static,否则地面也会掉出画面。
角色移动
定义基础变量
rb
是马里奥的刚体,我们操作它的 velocity 属性来操作移动
private Rigidbody2D rb;
监听用户输入的代码应该写在 Update 中
private float moveX;
public float speed = 300;
private void Update()
{
moveX = Input.GetAxis("Horizontal");
}
movex
是监听用户左右移动的值,例如按左是-0.12,按右是0.12,是不断变化的,不超过1或小于-1speed
是移动的速度,用它乘以左右的值,就可以看出移动了
在 FixedUpdate 中,写入刚体移动代码,一般来说物理行为都应该写在这个方法中
private void FixedUpdate()
{
Move();
}
private void Move()
{
if (moveX != 0)
{
rb.velocity = new Vector2(moveX * speed * Time.fixedDeltaTime, rb.velocity.y);
}
}
velocity
属性是刚体速度的矢量,修改它就可以让角色移动Time.fixedDeltaTime
和Time.deltaTime
类似,一个用在 Update,一个用在FixedUpdate中,主要的用处是加减值上的处理,例如你想让一个物体每秒移动10米,不加Time.deltaTime,它就会移动10米*帧数,可能是每秒100米或是200,看机器的性能,Time.fixedDeltaTime就是稳定帧数。
马里奥反转
我们只有向右的马里奥贴图,但是我们需要在按下左键后朝向左,怎么做呢?
通过修改 localScale
属性来实现:
- 1是默认向右,-1是向左
transform.localScale = new Vector2(moveX > 0 ? 1 : -1, 1);
角色跳跃
马里奥跳跃和移动代码一样,修改 velocity
来实现,不过要注意不能连跳,只能在地面上起跳
isGround
是用来判断角色是否和地面层相接触GetButtonDown("Jump")
是定制的一个按键,它需要在 Project Setting中配置
private CapsuleCollider2D coll;
public float jumpPower = 10;
private bool isJump = false;
public LayerMask ground;
bool isGround
{
get { return coll.IsTouchingLayers(ground); }
}
private void Update()
{
if (!isJump && Input.GetButtonDown("Jump") && isGround)
{
isJump = true;
}
}
private void FixedUpdate()
{
Jump();
}
private void Jump()
{
if (isJump)
{
isJump = false;
rb.velocity = Vector2.up * jumpPower * Time.fixedDeltaTime;
}
}
定制按键
点击顶部菜单【Edit】→【Project Setting】,选择【InputManager】,如果已经有 Jump 就不用管,没有的话可以复制一个 Vertical,Positive Button是定制按键的真实映射,监听的Jump就相当于监听的按w键。
常见的问题
跳跃移动卡住
跳跃碰撞的时候,按住方向键,一直会卡在上面,是因为碰撞的摩擦力。
我们新建一个 Physics Material 2D
材质,把摩擦力设置为0,再把它加到马里奥的碰撞体身上。
角色翻转问题
你可能会遇到角色这样翻转了,是因为没有限制刚体的z轴,因为是2d是不需要z轴上的变动的,冻结它就好了。
好了,本篇文章到此结束,谢谢你的阅读,我们下篇文章见。
为什么不更了啊