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或小于-1
  • speed 是移动的速度,用它乘以左右的值,就可以看出移动了

在 FixedUpdate 中,写入刚体移动代码,一般来说物理行为都应该写在这个方法中

private void FixedUpdate()
{
    Move();
}

private void Move()
{
    if (moveX != 0)
    {
        rb.velocity = new Vector2(moveX * speed * Time.fixedDeltaTime, rb.velocity.y);
    }
}
  • velocity 属性是刚体速度的矢量,修改它就可以让角色移动
  • Time.fixedDeltaTimeTime.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轴上的变动的,冻结它就好了。

好了,本篇文章到此结束,谢谢你的阅读,我们下篇文章见。

本文系作者 @ 原创发布在 极客猿小兵的博客。未经许可,禁止转载。


极客猿小兵 » unity超级马里奥2d游戏开发-05角色移动与跳跃

1 评论

  1. 为什么不更了啊

发表评论