【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录

一、二段跳、蹬墙跳 

二、扶墙下滑


一、二段跳、蹬墙跳

GitHub - prime31/CharacterController2D

下载工程后直接打开demo场景:DemoScene(Unity 2019.4.0f1项目环境)

Player物体上的CharacterController2D,Mask添加Wall层(自定义墙体层)

将场景里其中一个障碍物设置为Wall层 Wall标签 并拉伸为墙体高度

Player物体上的Demo Scene脚本控制玩家移动 二段跳 蹬墙跳

蹬墙跳要调整好Jump On Wall H Force 横向力 和 Jump On Wall V Force 纵向力 数值才能表现正常,其中 V Force 是在 1的基础上的增量值,这里的力并非物理力实际是速度增量倍率。

跳跃对Y轴速度影响是用公式:根号2gh
代码则是:Mathf.Sqrt(2f * jumpHeight * -gravity),加速度是重力反方向,跳跃高度固定,则计算出了速度增量,之后用它乘以(1+V Force)得出的一个对Y轴速度影响的增量。

上例子中速度增量根号2gh是8.48,因此每次蹬墙跳Y速度增量是8.48*1.335=11.32
代码默认有重力对Y轴速度影响:_velocity.y += gravity * Time.deltaTime; 即每秒Y轴速度会减去重力加速度(墙上为-24,地面为-25)若帧数是30,则每帧会减少0.8。具体可以将_velocity参数公开查看变化,实际蹬墙跳会离开墙体,重力加速度为-25,可自行调整这些参数来达到理想效果

修改部分代码:

    private float rawGravity;
      
    private int jumpLevel;//跳跃阶段 1段跳 2段跳
	private int dir; //朝向 -1左 1右
	public LayerMask jumpOnWallMask = 0;//墙体Layer层遮罩
	private bool isHoldWall; //是否在墙上
	public float jumpOnWallHForce = 1; //墙上跳跃横向力度
	public float jumpOnWallVForce = 2; //墙上跳跃纵向力度
	public float gravityOnWall = -24f;

	void Awake()
	{
        //... ...
		rawGravity = gravity;
	}

	void Update()
	{
		if (_controller.isGrounded)
		{
			gravity = rawGravity;
			_velocity.y = 0;
            jumpLevel = 0;
        }
        
        //朝着dir方向发射长度为(碰撞体宽度+自身皮肤厚度)的射线
        RaycastHit2D hit = Physics2D.Linecast(playerBottomTrans.position, playerBottomTrans.position + 
			new Vector3(dir * (Mathf.Abs(transform.localScale.x) * _controller.boxCollider.size.x / 2f + _controller.skinWidth), 0, 0), ju