1️⃣ 设置动画Valt、Bool条件,定义只有速度大于3才可翻越障碍物
2️⃣ 控制思路:
0.3米处,墙是密封的,栏杆处没有任何物体,可通过检测0.3m处人物与墙和栏杆之间的关系,来确定人物应该跳跃还是滑行
0.3m是通过与标准cube估算得出的,也可是其他合适数值
3️⃣ 关键代码释义:
Vector3.up——Vector3(0,1,0)的简码,即Y轴
代码语言:javascript复制bool Physics.Raycast(Vector3 origin,Vector3 direction,out RaycastHit hitInfo,float maxDistance)
射线是3D世界中一个点向一个方向发射的一条无终点的线。在发射的轨迹中,一旦与其他物体发生碰撞,它就会停止。Physics.Raycast(起点位置,方向,hitInfo为存储的射线碰撞到的第一个对象的信息,检测距离)是一个布尔值,若在检测距离内碰撞到物体,结果为true,否则为false
4️⃣ 代码
代码语言:javascript复制using UnityEngine;
public class Player : MonoBehaviour {
private Animator anim;
private int speedRotateID = Animator.StringToHash("SpeedRotate");
private int speedZID = Animator.StringToHash("SpeedZ");
int vaultID = Animator.StringToHash("Vault");
void Start () {
anim = GetComponent<Animator>();
}
void Update () {
anim.SetFloat(speedZID, Input.GetAxis("Vertical") * 4.5f);
anim.SetFloat(speedRotateID, Input.GetAxis("Horizontal")*126);
if (anim.GetFloat(speedZID) > 3)
{
RaycastHit hit;
if(Physics.Raycast(transform.position Vector3.up*0.3f,transform.forward,out hit, 4.5f))
{
if (hit.collider.tag == "Obstacle")
{
if(hit.distance>3)
anim.SetBool(vaultID, true);
}
}
else anim.SetBool(vaultID, false);
}
}
}
5️⃣ 此时人物还可能穿墙而过,我们需要给他加上Character Controller,并设置合适的Center(高度、位置)和Radius(半径)等
动画展示:
大家还有什么问题,欢迎在下方留言!