新人学Unity日志7:为角色完善奔跑动作与解决连跳问题

我们的第一个问题是,可以看到角色的奔跑无论是向前还是向后,他的动作都只往一个方向。为了使其更加美观,我们要在必要时翻转其跑步姿势。

本质上我们需要做的是翻转一下视角,当我们点了“A”时人物会转个面。

其实本质上就是我们将其y轴反转,从0变成180

后:

可以看到其转了个身。

这时我们只需要在代码中将其Y轴控制就行了。

参照以下代码: 

   private void Flip()

    {

    transform.Rotate(0f, 180f, 0f);//旋转180度,使角色面朝相反方向

    }

给其绑定个按键就可以翻转角色朝向。

但我们更希望其实现自动转向。角色朝向无非就两种,我们可以设置变量来表示它。

private int facingDir = 1;//Facing direction, 1 for right, -1 for left

private bool facingRight =true;

然后我们可以将其与速度绑定,及角色速度大于零时角色朝向右,小于零时朝向左。

private void Flip()

 {

 facingDir *= -1;//改变facingDir的值,使其取反,即1变为-1, -1变为1

 facingRight= !facingRight;//改变facingRight的值,使其取反,即true变为false, false变为true

 transform.Rotate(0f, 180f, 0f);//旋转180度,使角色面朝相反方向

 }



 private void FlipController()//这是角色的控制脚本,用于控制角色的朝向

 {

     if (rb1.velocity.x > 0 && facingRight == false)

     {

         Flip();

     }else if (rb1.velocity.x < 0 && facingRight == true)

     {

         Flip();

     }

 }   

然后是我们现在面临的第二个问题,就是我们的人物现在可以无限跳,我们要对其跳跃进行限制,否则就变成直升机了。

给跳跃增添一个条件,就是当人物触碰到地面的时候才能跳跃

先设置一个向地面测距的变量

[SerializeField] private float groundCheckDistance;//地面检测距离

在 Scene 视图中从物体位置向下绘制一条线段,线段长度为 groundCheckDistance,用于直观地显示物体到地面的检测距离,方便角色与地面的交互

  private void OnDrawGizmos()

  {

      Gizmos.DrawLine(transform.position,new Vector3(transform.position.x,transform.position.y-groundCheckDistance));

  }

Gizmos.DrawLine() 是 Unity 提供的用于绘制线段的方法,仅在 Scene 视图中可见,不会出现在游戏运行的 Game 视图中

线段的起点是 transform.position,即当前脚本所挂载游戏对象的世界坐标位置

线段的终点是一个新的 Vector3(三维向量):

X 坐标保持与起点相同(transform.position.x)

Y 坐标是起点的 Y 坐标减去 groundCheckDistance(这是一个表示 "地面检测距离" 的变量)

Z 坐标未明确指定,默认将使用起点的 Z 坐标

这根线可以在Scene中具象化,下面这根白色的线就是

将线长度设置一下,使其刚好接触地面。我们要来设置在代码中检测是否触底

先设置变量:

    private bool isGrounded;//是否在地面上

    [SerializeField]private float groundCheckDistance;//地面检测距离

[SerializeField]private LayerMask whatIsGround;// 地面层

然后检测

isGrounded=Physics2D.Raycast(transform.position, Vector2.down, groundCheckDistance, whatIsGround);//检测是否在地面上

保存后回到unity,我们要为地面创建一个图层

然后将我们的平台的层面都设置成地面

并且给人物接地

最后在代码中给跳跃设置条件

  private void Jump()

  {

      if (isGrounded)

      rb1.velocity = new Vector2(rb1.velocity.x, jumpForce);

  }

这样这可以防止连跳了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值