Unity动画☀️6. 翻越障碍物、Vector3.up、射线Physics.Raycast()、Character Controller

2024-08-14 16:10:14 浏览数 (3)

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(半径)等

动画展示:

大家还有什么问题,欢迎在下方留言!

0 人点赞