经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » unity » 查看文章
【Unity3D】动态路径特效
来源:cnblogs  作者:little_fat_sheep  时间:2023/10/13 8:41:04  对本文有异议

1 前言

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

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

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

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

2 烘焙导航网格

? 1)搭建场景

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

img

? 2)设置导航静态对象

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

img

? 3)烘焙导航网格

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

img

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

img

3 导航及轨迹绘制

? NavController.cs

  1. using UnityEngine;
  2. using UnityEngine.AI;
  3. public class NavController : MonoBehaviour {
  4. private NavMeshAgent navMeshAgent; // 导航网格代理
  5. private LineRenderer lineRenderer; // 线段渲染器
  6. private RaycastHit hit; // 碰撞信息
  7. private NavMeshPath path; // 导航路径
  8. private void Awake() {
  9. AddNavMeshAgent();
  10. AddLineRenderer();
  11. }
  12. private void Update() {
  13. if (Input.GetMouseButtonUp(0) && navMeshAgent.remainingDistance < float.Epsilon) {
  14. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  15. if (Physics.Raycast(ray, out hit)) {
  16. if (navMeshAgent.CalculatePath(hit.point, path)) {
  17. DrawLine(path.corners);
  18. navMeshAgent.SetDestination(hit.point);
  19. } else {
  20. lineRenderer.positionCount = 0;
  21. lineRenderer.enabled = false;
  22. }
  23. }
  24. }
  25. }
  26. private void AddNavMeshAgent() { // 添加导航网格代理
  27. navMeshAgent = gameObject.AddComponent<NavMeshAgent>();
  28. navMeshAgent.speed = 100;
  29. navMeshAgent.angularSpeed = 10000;
  30. navMeshAgent.acceleration = 10000;
  31. path = new NavMeshPath();
  32. }
  33. private void AddLineRenderer() { // 添加线段渲染器
  34. lineRenderer = gameObject.AddComponent<LineRenderer>();
  35. lineRenderer.textureMode = LineTextureMode.Tile;
  36. lineRenderer.material = Resources.Load<Material>("PathNodeMat");
  37. lineRenderer.positionCount = 0;
  38. lineRenderer.enabled = false;
  39. }
  40. private void DrawLine(Vector3[] points) { // 绘制顶点
  41. lineRenderer.positionCount = points.Length;
  42. lineRenderer.SetPositions(points);
  43. lineRenderer.enabled = true;
  44. }
  45. }

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

? PathNode.shader

  1. Shader "MyShader/PathNode" { // 路径上的节点移动特效
  2. Properties {
  3. _MainTex("MainTex", 2D) = "white" {} // 节点贴图
  4. _Speed("Speed", Range(0.1, 3)) = 2 // 节点移动速度
  5. _Color("Color", Color) = (1, 1, 1, 1) // 节点颜色
  6. }
  7. SubShader {
  8. tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True"}
  9. Blend SrcAlpha OneMinusSrcAlpha // 混合
  10. // Cull off // 双面
  11. Pass {
  12. CGPROGRAM
  13. #include "UnityCG.cginc"
  14. #pragma vertex vert
  15. #pragma fragment frag
  16. sampler2D _MainTex; // 节点贴图
  17. float _Speed; // 节点移动速度
  18. float4 _Color; // 节点颜色
  19. v2f_img vert(appdata_img v) {
  20. v2f_img o;
  21. o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
  22. o.uv = v.texcoord;
  23. o.uv.x -= _Speed * _Time.y; // 通过uv纹理坐标的移动实现节点的移动
  24. return o;
  25. }
  26. fixed4 frag(v2f_img i) : SV_Target {
  27. return tex2D(_MainTex, i.uv) * _Color;
  28. }
  29. ENDCG
  30. }
  31. }
  32. }

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

img

4 运行效果

? 1)路径导航效果

img

? 2)飞机路径节点效果

img

img

? 3)火箭路径节点效果

img

img

? 4)箭头路径节点效果

img

img

img

? 5)其他路径节点效果

img

img

img

? 声明:本文转自【Unity3D】动态路径特效

原文链接:https://www.cnblogs.com/zhyan8/p/17760926.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号