1 前言

本文通过导航系统(NavMeshAgent)和线段渲染器(LineRenderer)实现了角色走迷宫和绘制路径功能,同时实现动态路径特效。

导航系统的介绍详见博客:导航系统、分离路面导航、动态路障导航。线段渲染器的介绍详见博客:线段渲染器LineRenderer。

动态路径特效的原理是:通过对顶点的 uv 纹理坐标平移实现路径节点的移动效果。

本文完整资源见→Unity3D动态路径特效。

2 烘焙导航网格

1)搭建场景 

搭建迷宫场景如下,红的胶囊体是角色。

2)设置导航静态对象

选中地面和所有围墙,将它们设置为 Navigation Static,如下。

3)烘焙导航网格

通过【Window→AI→Navigation】打开导航窗口。

调整参数后,点击 Bake 烘焙导航网格,如下,蓝色的区域是可以行走的区域。

3 导航及轨迹绘制

NavController.cs

using UnityEngine;
using UnityEngine.AI;public class NavController : MonoBehaviour {private NavMeshAgent navMeshAgent; // 导航网格代理private LineRenderer lineRenderer; // 线段渲染器private RaycastHit hit; // 碰撞信息private NavMeshPath path; // 导航路径private void Awake() {AddNavMeshAgent();AddLineRenderer();}private void Update() {if (Input.GetMouseButtonUp(0) && navMeshAgent.remainingDistance < float.Epsilon) {Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out hit)) {if (navMeshAgent.CalculatePath(hit.point, path)) {DrawLine(path.corners);navMeshAgent.SetDestination(hit.point);} else {lineRenderer.positionCount = 0;lineRenderer.enabled = false;}}}}private void AddNavMeshAgent() { // 添加导航网格代理navMeshAgent = gameObject.AddComponent<NavMeshAgent>();navMeshAgent.speed = 100;navMeshAgent.angularSpeed = 10000;navMeshAgent.acceleration = 10000;path = new NavMeshPath();}private void AddLineRenderer() { // 添加线段渲染器lineRenderer = gameObject.AddComponent<LineRenderer>();lineRenderer.textureMode = LineTextureMode.Tile;lineRenderer.material = Resources.Load<Material>("PathNodeMat");lineRenderer.positionCount = 0;lineRenderer.enabled = false;}private void DrawLine(Vector3[] points) { // 绘制顶点lineRenderer.positionCount = points.Length;lineRenderer.SetPositions(points);lineRenderer.enabled = true;}
}

说明:NavController 脚本组件挂在 Player 角色下。

PathNode.shader

Shader "MyShader/PathNode"  { // 路径上的节点移动特效Properties {_MainTex("MainTex", 2D) = "white" {} // 节点贴图_Speed("Speed", Range(0.1, 3)) = 2 // 节点移动速度_Color("Color", Color) = (1, 1, 1, 1) // 节点颜色}SubShader {tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True"}Blend  SrcAlpha OneMinusSrcAlpha // 混合// Cull off // 双面Pass {CGPROGRAM#include "UnityCG.cginc"#pragma vertex vert#pragma fragment fragsampler2D _MainTex; // 节点贴图float _Speed; // 节点移动速度float4 _Color; // 节点颜色v2f_img vert(appdata_img v) {v2f_img o;o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)o.uv = v.texcoord;o.uv.x -= _Speed * _Time.y; // 通过uv纹理坐标的移动实现节点的移动return o;}fixed4 frag(v2f_img i) : SV_Target {return tex2D(_MainTex, i.uv) * _Color;}ENDCG}}
}

说明:在 Assets 目录下面新建 Resources 目录,接着在 Resources 目录下面创建材质,重命名为 PathNodeMat,将 PathNode.shader 与 PathNodeMat 材质绑定,并将路径节点纹理拖拽到 PathNodeMat 的 Main Tex 中。节点纹理如下,它们都是 png 格式,方向朝右,颜色只有灰色和白色(方便在 Shader 中通过 _Color 控制节点颜色)。

4 运行效果

        1)路径导航效果

2)飞机路径节点效果

3)火箭路径节点效果

4)箭头路径节点效果

5)其他路径节点效果

【Unity3D】动态路径特效相关推荐

  1. 深度学习AI美颜系列----人像静态/动态贴纸特效算法实现

    人像静态/动态贴纸特效几乎已经是所有图像视频处理类/直播类app的必需品了,这个功能看起来复杂,实际上很简单,本文将给大家做个详细的讲解. 我们先来看一下FaceU的两张效果图: 这两张效果图中, 我 ...

  2. 深度学习AI美颜系列——人像静态/动态贴纸特效算法实现 | CSDN博文精选

    作者 | Trent1985 来源 | CSDN博客 人像静态/动态贴纸特效几乎已经是所有图像视频处理类/直播类app的必需品了,这个功能看起来复杂,实际上很简单,本文将给大家做个详细的讲解. 我们先 ...

  3. 关于Unity3D动态生成连续性网格几何体总结【第三部分】(贴图篇)

    关于Unity3D动态生成连续性网格几何体总结[第三部分](贴图篇) 文章目录 关于Unity3D动态生成连续性网格几何体总结[第三部分](贴图篇) 前言 一.动态建立UV值 二.贴图的平铺与拉伸 二 ...

  4. html怎样实现动态背景效果,利用jQuery实现动态背景特效

    特效描述:利用jQuery实现 动态背景特效.利用jQuery实现动态背景特效 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 Example 1 ooh, pretty. Notic ...

  5. vue 模拟随机变速的动态打字特效【支持多行文本】(含css实现闪烁光标,js动态改变setInterval定时器的时间间隔)

    随机变速的动态打字特效–最终效果 随机变速的动态打字特效–完整代码 <template><div class="contentBox"><span&g ...

  6. java实现3D动态效果_js实现3D粒子酷炫动态旋转特效

    js实现3D粒子酷炫动态旋转特效(效果比较酷炫,中途不仅有形态的变换,还有颜色的变化,希望大家能够喜欢) 代码实现过程中的静态截图 New Document html,body{ margin:0px ...

  7. Unity3d 动态字体

    https://www.xuebuyuan.com/2147872.html Unity3d 动态字体 2014年09月05日 ⁄ 综合 ⁄ 共 2101字 ⁄ 字号 小 中 大 ⁄ 评论关闭 目前测 ...

  8. 文字动态发光特效代码简单实现

    第一种方法: <html><head><title>文字动态发光特效代码</title></head><body bgcolor=&q ...

  9. CSS3 实现圆圈动态发光特效动画的制作

    CSS3实现圆圈动态发光特效动画 1.首先建设div大盒子,然后在里面建设小盒子,建设三个小div盒子,代表三个圈圈的标签 2.在样式中建设style样式,并与html的div盒子标签层层对应 代码入 ...

最新文章

  1. [JVM]常用JVM工具使用
  2. CentOS 6.5/6.6 安装mysql 5.7 最完整版教程
  3. python学生类出不来中文_Python 这类看起来学习门槛低的语言,是否真的适合入门编程学习?...
  4. 搬家,又一次和过往告别
  5. 【ELK123】ElasticSearch+Kibana
  6. java if语句练习
  7. 3.3 keras模型构建的三种方式
  8. 最具发展前景的8大行业,IT行业排第一!
  9. 腾讯云数据库 TDSQL—— 私有云安装部署手册
  10. 开源BI工具对比(一):BI介绍
  11. 国际电话号码标准格式
  12. 微软的序列号生成和验证
  13. 38 Power Query-背后的贤内助 M 语言
  14. 主成分分析法(PCA)解析与MATLAB实践
  15. Matlab - 产生高斯噪声
  16. php中reset是什么意思,reset是什么意思
  17. 浅谈雷达与其火灾探测功能
  18. 德州仪器推出3D霍尔效应位置传感器;天旦亮相2021中国IPv6创新发展大会;Amazfit发布全新品牌标志 | 全球TMT...
  19. PDF文件不能编辑的原因7
  20. 汽车软件开发者的内功心法:V模型

热门文章

  1. 浅谈 AI 大模型的崛起与未来展望:马斯克的 xAI 与中国产业发展
  2. Linux-USB驱动笔记(四)--USB整体框架
  3. OpenGL ES for Android 绘制立方体
  4. AttributeError: ‘module’ object has no attribute’xxx 问题解决
  5. 任务3之磨刀霍霍向猪羊
  6. SilverLight教程
  7. R语言使用ega包的plotClarkeGrid函数可视化clarke error grid误差分析图、克拉克误差网格分析:可视化误差网络图及相关拟合曲线
  8. C++中的void*理解
  9. 在 JavaScript 中三个点‘...‘的意思
  10. 关于永磁同步电机机械特性的疑问?