This commit is contained in:
2020-07-04 14:41:25 +08:00
parent 70c346d2c1
commit a8f02e4da5
3748 changed files with 587372 additions and 0 deletions

View File

@@ -0,0 +1,115 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
using Coolape;
[CanEditMultipleObjects]
[CustomEditor(typeof(CLAStarPathSearch), true)]
public class ECLAStarPathSearchInspector : Editor
{
CLAStarPathSearch instance;
List<Vector3> path = null;
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);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2a736eb82c341417086823d31c7fafe1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,125 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using Coolape;
[CanEditMultipleObjects]
[CustomEditor(typeof(CLSeekerByRay), true)]
public class ECLSeekerByRayInspector : Editor
{
CLSeekerByRay instance;
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);
uicontnt = new GUIContent("is Moving", "正在移动");
EditorGUILayout.Toggle(uicontnt, instance.canMove);
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();
EditorUtility.SetDirty(target);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d9ee6527b0b6545e09610f05e334a380
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,90 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using Coolape;
[CanEditMultipleObjects]
[CustomEditor(typeof(CLSeeker), true)]
public class ECLSeekerInspector : Editor
{
CLSeeker instance;
public override void OnInspectorGUI()
{
instance = target as CLSeeker;
//DrawDefaultInspector();
ECLEditorUtl.BeginContents();
{
EditorGUILayout.HelpBox(
"配合A星使用的seeker。\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;
uicontnt = new GUIContent("AStar Instance", "A星寻路实例,如果不设值在运行时自动使用CLAStarPathSearch.current");
instance.mAStarPathSearch = (CLAStarPathSearch)EditorGUILayout.ObjectField(uicontnt, instance.mAStarPathSearch, typeof(CLAStarPathSearch));
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);
uicontnt = new GUIContent("is Moving", "正在移动");
EditorGUILayout.Toggle(uicontnt, instance.canMove);
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();
EditorUtility.SetDirty(target);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 25b1b246b918247d5afd6d0d87705132
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: