我们的第一个问题是,可以看到角色的奔跑无论是向前还是向后,他的动作都只往一个方向。为了使其更加美观,我们要在必要时翻转其跑步姿势。
本质上我们需要做的是翻转一下视角,当我们点了“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);
}
这样这可以防止连跳了。