Unity引擎2D游戏开发,滑墙及蹬墙跳的实现总结
一、滑墙动画的实现
执行动画的逻辑
// 在墙壁上
onWall = (touchLeftWall || touchRightWall) && !isGround;
基本逻辑:紧贴墙壁并且不在地面上的时候执行滑墙动画
但是实际上,紧贴墙壁原地跳起也会执行滑墙动画
所以,需要额外添加一个条件。跳起离开地面,并施加与面朝X轴方向的力时,才执行滑墙动画
需要调用PlayerController
中的Input Direction
,不过需要做是否为玩家人物的判断
最终代码:
// 在墙壁上
if(isPlayer)
{
onWall = (touchLeftWall && playerController.inputDirection.x < 0f || touchRightWall && playerController.inputDirection.x > 0f) && !isGround;
}
动画抽搐
究其原因,是因为跳跃后跳跃动画和滑墙动画的反复执行导致的,所以需要给跳跃动画加一个条件
即,不在onWall
状态时执行跳跃动画
优化动画执行逻辑
目前动画有两个问题:
1.跳跃前按住方向键,再进行贴墙跳跃,是不会执行任何动画的
2.跳跃瞬间按住方向键,能够在执行贴墙动画的时候进行上升
以上两个问题都是不符合正常情况的,因此需要进行优化
优化逻辑是:
在跳跃时,刚体是会有一个y轴方向的瞬时力
,因为当此瞬时力为负数时,即跳跃到最高点下落时,进行贴墙动画
因此,最终代码为
// 在墙壁上
if(isPlayer)
{
onWall = (touchLeftWall && playerController.inputDirection.x < 0f || touchRightWall && playerController.inputDirection.x > 0f) && rigidbody2D.velocity.y < 0f;
}
改变滑墙速度
如果是在墙上,刚体竖直方向的力减半
if(physicsCheck.onWall)
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y / 2);
} else
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y);
}
二、蹬墙跳
实现逻辑
朝按住方向的反方向施加一个瞬时力
if(physicsCheck.onWall)
{
rb.AddForce(new Vector2(-inputDirection.x, 2f) * wallJumpForce, ForceMode2D.Impulse);
}
蹬墙跳出后立即回墙的问题
由于跳出后依旧再按住方向键,因此,跳出后会立即回来
新建一个wallJump
状态,修改人物移动逻辑
// 人物移动
if (isCrouch)
{
rb.velocity = new Vector2(0.0f, 0.0f);
} else if(!isCrouch && !wallJump)
{
rb.velocity = new Vector2(xDirection * speed * Time.fixedDeltaTime, rb.velocity.y);
}
即,wallJump状态为true的时候,不允许进行方向上的移动
if(physicsCheck.onWall)
{
rb.AddForce(new Vector2(-inputDirection.x, 2f) * wallJumpForce, ForceMode2D.Impulse);
wallJump = true;
}
然后,当跳跃下落过程中,再设置为false,即可进行移动
if(wallJump && rb.velocity.y < 0)
{
wallJump = false;
}