正如标题所说,我试图创建一个决定第三人控制器应该着陆的机制。玩家有一个" HardLanding"和#34; NormalLanding"动画。起初我尝试使用计时器实现这一点,但这并没有提供预期的行为(当玩家向前跳时它也会播放HardLanding动画,这不是应该发生的事情)。我使用的是字符控制器组件,因此没有刚体或对撞机(只有CharacterController和脚本)。
我已经设置了一个向下光线投射的空白,当播放器没有接地时,这个目前正在进行。问题是groundCheck每帧都在更新,因为它在更新功能中。这意味着每条帧都会发出此光线并给出不同的值。我认为这条射线应该只射一次,所以有一个值决定了玩家的高度,或者只要玩家没有接地,当前射出的射线应该检查其最高值而不是我可以做点什么。 if(rayheight数字高于x){play HardLanding} else {play NormalLanding}。当玩家明显重新接地时,着陆动画应该开始播放。
到目前为止,这是我的gotton,但是还没有工作:
void CheckFallingDistance()
{
RaycastHit hitFall;
Vector3 bottom = controller.transform.position - new Vector3(0, controller.height / 2, 0);
if (Physics.Raycast(bottom, dirDown, out hitFall))
{
rayDistance = hitFall.distance;
}
Debug.DrawRay(bottom, dirDown * hitFall.distance, Color.cyan, 10f);
}
下面你可以看到我当前的地面检查,它仍然包含决定哪个着陆动画应该播放的计时器。计时器部分应替换为光线投射检查下降高度。
if (GroundCheck())
{
velocityY = 0;
if (airTime > airTimeHandler)
{
//Debug.Log("Hard landing");
anim.SetBool("hardLanding", true);
anim.SetBool("onAir", false);
anim.SetBool("onAirIdle", false);
}
else
{
//Debug.Log("Normal landing");
anim.SetBool("hardLanding", false);
anim.SetBool("onAir", false);
anim.SetBool("onAirIdle", false);
}
airTime = 0f;
}
else
{
CheckFallingDistance();
if (animationSpeedPercent < 0.51f)
{
anim.SetBool("onAirIdle", true);
}
else
{
anim.SetBool("onAir", true);
}
anim.SetBool("hardLanding", false);
airTime += Time.deltaTime;
}
答案 0 :(得分:0)
你知道你的球员的绝对位置(y分量),剩下的就是找到此时的高度。如果你的楼层在y = 0,那么这是微不足道的,但是既然你提到了光线投射,我假设不是。 我假设您只需要在最高点测量高度,您可以在离开地面时启动Coroutine(最好避免更新()),并检查该协程中每个帧中的垂直位置。在跳跃的开始阶段,位置将增加,但在某些时刻,当前位置将变得低于最后一帧中的位置。这是拍摄光线投影时的帧,并决定您播放哪种动画。你可以在此时结束你的协程(除非你的地面非常不均匀)。
您还可以在着陆前测量球员速度,并根据
决定答案 1 :(得分:0)
最终我决定抛弃光线投射部分并去检查角色控制器组件的Y速度。