Unity NavMesh & LineRenderer AI寻路及导航路径的绘制

举报
CoderZ1010 发表于 2022/09/25 06:04:01 2022/09/25
【摘要】 Nav Mesh是Unity中用于寻路行为的AI功能,下面简单介绍Nav Mesh的使用以及如何使用Line Renderer组件将寻路的路径通过如下方式绘制出来: 首先需要将场景中属于寻路过程中的障碍物体做Navigation Static处理,在Inspector检视面板右上角的Static中: 然后打开Navigati...

Nav Mesh是Unity中用于寻路行为的AI功能,下面简单介绍Nav Mesh的使用以及如何使用Line Renderer组件将寻路的路径通过如下方式绘制出来:

首先需要将场景中属于寻路过程中的障碍物体做Navigation Static处理,在Inspector检视面板右上角的Static中:

然后打开Navigation窗口进行烘焙,在Window/AI菜单中:

点击Bake烘焙,在Scene场景窗口中进行预览,其中蓝色的区域即是寻路时可以行走的区域:

为示例中的机器人添加NavMesh Agent组件,该类中的SetDestination函数可以设置寻路的目标,传入一个坐标即可:


  
  1. using UnityEngine;
  2. using UnityEngine.AI;
  3. public class Foo : MonoBehaviour
  4. {
  5. private NavMeshAgent agent;
  6. [SerializeField] private Transform target;
  7. private void Start()
  8. {
  9. agent = GetComponent<NavMeshAgent>();
  10. }
  11. private void Update()
  12. {
  13. agent.SetDestination(target.position);
  14. }
  15. }

下面绘制寻路的路径,为机器人创建一个子物体并添加Line Renderer组件,路径不需要面向视图方向,因此Alignment模式设为TransformZ,同时将Texture Mode设为Tile:


  
  1. using UnityEngine;
  2. using UnityEngine.AI;
  3. public class Foo : MonoBehaviour
  4. {
  5. private NavMeshAgent agent;
  6. private LineRenderer lineRenderer;
  7. [SerializeField] private Transform target;
  8. private void Start()
  9. {
  10. agent = GetComponent<NavMeshAgent>();
  11. lineRenderer = GetComponentInChildren<LineRenderer>();
  12. }
  13. private void Update()
  14. {
  15. agent.SetDestination(target.position);
  16. var corners = agent.path.corners;
  17. lineRenderer.SetPositions(corners);
  18. }
  19. }

创建一个Shader,为LineRenderer添加Material材质球:


  
  1. Shader "Custom/Arrow"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _MSpeed("MoveSpeed", Range(1, 3)) = 2 //移动速度
  7. }
  8. SubShader
  9. {
  10. //贴图带透明通道 ,半透明效果设置如下:
  11. tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True"}
  12. LOD 100
  13. Blend SrcAlpha OneMinusSrcAlpha //Blend选值为: SrcAlpha 和1-SrcAlpha //也可测试为 DstColor SrcColor //one one
  14. Pass
  15. {
  16. Name "Simple"
  17. Cull off //双面
  18. CGPROGRAM
  19. #pragma vertex vert
  20. #pragma fragment frag
  21. // make fog work
  22. #pragma multi_compile_fog
  23. #include "UnityCG.cginc"
  24. struct appdata
  25. {
  26. float4 vertex : POSITION;
  27. float2 uv : TEXCOORD0;
  28. };
  29. struct v2f
  30. {
  31. float2 uv : TEXCOORD0;
  32. UNITY_FOG_COORDS(1)
  33. float4 vertex : SV_POSITION;
  34. };
  35. sampler2D _MainTex;
  36. float4 _MainTex_ST;
  37. float _MSpeed;
  38. v2f vert (appdata v)
  39. {
  40. v2f o;
  41. o.vertex = UnityObjectToClipPos(v.vertex);
  42. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  43. UNITY_TRANSFER_FOG(o,o.vertex);
  44. return o;
  45. }
  46. half4 frag(v2f i) : SV_Target
  47. {
  48. float2 uv = float2(i.uv.x - _MSpeed * _Time.y,i.uv.y); //箭头移动的计算
  49. // sample the texture
  50. fixed4 col = tex2D(_MainTex, uv);
  51. // apply fog
  52. UNITY_APPLY_FOG(i.fogCoord, col);
  53. return col;
  54. }
  55. ENDCG
  56. }
  57. }
  58. }

用到的贴图资源:

最终效果:

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/123062678

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。