今天工作碰到一个实现NPC巡逻的功能需求,需要程序实现相关逻辑,并且能够让策划自由配置NPC巡逻路径和NPC交互功能。
这里我就想记录一下我利用Unity的Handles画线的功能实现路径可视化的一种方式吧。可能设计不是很好,欢迎各位大佬提出自己的建议。总之下面来看下这个拓展Unity编辑器功能的自制画线组件吧。先上个效果图:
我的设计是这样的:
Npcs下面存放NPC模型,NPC具体的操作这块,就先不在这边说了。
PointList下面存放地图上NPC巡逻的转折点。可以是地图上的一些岔路口,这样可以明确的告知Unity的Nav寻路AI在某个个路口向下一个路口移动,而不是完全依托Nav本身的功能来实现寻路,这样会有更高的路径确定性。
Paths下面存放策划配置的路径,这边也是需要我所用到的Handles画线工具的地方。可以看到我定义的这个组件非常简单只有三个变量空间:
- bool isShowLine=true;//表示是否需要显示线段
- Color lineColor;//自定义线条显示颜色
- List
Paths;//寻路路径转折点
有了这些信息后再有一个继承Editor的类来实现OnSceneGUI()函数就能实现点的连线了。依然是简单且实用。下面是代码:
///画线工具 public class HandlesLineTool : MonoBehaviour { public bool isShowLine = true; public Color lineColor = Color.white; public Listpaths = new List (); }
[CustomEditor(typeof(HandlesLineTool))]
public class HandlesLineEditor :Editor
{
private Vector3[] positions;
public void OnSceneGUI()
{
HandlesLineTool handles = target as HandlesLineTool;
if (!handles.isShowLine)
return;
Handles.color = handles.lineColor;
if (handles.paths == null )
{
return;
}
if (handles.paths.Count > 0)
{
positions = new Vector3[handles.paths.Count];
}
for (var i = 0; i < handles.paths.Count; i++)
{
if(handles.paths[i]==null)
{
continue;
}
positions[i] = handles.paths[i].position;
}
if(positions!=null && positions.Length>0)
Handles.DrawPolyLine(positions);
}
}



