Jump()
private void Jump()
{
if (Input.GetKey(KeyCode.Z))
{
jumpTimer -= Time.deltaTime;
if (jumpTimer > 0)
{
rigi.AddForce(new Vector2(0, jumpForce), ForceMode2D.Force);
animator.SetTrigger("jump");
}
}
}
1.功能:这个方法用于处理角色的跳跃行为。
2.详细分析:
3.当按住键盘上的 Z 键时,Input.GetKey(KeyCode.Z) 返回 true。
4.jumpTimer 是一个倒计时器,每帧减去 Time.deltaTime 的时间。
5.如果 jumpTimer 大于 0,表明角色仍然可以执行跳跃。
6.使用 rigi.AddForce(new Vector2(0, jumpForce), ForceMode2D.Force); 给角色施加向上的力,以实现跳跃效果。
7.调用 animator.SetTrigger("jump"); 触发动画中的跳跃状态。
方法 OnCollisionEnter2D(Collision2D collision)
private void OnCollisionEnter2D(Collision2D collision)
{
Grouding(collision, false);
}
8.功能:处理角色与其他物体发生碰撞时的逻辑。
9.详细分析:调用了 Grouding(collision, false);,传递了碰撞信息和一个布尔值 false,表示角色不是离开状态。
方法 OnCollisionStay2D(Collision2D collision)
private void OnCollisionStay2D(Collision2D collision)
{
Grouding(collision, false);
}
10.功能:处理角色在与其他物体保持碰撞时的逻辑。
11.详细分析:同样调用了 Grouding(collision, false);,表示角色没有离开状态。
方法 OnCollisionExit2D(Collision2D collision)
private void OnCollisionExit2D(Collision2D collision)
{
Grouding(collision, true);
}
12.功能:处理角色与其他物体结束碰撞时的逻辑。
13.详细分析:调用 Grouding(collision, true);,传递了碰撞信息和一个布尔值 true,表示角色离开了地面
方法 Grouding(Collision2D col, bool exitState)
private void Grouding(Collision2D col, bool exitState)
{
if (exitState)
{
if (col.gameObject.layer == LayerMask.NameToLayer("Terrain"))
isOnGround = false;
}
else
{
if (col.gameObject.layer == LayerMask.NameToLayer("Terrain") && !isOnGround && col.contacts[0].normal == Vector2.up)
{
isOnGround = true;
JumpCancle();
}
else if (col.gameObject.layer == LayerMask.NameToLayer("Terrain") && !isOnGround && col.contacts[0].normal == Vector2.down)
{
JumpCancle();
}
}
animator.SetBool("isOnGround", isOnGround);
}
14.功能:用于检测角色是否在地面上,并根据碰撞信息和 exitState 处理不同的逻辑。
15.详细分析:
16.如果 exitState 为 true,表示角色离开地面,将 isOnGround 设置为 false。
17.如果 exitState 为 false,表示角色在地面上,根据碰撞的法线方向判断角色是否接触到地面。
18.如果角色从上往下碰到地面 (col.contacts[0].normal == Vector2.up),将 isOnGround 设置为 true,并调用 JumpCancle() 取消跳跃动画触发。
19.如果角色从下往上碰到地面 (col.contacts[0].normal == Vector2.down),只调用 JumpCancle()。
方法 JumpCancle()
private void JumpCancle()
{
animator.ResetTrigger("jump");
jumpTimer = 0.5f;
}
20.功能:取消跳跃动画的触发,并重置 jumpTimer。
21.详细分析:
22.调用 animator.ResetTrigger("jump"); 取消跳跃动画的播放状态。
23.将 jumpTimer 重置为 0.5 秒,以限制跳跃的持续时间。
总结
这段代码实现了基本的角色跳跃和地面检测逻辑。通过检测角色与地面(或其他指定层的物体)的碰撞,控制角色的跳跃行为,并通过动画系统(animator)来管理角色的动画状态。确保在使用时,碰撞层和动画触发器的命名与实际场景中的设置相匹配,以确保功能的正确性和稳定性。