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 frag sampler2D _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】动态路径特效

【Unity3D】动态路径特效的更多相关文章

  1. Unity3d 动态加载场景物件与缓存池的使用

    聊聊Unity3d动态加载场景物件那些事儿. 众所周知,在策划或美术设计完游戏场景地图后,一个场景中可能会存在成千上万个小的物件,比如石头,木箱子,油桶,栅栏等等等等,这些物件并不是游戏中的道具,仅仅 ...

  2. 于Unity3D动态创建对象和创建Prefab三种方式的原型对象

    于Unity3D动态创建对象和创建Prefab三种方式的原型对象 u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject o ...

  3. leaflet动态路径

    在leaflet中使用动态路径需要结合插件使用,对比了好几个插件,最终找到leaflet.motion比较合适: leaflet地址:https://leafletjs.com/ leaflet.mo ...

  4. UnityShader - 模拟动态光照特效

    模型贴片 + 特效Shader = 动态光照特效 效果是这样的: 做法简单粗暴,直接使用模型贴片: shader上使用了noise只是提供一种思路,也有更简单的方法代替

  5. Unity3D动态加载外部资源

    最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...

  6. unity3d动态加载dll的API以及限制

    Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Androi ...

  7. unity3d动态加载资源

    在Unity3D的网络游戏中实现资源动态加载 分类: 最新学习2012-06-14 13:35 1127人阅读 评论(0) 收藏 举报 网络游戏nullvectorjson游戏string 用Unit ...

  8. Unity3D 动态改变地形

    直接获取TerrainData进行修改即可 using System.Collections; using UnityEngine; using UnityEditor; public class D ...

  9. Unity3d 动态批处理的问题

    这段时间做unity3d的优化,主要的入手是减少draw call.    1.代码上主要是把一些零碎的同材质的合并成一个大的mesh.    2.减少不必要的全屏后期处理.把摄像机的renderin ...

  10. Unity3D动态读取外部MP3文件给AudioSource

    在PC端VR游戏开发中,需要动态加载本地的MP3文件,但是Unity3D不知道出于什么原因,到5.4.0也不支持MP3文件的外部加载(目前只支持wav和ogg). 因此要想通过www来加载mp3文件就 ...

随机推荐

  1. 支持typecho博客的黑白模式纪念日插件

    插件说明 一个可以在指定日期让你的网站变成黑白模式的纪念日插件,以此来缅怀那些逝去的生命.我使用typecho博客系统,handsome主体,该插件完美适配. 设置效果 插件开启前,页面为彩色: 效果 ...

  2. webshell工具流量特征

    常见的webshell管理工具及流量特征 菜刀 作为老牌 Webshell 管理神器,中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场景中越来越少使用,加密 Webshell 正变得日趋流行 ...

  3. == 与 equals 的区别?

    一. 介绍: Java中的 "=="  是一个运算符,是用于比较两个对象地址值或基本数据类型之间的值是否相等.它的来源可以追溯到C语言,以及受C语言影响的许多其他编程语言. Jav ...

  4. 详解TCP网络协议栈的工作原理

    本文分享自华为云社区<网络通信的神奇之旅:解密Linux TCP网络协议栈的工作原理>,作者: Lion Long . 一.TCP网络开发API TCP,全称传输控制协议(Transmis ...

  5. 2023-07-25:你驾驶出租车行驶在一条有 n 个地点的路上 这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n 通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向 乘

    2023-07-25:你驾驶出租车行驶在一条有 n 个地点的路上 这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n 通过接乘客订单盈利.你只能沿着编号递增的方向前进,不能改变方向 乘 ...

  6. Linux 命令:diff

    用途 示例 备注 查看区别 diff file_1 file_2 不加选项 并排输出 diff file_1 file_2 -y -W 50 类似vimdiff 生成patch diff -ruN f ...

  7. 2021-8-2 Mysql个人练习题

    创建学生表 CREATE TABLE student( id int, uname VARCHAR(20), chinese FLOAT, english FLOAT, math FLOAT ); I ...

  8. 2021-7-30 MySql函数的使用归类整理

    Mysql字符的使用 SELECT ASCII(user_password) as 阿斯克码 FROM users;#返回首字符的ascii码 SELECT CHAR_LENGTH(user_pass ...

  9. Numpy,一篇足以

    numpy 用于数值计算 ndarray, 一个有效的多维数组,能提供以数组为导向的快速数值计算和灵活的广播功能(broadcasting) 便利的数学函数 用于读取/写入(reading/writi ...

  10. centos7安装weblogic

    前言 简介:weblogic是java应用服务器软件的一种,类似于tomcat,但功能更多,适用于大型应用场景. 版本: 系统:centos 7(最小化安装,无图形化界面) jdk: oraclejd ...