1.增加向上冲量
public float jumpVelocity = 5.0f;//写活Y值
private Vector3 thrustVec;//给动画一个向上的冲量
update下
rig.velocity = new Vector3(planarVec.x, rig.velocity.y, planarVec.z) + thrustVec;//改成这个y是让它在Y方向上有物理限制。
thrustVec = Vector3.zero;//这个归0的意思是 只调用一帧thrustVec一个向上的冲量。要在OnJumpEnter里调用这个向量
OnJumpEnter下
thrustVec = new Vector3(0, jumpVelocity, 0);
2.新增落地侦测器
Physics.Overlap.Capsule方法
public class OnGroundSensor : MonoBehaviour {
public CapsuleCollider capcol;//获取一个组件的capsule组件
private Vector3 point1;//OverlapCapsule参数
private Vector3 point2;//OverlapCapsule参数
private float radius;//OverlapCapsule参数
void Start () {
radius = capcol.radius;
}
void FixedUpdate () {
point1 = transform.position + transform.up * radius;
point2 = transform.position + capcol.height * transform.up - transform.up * radius;
Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground"));//检测与Ground层的物体碰撞
if(outputCols.Length !=0)
{
foreach (var col in outputCols)
{
print("collision" + col.name);
}
}
}
}
本节学到了碰撞检测的粗略方法,用Physics.Overlap.Capsule方法检测挂在这个脚本上的主角是否碰撞有其他标签为Ground的物体,这样就能实现 检测为地面就让他的一个动画结束
3使用落地检测器
先在状态机里加一个IsGround的bool参数,上图片的意思是当检测到碰撞地面时向AC发信号,然后在AC里加代码控制fall动画的产生。这个bool参数应该放到哪呢,第一是从fall到 ground的返回路径上,取消has exit time(意思是不用fall动画放完就会在地面idle状态了),这样还不够,你会发现跳的时候fall必然会播放,因为你在jump里的设置问题,不会有jump到ground 的情况发生,所以在这个jump返回到ground的过程中添加isGround参数为true时就先 落地,当不落地时就调用fall,一落地就为idle,太奇妙了。
3.修正降落状态
这里你会发现当跳出去松手时,当角色播完jump动画后,就是OnJumpExit会执行,,因为这个时候没按键,Dmag为0,所有它就没动力了,怎么取消这个东西呢。
我们想做的事当角色到ground状态时再让locPlanar为false就可以了。
在ground进入时给他一个FSMOnEnter
然后这个信号OnGroundEnter传给AC执行,当落地时执行,然后把上面的OnJumpEnter砍掉。
4.失足掉落
当你不跳跃直接走下去时,角色会没速度,原因同上 给fall一个FSMOnEnter 这样的话Dmag就不会持续为0 了。
当你把跳跃冲量改成4时会执行fall动画,都落地了还要执行fall动画,当你从jump 转到 fall过程中撞到地面时,我们应该这样操作分为2个状态
设置成上个状态jump 为 current状态就可以了