Unity引擎2D游戏开发,滑墙及蹬墙跳的实现总结

一、滑墙动画的实现

执行动画的逻辑

// 在墙壁上
onWall = (touchLeftWall || touchRightWall) && !isGround;

基本逻辑:紧贴墙壁并且不在地面上的时候执行滑墙动画

但是实际上,紧贴墙壁原地跳起也会执行滑墙动画

所以,需要额外添加一个条件。跳起离开地面,并施加与面朝X轴方向的力时,才执行滑墙动画
需要调用PlayerController中的Input Direction,不过需要做是否为玩家人物的判断
image

最终代码:

// 在墙壁上
if(isPlayer)
{
    onWall = (touchLeftWall && playerController.inputDirection.x < 0f || touchRightWall && playerController.inputDirection.x > 0f) && !isGround;
}

动画抽搐

究其原因,是因为跳跃后跳跃动画和滑墙动画的反复执行导致的,所以需要给跳跃动画加一个条件
即,不在onWall状态时执行跳跃动画
image

优化动画执行逻辑

目前动画有两个问题:
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;
}
posted @ 2024-01-31 16:05  心霖の雨  阅读(247)  评论(0编辑  收藏  举报