新增跳落动画
在jump动画播放完后过渡到下落动画,之后再跳回地面动画,需要注意回去的顺序,Exit Time越短就先回去
新增落地侦查器
解决落地之前都是fail动画的问题,而不是fail落地动画播放完毕就播放落地动画,使用Physics.OverlapCapsule进行碰撞检测地面碰撞到的碰撞体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OnGroundSensor : MonoBehaviour
{
//获得人物胶囊体
public CapsuleCollider capcol;
//上半球的球心
private Vector3 point1;
//下半球的球心
private Vector3 point2;
//胶囊体的半径
private float radius;
void Awake()
{
radius = capcol.radius;
}
// Update is called once per frame
void FixedUpdate()
{
//transform.position在底部
point1 = transform.position + transform.up * radius;
point1 = transform.position + transform.up * capcol.height - transform.up * radius;
//获得layer为Ground的所有碰撞体
Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground"));
if (outputCols.Length != 0) {
foreach (var col in outputCols)
{
print("collision:" + col.name);
}
}
}
}
使用落地侦查器
为了实现玩家跳起来后落地的过程一直是fall落地动画,思路:如果碰到地面就会给人物SendMessageUpwards发送一个信息正在地上,然后在人物控制器中处理这些信息,通过改变动画参数控制动画的过渡
OnGroundSensor脚本中
//获得layer为Ground的所有碰撞体
Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground"));
if (outputCols.Length != 0)
{
//foreach (var col in outputCols)
//{
// print("collision:" + col.name);
//}
SendMessageUpwards("IsGround");
}
else {
SendMessageUpwards("IsNotGround");
}
ActorController脚本中
void IsGround() {
print("is on ground");
anim.SetBool("isGround", true);
}
void IsNotGround() {
print("is not on ground!!!!");
anim.SetBool("isGround", false);
}
修改人物在执行下落动画时出现垂直降落问题
在之前的操作中,播放完jump跳跃动画就会将input和位移就会开启更新,所以我们的思路是在fail下落到地面的时候再发送消息让input和位移就会开启更新,就会根据上一帧的速度出现一个惯性。
void OnGroundEnter() {
pi.inputEnabled = true;
lockPlanar = false;
}
小bug:
在原地起跳时,会因为脚到地面的距离差出现漂移的情况,解决办法:j将自定义的胶囊体向下偏移,从而减小这个误差。
public class OnGroundSensor : MonoBehaviour
{
//获得人物胶囊体
public CapsuleCollider capcol;
//让自定义的胶囊体向下偏移
public float offset = 0.1f;
//上半球的球心
private Vector3 point1;
//下半球的球心
private Vector3 point2;
//胶囊体的半径
private float radius;
//让自定义的胶囊体向下偏移
public float offset = 0.1f;
void Awake()
{
//使胶囊体变窄
radius = capcol.radius-0.1f;
}
// Update is called once per frame
void FixedUpdate()
{
//transform.position在底部
point1 = transform.position + transform.up * (radius-offset);
point2 = transform.position + transform.up * (capcol.height- offset) - transform.up * radius
...
}
}
解决jump动画过渡到fail的过程中踩到地面的情况