Unity引擎2D游戏开发,实现人物下蹲逻辑和动画

发布时间 2023-12-15 15:51:34作者: 心霖の雨

将下蹲动画创建进人物中

在Animation窗口中的左侧,新建BlueCrouchStart动画时间轴,然后将下蹲动画拖入时间轴中
62,63,64都是下蹲中的动画,但是64号是下蹲动作完毕后的静止动画,因为不拖入时间轴中,单独为其建立一个时间轴

image

为64号下蹲动画完毕的静止动画单独创建一个时间轴,并命名为BlueCrouchIdle
image

创建次级状态控制机(Sub State Machine),并将所有的下蹲相关动画创建在内

在Animator窗口中,右击鼠标,选中Create Sub-State Machine,并命名为Crouch
image

image

双击进入Crouch,将下蹲相关动画从Animations→Player文件夹拖入Crouch窗口内
image

新建一个控制变量并将其写入C#人物控制代码中

下蹲动作是在Y轴进行反方向的一个动作朝向(↓方向),所以从Gameplay控制器中获得的InputDirection是恒定为-1。因此,通过这个变量可以进行下蹲动作的判断

新建控制变量isCrouch
image

在PlayerAnimation中SetAnimation()方法里,写入isCrouch变量

animator.SetBool("isCrouch", playerController.isCrouch);

接下来,对isCrouch进行判断,以实现此变量的控制。先在PlayerController中新建公有变量isCrouch

public bool isCrouch;

通过InputDirection的正负值进行判断,并且必须要判断是否在地面,只有在地面才能进行下蹲动作。在Move()方法中写入以下代码

// 下蹲
isCrouch = inputDirection.y < -0.5f && physicsCheck.isGround;

解决碰撞体积的问题

下蹲已经实现,但是碰撞体积却还是站立时的体积。因此需要解决此问题以实现下蹲时碰撞体积变小的功能。

可以观察Player的二维椭圆碰撞盒(Capsule Collider 2D)中的OffsetSize参数。当下蹲时,Size的Y轴数值变小了。但是碰撞盒(Collider)是以中心为基准,Y轴两端一起变小,所以需要调整它的Y轴偏移量(Offset)。让Y轴偏移量(Offset)向下移动。

打开PlayerController C#代码,由于需要修改Offset和Size的值,并且在取消下蹲后,还原Offset和Size的值,因此需要存储原始站立时的Offset和Size值,所以要新建两个变量来存储。

// 原始的碰撞体偏移量
private Vector2 originalOffset;
// 原始的碰撞体大小数值
private Vector2 originalSize;

判断是否开始下蹲动作,如果开始下蹲动作,则同时调整碰撞盒(Collider)的Offset和Size。否则,还原Offset和Size。
碰撞盒(Collider)的调整数值可以根据需要来进行调整。

if (isCrouch)
{
    // 修改碰撞体积大小
    capsuleCollider.offset = new Vector2(-0.05f, 0.80f);
    capsuleCollider.size = new Vector2(0.9f, 1.6f);
} else
{
    capsuleCollider.offset = originalOffset;
    capsuleCollider.size = originalSize;
}

解决下蹲可以移动的问题

当下蹲时,能够进行X轴方向的移动。或者X轴方向移动时能够进行下蹲漂移。这些都是我们不想要的。

传递X轴方向移动的核心代码在PlayerController内,对其进行下蹲判断。
如果已经进行下蹲动作,那么X轴方向和Y轴方向的加速度全部控制成0,使其无法移动。否则就按照原始的数值进行传递。

// 人物移动
if (isCrouch)
{
    rb.velocity = new Vector2(0.0f, 0.0f);
} else
{
    rb.velocity = new Vector2(xDirection * speed * Time.fixedDeltaTime, rb.velocity.y);
}