public override void OnInspectorGUI() { instance = target as CLSeekerByRay; //DrawDefaultInspector(); ECLEditorUtl.BeginContents(); { EditorGUILayout.HelpBox( "通过射线寻路\n" + "【注意注意注意】\n" + " 1.不需要A星;\n" + " 2.只能处理简单的寻路,最好是每个目标点都是可到达的;\n" + " 3.如果某个点不能到达,则肯定会寻设置的最大的寻路次数;\n" + "主要方法:\n" + " .init();//初始化回调:寻路完成的回调,移动过程中的回调,到达目的地的回调\n" + " .seek();//寻路,完成后会调用在init里设置的回调函数,第一个参数是路径,第二个参数为能否到达目的地\n" + " .seekTarget();//寻路,会定时重新寻目标对象的路径\n" + " .cancelSeekTarget();//取消对目标对象的定时寻路\n" + " .startMove();//开始移动,只能通过此方法,不能直接改变canMove变量\n" + " .stopMove();//停止移动\n" , MessageType.None, true); } ECLEditorUtl.EndContents(); ECLEditorUtl.BeginContents(); { GUI.color = Color.yellow; GUILayout.Label("*鼠标悬停在字段上有解释"); GUI.color = Color.white; GUIContent uicontnt = null; ECLEditorUtl.BeginContents(); { uicontnt = new GUIContent("Obstruct Mask", "障碍物的layer"); instance.obstructMask = ECLEditorUtl.drawMaskField(uicontnt, instance.obstructMask); uicontnt = new GUIContent("Ray Distance", "每次寻路发射的射线长度用于检测障碍物"); instance.rayDistance = EditorGUILayout.FloatField(uicontnt, instance.rayDistance); uicontnt = new GUIContent("Ray Height", "每次寻路发射的射线高度用于检测障碍物"); instance.rayHeight = EditorGUILayout.FloatField(uicontnt, instance.rayHeight); uicontnt = new GUIContent("Ray Dirs", "4方向、8方向、16方向发射线寻路"); instance.rayDirs = (CLSeekerByRay.SearchDirs)EditorGUILayout.EnumPopup(uicontnt, instance.rayDirs); uicontnt = new GUIContent("Max Search Times", "最大寻路次数,防止死循环"); instance.maxSearchTimes = EditorGUILayout.IntField(uicontnt, instance.maxSearchTimes); } ECLEditorUtl.EndContents(); uicontnt = new GUIContent("Target", "目标对象"); instance.target = (Transform)EditorGUILayout.ObjectField(uicontnt, instance.target, typeof(Transform)); uicontnt = new GUIContent("Move Speed", "移动速度"); instance.speed = EditorGUILayout.FloatField(uicontnt, instance.speed); uicontnt = new GUIContent("Turning Speed", "转动速度,【注意】当为负数时表示立即转到目标方向,大于0时则会慢慢转向目标方向"); instance.turningSpeed = EditorGUILayout.FloatField(uicontnt, instance.turningSpeed); uicontnt = new GUIContent("EndReached Distance", "离目标到一定距离后结束移动"); instance.endReachedDistance = EditorGUILayout.FloatField(uicontnt, instance.endReachedDistance); uicontnt = new GUIContent("Auto Move After Seek", "当寻路完成后就移动过去"); instance.autoMoveOnFinishSeek = EditorGUILayout.Toggle(uicontnt, instance.autoMoveOnFinishSeek); uicontnt = new GUIContent("Moving By", "能哪种update移动"); instance.movingBy = (CLSeeker.MovingBy)EditorGUILayout.EnumPopup(uicontnt, instance.movingBy); uicontnt = new GUIContent("Moving Unscaled Time", "移动时忽略时间的缩放"); instance.unscaledTime = EditorGUILayout.Toggle(uicontnt, instance.unscaledTime); ECLEditorUtl.BeginContents(); { uicontnt = new GUIContent("Soften Path", "柔化路径"); instance.isSoftenPath = EditorGUILayout.Toggle(uicontnt, instance.isSoftenPath); if (instance.isSoftenPath) { uicontnt = new GUIContent("Soften Type", "柔化路径的方式,line:直接把路径分段的接点处分成两个点进行柔;sler:在路径分段的接点处加入曲面插值"); instance.softenPathType = (CLAIPathUtl.SoftenPathType)EditorGUILayout.EnumPopup(uicontnt, instance.softenPathType); if (instance.softenPathType == CLAIPathUtl.SoftenPathType.Slerp) { uicontnt = new GUIContent("Soften Slerp Factor", "曲面插值的个数,【注意】不能太大"); instance.softenFactor = EditorGUILayout.IntField(uicontnt, instance.softenFactor); } } } ECLEditorUtl.EndContents(); uicontnt = new GUIContent("Debug Show Path", "显示路径"); instance.showPath = EditorGUILayout.Toggle(uicontnt, instance.showPath); } ECLEditorUtl.EndContents(); ECLEditorUtl.BeginContents(); { if (GUILayout.Button("Search")) { instance.seek(instance.target.position); } if (GUILayout.Button("SearchTarget")) { instance.seekTarget(instance.target); } if (GUILayout.Button("Cancel SearchTarget")) { instance.cancelSeekTarget(); } if (GUILayout.Button("Begain Move")) { instance.startMove(); } if (GUILayout.Button("Stop Move")) { instance.stopMove(); } } ECLEditorUtl.EndContents(); }
public override void OnInspectorGUI() { instance = target as CLAStarPathSearch; //DrawDefaultInspector(); ECLEditorUtl.BeginContents(); { EditorGUILayout.HelpBox( "简单的A星寻路,目前只支持y轴朝上的情况,不支持有高度的寻路。\n" + "主要方法:\n" + " CLAStarPathSearch.current. //当前A星的实例\n" + " .init();//初始化网格\n" + " .scan();//扫描网格,就是设置哪些格子是不可通过的\n" + " .scanRange(center, r);//刷新坐标center,半径为r的网格的障碍状态\n" + " .searchPath(from, to, out vectorList);//寻路" , MessageType.None, true); } ECLEditorUtl.EndContents(); ECLEditorUtl.BeginContents(); { GUI.color = Color.yellow; GUILayout.Label("*鼠标悬停在字段上有解释"); GUI.color = Color.white; GUIContent uicontnt = null; uicontnt = new GUIContent("Row", "行(网格的长)"); instance.numRows = EditorGUILayout.IntField(uicontnt, instance.numRows); uicontnt = new GUIContent("Column", "列(网格的宽)"); instance.numCols = EditorGUILayout.IntField(uicontnt, instance.numCols); uicontnt = new GUIContent("Cell Size", "网格单元的大小"); instance.cellSize = EditorGUILayout.FloatField(uicontnt, instance.cellSize); uicontnt = new GUIContent("Neighbours", "一个单元格的寻路方向数量。(4方向/8方向)"); instance.numNeighbours = (CLAStarPathSearch.NumNeighbours)(EditorGUILayout.EnumPopup(uicontnt, instance.numNeighbours)); uicontnt = new GUIContent("Scan Type", "扫描类型.ObstructNode:扫描障碍层设置不可通行的格子;PassableNode:扫描设置可通行的节点;"); instance.scanType = (CLAStarPathSearch.ScanType)EditorGUILayout.EnumPopup(uicontnt, instance.scanType); //if (instance.scanType == CLAStarPathSearch.ScanType.PassableNode) //{ // GUI.enabled = false; //} uicontnt = new GUIContent("Obstruct Mask", "障碍物的layer"); instance.obstructMask = ECLEditorUtl.drawMaskField(uicontnt, instance.obstructMask); GUI.enabled = true; if (instance.scanType == CLAStarPathSearch.ScanType.ObstructNode) { GUI.enabled = false; } uicontnt = new GUIContent("Passable Mask", "可通行节点的layer"); instance.passableMask = ECLEditorUtl.drawMaskField(uicontnt, instance.passableMask); GUI.enabled = true; uicontnt = new GUIContent("Scan Ray Direction", "射线检测障碍的发射方向"); instance.rayDirection = (CLAStarPathSearch.RayDirection)(EditorGUILayout.EnumPopup(uicontnt, instance.rayDirection)); uicontnt = new GUIContent("Scan Ray Distance", "射线检测障碍的和射线长度"); instance.rayDis4Scan = EditorGUILayout.FloatField(uicontnt, instance.rayDis4Scan); uicontnt = new GUIContent("Auto Scan", "自动扫描网格的障碍,其实就是在Start方法中自动调用init和Scan方法"); instance.isAutoScan = EditorGUILayout.Toggle(uicontnt, instance.isAutoScan); uicontnt = new GUIContent("Need Cache Paths", "把寻路得到的数据缓存起来,可以重复使用"); instance.needCachePaths = EditorGUILayout.Toggle(uicontnt, instance.needCachePaths); ECLEditorUtl.BeginContents(); { uicontnt = new GUIContent("Filter Path By Ray", "通过射线检测障碍来过滤掉冗余的点,因此要注意障碍物的collider的高度及大小,以免射线检测不到"); instance.isFilterPathByRay = EditorGUILayout.Toggle(uicontnt, instance.isFilterPathByRay); uicontnt = new GUIContent("Soften Path", "柔化路径"); instance.isSoftenPath = EditorGUILayout.Toggle(uicontnt, instance.isSoftenPath); if (instance.isSoftenPath) { uicontnt = new GUIContent("Soften Type", "柔化路径的方式,line:直接把路径分段的接点处分成两个点进行柔;sler:在路径分段的接点处加入曲面插值"); instance.softenPathType = (CLAIPathUtl.SoftenPathType)EditorGUILayout.EnumPopup(uicontnt, instance.softenPathType); if (instance.softenPathType == CLAIPathUtl.SoftenPathType.Slerp) { uicontnt = new GUIContent("Soften Slerp Factor", "曲面插值的个数,【注意】不能太大"); instance.softenFactor = EditorGUILayout.IntField(uicontnt, instance.softenFactor); } } } ECLEditorUtl.EndContents(); uicontnt = new GUIContent("Debug Show Grid", "显示网格"); instance.showGrid = EditorGUILayout.Toggle(uicontnt, instance.showGrid); uicontnt = new GUIContent("Debug Show Obstruct", "显示网格障碍"); instance.showObstruct = EditorGUILayout.Toggle(uicontnt, instance.showObstruct); } ECLEditorUtl.EndContents(); ECLEditorUtl.BeginContents(); { if (GUILayout.Button("init")) { instance.init(); } if (GUILayout.Button("Scan")) { instance.scan(); } } ECLEditorUtl.EndContents(); EditorUtility.SetDirty(target); }