101 lines
3.3 KiB
C#
101 lines
3.3 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
namespace Pathfinding {
|
|
[CustomEditor(typeof(NavmeshCut))]
|
|
[CanEditMultipleObjects]
|
|
public class NavmeshCutEditor : EditorBase {
|
|
GUIContent[] MeshTypeOptions = new [] {
|
|
new GUIContent("Rectangle (legacy)"),
|
|
new GUIContent("Circle (legacy)"),
|
|
new GUIContent("Custom Mesh"),
|
|
new GUIContent("Box"),
|
|
new GUIContent("Sphere"),
|
|
new GUIContent("Capsule"),
|
|
};
|
|
|
|
protected override void Inspector () {
|
|
// Make sure graphs are deserialized.
|
|
// The gizmos on the navmesh cut uses the graph information to visualize the character radius
|
|
AstarPath.FindAstarPath();
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
var type = FindProperty("type");
|
|
var circleResolution = FindProperty("circleResolution");
|
|
Popup("type", MeshTypeOptions, label: "Shape");
|
|
EditorGUI.indentLevel++;
|
|
|
|
if (!type.hasMultipleDifferentValues) {
|
|
switch ((NavmeshCut.MeshType)type.intValue) {
|
|
case NavmeshCut.MeshType.Circle:
|
|
case NavmeshCut.MeshType.Capsule:
|
|
FloatField("circleRadius", "Radius", min: 0.01f);
|
|
PropertyField("circleResolution", "Resolution");
|
|
FloatField("height", min: 0f);
|
|
|
|
if (circleResolution.intValue >= 20) {
|
|
EditorGUILayout.HelpBox("Be careful with large resolutions. It is often better with a relatively low resolution since it generates cleaner navmeshes with fewer nodes.", MessageType.Warning);
|
|
}
|
|
break;
|
|
case NavmeshCut.MeshType.Sphere:
|
|
FloatField("circleRadius", "Radius", min: 0.01f);
|
|
PropertyField("circleResolution", "Resolution");
|
|
|
|
if (circleResolution.intValue >= 20) {
|
|
EditorGUILayout.HelpBox("Be careful with large resolutions. It is often better with a relatively low resolution since it generates cleaner navmeshes with fewer nodes.", MessageType.Warning);
|
|
}
|
|
break;
|
|
case NavmeshCut.MeshType.Rectangle:
|
|
PropertyField("rectangleSize");
|
|
FloatField("height", min: 0f);
|
|
break;
|
|
case NavmeshCut.MeshType.Box:
|
|
PropertyField("rectangleSize.x", "Width");
|
|
PropertyField("height", "Height");
|
|
PropertyField("rectangleSize.y", "Depth");
|
|
break;
|
|
case NavmeshCut.MeshType.CustomMesh:
|
|
PropertyField("mesh");
|
|
PropertyField("meshScale");
|
|
FloatField("height", min: 0f);
|
|
EditorGUILayout.HelpBox("This mesh should be a planar surface. Take a look at the documentation for an example.", MessageType.Info);
|
|
break;
|
|
}
|
|
}
|
|
|
|
PropertyField("center");
|
|
EditorGUI.indentLevel--;
|
|
|
|
EditorGUILayout.Separator();
|
|
PropertyField("updateDistance");
|
|
if (PropertyField("useRotationAndScale")) {
|
|
EditorGUI.indentLevel++;
|
|
FloatField("updateRotationDistance", min: 0f, max: 180f);
|
|
EditorGUI.indentLevel--;
|
|
}
|
|
|
|
PropertyField("isDual");
|
|
PropertyField("cutsAddedGeom", "Cuts Added Geometry");
|
|
PropertyField("radiusExpansionMode", "Radius Expansion");
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
PropertyField("graphMask", "Affected Graphs");
|
|
bool changedMask = EditorGUI.EndChangeCheck();
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
foreach (NavmeshCut tg in targets) {
|
|
tg.ForceUpdate();
|
|
// If the mask is changed we disable and then enable the component
|
|
// to make sure it is removed from the right graphs and then added back
|
|
if (changedMask && tg.enabled) {
|
|
tg.enabled = false;
|
|
tg.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|