将下蹲动画创建进人物中
在Animation窗口中的左侧,新建BlueCrouchStart
动画时间轴,然后将下蹲动画拖入时间轴中
62,63,64都是下蹲中的动画,但是64号是下蹲动作完毕后的静止动画,因为不拖入时间轴中,单独为其建立一个时间轴
为64号下蹲动画完毕的静止动画单独创建一个时间轴,并命名为BlueCrouchIdle
创建次级状态控制机(Sub State Machine),并将所有的下蹲相关动画创建在内
在Animator窗口中,右击鼠标,选中Create Sub-State Machine
,并命名为Crouch
双击进入Crouch,将下蹲相关动画从Animations→Player文件夹拖入Crouch窗口内
新建一个控制变量并将其写入C#人物控制代码中
下蹲动作是在Y轴进行反方向的一个动作朝向(↓方向),所以从Gameplay控制器中获得的InputDirection是恒定为-1。因此,通过这个变量可以进行下蹲动作的判断
新建控制变量isCrouch
在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)中的Offset
、Size
参数。当下蹲时,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);
}
标签:动画,isCrouch,Vector2,碰撞,2D,Unity,Offset,Size
From: https://www.cnblogs.com/xinlindeyu/p/17903522.html