张春 发表于 2024-6-11 12:59:50

GDPU unity游戏开发 寻路与导航

学会寻路,出门在外,身份不是他给的,他做不了你一直的导航。
   脚色寻路
脚色控制器替换为平凡的脚色控制器,给实验九的地形增长NavMesh Surface组件,然后给脚色增长NavMesh Agent组件,并选择合适的参数。通过脚原来实现主动寻路。
联合实验十的动画脚色,将脚色控制器替换为动画脚色,并通过脚步来实现主动寻路。采用寻路系统后,脚色的移动是由寻路系统来完成的,也就是说寻路系统会直接修改脚色的坐标。停用动画的root motion,然后将寻路系统agent的速率传递给动画脚色的混淆树,由动画控制脚色的动作,但脚色的实际移动仍然由寻路系统控制。
先找到菜单的AI组件,旧版的看着办,新版的跟着来。新版的要在package下好包找到registry。
https://img-blog.csdnimg.cn/direct/048b9f7887eb4250a0e8d8bd1701caf2.jpeg
下好后,在windows菜单下可以找到navigation面板。
https://img-blog.csdnimg.cn/direct/fc54a3ac089a431ba57cd58fa14cb12c.jpeg
按照题设分别给一个新的胶囊体跟地形分别加NavMesh Agent组件与NavMesh Surface组件。然后给新的胶囊体挂载寻路的脚本。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class navmeshAgent : MonoBehaviour
{
    public Transform targetpostion;
    void Update()
    {
      NavMeshAgent agent = this.GetComponent<NavMeshAgent>();
      agent.destination = targetpostion.position;
      
    }
}
https://img-blog.csdnimg.cn/direct/b70a92f5146e4e738a82bdc3de722922.jpeg
https://img-blog.csdnimg.cn/direct/67141dd156934f9486a79b93dd4d266b.jpeg
放置寻路的物体最好接近一下地面,要设置目标物体的位置。让目标物体更机动一点,可以通过射线检测,通过点击这个目标物体,让它活动,挂载射线检测的脚本到相机上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.GraphicsBuffer;

public class sctoRay : MonoBehaviour
{
    public Transform target;
    void Update()
    {
      // 检测鼠标左键是否被点击
      if (Input.GetMouseButtonDown(0))
      {
            // 发射一条射线从鼠标点击的位置
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            // 检测射线是否击中物体
            if (Physics.Raycast(ray, out hit))
            {
            if(hit.rigidbody != null) {
                  hit.rigidbody.AddForceAtPosition(ray.direction * 200.0f, hit.point);
                }

                Debug.Log(hit.point);
            }
         
      }
    }
}
然后点击NavMesh Surface组件的bake,可以看到scene面板中的寻路地区。
https://img-blog.csdnimg.cn/direct/c3f7449f8f4f45a58ce53b8ad83eabbc.jpeg
要是看不到,大概是你没让它表现。
https://img-blog.csdnimg.cn/direct/6f61847d494b418fb843c708779572e6.jpeg
点击运行,可以观察到控制器的寻路。
https://img-blog.csdnimg.cn/direct/24259b44669a4aa581fc89f63f7d1d18.jpeghttps://img-blog.csdnimg.cn/direct/ab9899fffe8a445a8516fe3a5c6ae460.jpeg 
接着是动画脚色的寻路,先把之前的脚色搬过来,把没有用到的禁用。
https://img-blog.csdnimg.cn/direct/469da3823b5045dcbd8478eef57f8929.jpeg
https://img-blog.csdnimg.cn/direct/0443becb035b4de9ad9eb9edc2d89bd5.jpeg
之前的实验中,通过设置了speed让动画脚色有不同的状态,采用寻路系统后,脚色的移动是由寻路系统来完成的。停用动画的root motion,用脚本将寻路系统agent的速率传递给动画脚色的混淆树。
using UnityEngine;
using UnityEngine.AI;
public class NavAgentAnimator : MonoBehaviour

{

    public NavMeshAgent agent;

    public Animator animator;

    void Start()
    {

      if (agent == null)

            agent = GetComponent<NavMeshAgent>();

      if (animator == null)

            animator = GetComponent<Animator>();

    }

    void Update()
    {

      // 计算速度的大小

      float speed = agent.velocity.magnitude;

      // 将速度传递给Animator

      animator.SetFloat("Speed", speed);

    }

} https://img-blog.csdnimg.cn/direct/49930e0187004416bb75f85cf1bdc7a9.jpeghttps://img-blog.csdnimg.cn/direct/19f1618f91404354b29c3f1f031ea84f.jpeg 
点击运行,可看到脚色带有动画的寻路。
https://img-blog.csdnimg.cn/direct/fbebb27cda334df393a439dcc2bd5b39.jpeghttps://img-blog.csdnimg.cn/direct/ad0bc68d7a55413fa50dc5e20822bc84.jpeghttps://img-blog.csdnimg.cn/direct/da8ead2e86fa4b6bb8764e6fcebc82d4.jpeg 
   实验心得
 他说,尽管前方拥堵,但你仍在最优门路上。








免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: GDPU unity游戏开发 寻路与导航