Unity3D_导航路径_在地面上画一条引导路径
1. 搭建如图场景
2. 创建一个空物体,在该物体上添加组件“LineRenderer”
3. 附加材质球,材质球贴图如下
4. 调整颜色渐变效果
5. 创建脚本 ArrowFindPath
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class ArrowFindPath : MonoBehaviour { // 移动到的目标点 public Transform moveEndPoint; // 画线组件 public LineRenderer lineGameObject; // 画线路径点的集合(用于计算 UV ) private List<Vector3> arrowList = new List<Vector3>(); // 增量(一个点与下一个的距离) private Vector3 pointNumber; // 起点到终点分成多少份(在 LineRenderer 组件中添加的 position 数目) private float num; private void Start() { lineGameObject.transform.eulerAngles = new Vector3(90f, 0f, 0f); lineGameObject.startWidth = 0.5f; lineGameObject.endWidth = 0.5f; lineGameObject.alignment = LineAlignment.TransformZ; } void Update() { // 计算点数(除数为:lineGameObject.startWidth,可以避免 1:1 的材质球被拉伸) num = Vector3.Distance(moveEndPoint.position, transform.position) / lineGameObject.startWidth; // 计算增量 pointNumber = (moveEndPoint.position - transform.position) / num; // 给 LineRender 组件的 Position 赋值 for (int i = 0; i < num; i++) { // 从 Ray ray = new Ray((transform.position + i * pointNumber) + Vector3.up * 10f,Vector3.down); RaycastHit hit; if(Physics.Raycast(ray,out hit)){ lineGameObject.positionCount = i + 1; lineGameObject.SetPosition(i, hit.point + (Vector3.up * 0.1f)); arrowList.Add(hit.point + (Vector3.up * 0.1f)); } } // 使 LineRenderer 的前四个值等于第四个值 for (int i = 0; i < 4; i++) { lineGameObject.SetPosition(i, lineGameObject.GetPosition(4)); arrowList[i] = lineGameObject.GetPosition(4); } // 使 LineRenderer 的后四个值等于倒数第四个值 for (int i = 1; i <= 4; i++) { lineGameObject.SetPosition(lineGameObject.positionCount - i, lineGameObject.GetPosition(lineGameObject.positionCount - 4)); arrowList[lineGameObject.positionCount - i] = lineGameObject.GetPosition(lineGameObject.positionCount - 4); } lineGameObject.material.SetTextureScale("_MainTex", new Vector2(UVTiling(arrowList.ToArray(), lineGameObject.startWidth), 1f)); arrowList.Clear(); // 移动效果 lineGameObject.material.SetTextureOffset("_MainTex", new Vector2(UVOffset(lineGameObject.material.GetTextureOffset("_MainTex")), 1f)); } // 计算 UV 值 private float UVTiling(Vector3[] lineNumber,float lineWidth) { float f = 0f; for (int i = 0; i < lineNumber.Length - 1; i++) { f += Vector3.Distance(lineNumber[i], lineNumber[i + 1]); } return f / lineWidth; } private float UVOffset(Vector2 offset) { float f = offset.x; return f -= 0.05f; } // 创建一个游戏物体 private GameObject CreateGameObject(Vector3 position) { GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere); obj.transform.position = position; obj.transform.localScale = Vector3.one * 0.1f; obj.GetComponent<MeshRenderer>().material.color = Color.blue; return obj; } }
6. 将脚本挂载到 Capsule
7. 给脚本的公共变量赋值
分类:
Unity3D
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?