GDPU unity游戏开发 寻路与导航

张春  金牌会员 | 2024-6-11 12:59:50 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 683|帖子 683|积分 2049

学会寻路,出门在外,身份不是他给的,他做不了你一直的导航。
   脚色寻路
  脚色控制器替换为平凡的脚色控制器,给实验九的地形增长NavMesh Surface组件,然后给脚色增长NavMesh Agent组件,并选择合适的参数。通过脚原来实现主动寻路。
联合实验十的动画脚色,将脚色控制器替换为动画脚色,并通过脚步来实现主动寻路。采用寻路系统后,脚色的移动是由寻路系统来完成的,也就是说寻路系统会直接修改脚色的坐标。停用动画的root motion,然后将寻路系统agent的速率传递给动画脚色的混淆树,由动画控制脚色的动作,但脚色的实际移动仍然由寻路系统控制。
先找到菜单的AI组件,旧版的看着办,新版的跟着来。新版的要在package下好包找到registry。

下好后,在windows菜单下可以找到navigation面板。

按照题设分别给一个新的胶囊体跟地形分别加NavMesh Agent组件与NavMesh Surface组件。然后给新的胶囊体挂载寻路的脚本。
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.AI;
  5. public class navmeshAgent : MonoBehaviour
  6. {
  7.     public Transform targetpostion;
  8.     void Update()
  9.     {
  10.         NavMeshAgent agent = this.GetComponent<NavMeshAgent>();
  11.         agent.destination = targetpostion.position;
  12.         
  13.     }
  14. }
复制代码


放置寻路的物体最好接近一下地面,要设置目标物体的位置。让目标物体更机动一点,可以通过射线检测,通过点击这个目标物体,让它活动,挂载射线检测的脚本到相机上。
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using static UnityEngine.GraphicsBuffer;
  5. public class sctoRay : MonoBehaviour
  6. {
  7.     public Transform target;
  8.     void Update()
  9.     {
  10.         // 检测鼠标左键是否被点击
  11.         if (Input.GetMouseButtonDown(0))
  12.         {
  13.             // 发射一条射线从鼠标点击的位置
  14.             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  15.             RaycastHit hit;
  16.             // 检测射线是否击中物体
  17.             if (Physics.Raycast(ray, out hit))
  18.             {
  19.               if(hit.rigidbody != null) {
  20.                     hit.rigidbody.AddForceAtPosition(ray.direction * 200.0f, hit.point);
  21.                 }
  22.                 Debug.Log(hit.point);
  23.             }
  24.            
  25.         }
  26.     }
  27. }
复制代码
然后点击NavMesh Surface组件的bake,可以看到scene面板中的寻路地区。

要是看不到,大概是你没让它表现。

点击运行,可以观察到控制器的寻路。
 
接着是动画脚色的寻路,先把之前的脚色搬过来,把没有用到的禁用。


之前的实验中,通过设置了speed让动画脚色有不同的状态,采用寻路系统后,脚色的移动是由寻路系统来完成的。停用动画的root motion,用脚本将寻路系统agent的速率传递给动画脚色的混淆树。
  1. using UnityEngine;
  2. using UnityEngine.AI;
  3. public class NavAgentAnimator : MonoBehaviour
  4. {
  5.     public NavMeshAgent agent;
  6.     public Animator animator;
  7.     void Start()
  8.     {
  9.         if (agent == null)
  10.             agent = GetComponent<NavMeshAgent>();
  11.         if (animator == null)
  12.             animator = GetComponent<Animator>();
  13.     }
  14.     void Update()
  15.     {
  16.         // 计算速度的大小
  17.         float speed = agent.velocity.magnitude;
  18.         // 将速度传递给Animator
  19.         animator.SetFloat("Speed", speed);
  20.     }
  21. }
复制代码
 
点击运行,可看到脚色带有动画的寻路。
 

   实验心得
   他说,尽管前方拥堵,但你仍在最优门路上。








免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表