Skip to content

Commit

Permalink
Refactoring (#12)
Browse files Browse the repository at this point in the history
* Split methods in NavigationManagerEditor

* Fix calling GUI from constructor instead of OnEnable

* Upd ExampleScene
  • Loading branch information
Hermesiss authored Mar 26, 2019
1 parent 5290005 commit a5735f7
Show file tree
Hide file tree
Showing 3 changed files with 7,094 additions and 1,866 deletions.
267 changes: 159 additions & 108 deletions Assets/Trismegistus/Navigation/Editor/NavigationManagerEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,19 @@ private enum Mode

private Mode _currentMode = Mode.None;
private int _indexFrom = -1;

private GUIStyle _customGui;
private Color _guiBackgroundColor;

#region Editor

void OnEnable()
{
_lastTool = Tools.current;
Tools.current = Tool.None;

_customGui = new GUIStyle(EditorStyles.helpBox)
{alignment = TextAnchor.MiddleCenter};
_guiBackgroundColor = GUI.backgroundColor;
var navManager = (NavigationManager) target;

if (!navManager.NavigationData) return;
Expand All @@ -43,134 +48,56 @@ void OnDisable()
public override void OnInspectorGUI()
{
EditorGUI.BeginChangeCheck();
var customGui = new GUIStyle(EditorStyles.helpBox) {alignment = TextAnchor.MiddleCenter};

var guiBackgroundColor = GUI.backgroundColor;
var navManager = (NavigationManager) target;

navManager.NavigationData = EditorGUILayout.ObjectField("Navigation Data",
navManager.NavigationData, typeof(NavigationData), false) as NavigationData;
serializedObject.Update();

if (navManager.NavigationData == null)
{
GUILayout.Label("You must add navigation data!", EditorStyles.helpBox);
if (GUILayout.Button("Create navigation data"))
{
var path = EditorUtility.SaveFilePanelInProject("Save NavigationData asset", "New NavigationData",
"asset", "Enter name");
var navData = CreateInstance<NavigationData>();
AssetDatabase.CreateAsset(navData, path);
navManager.NavigationData = navData;
}

return;
}
if (DrawNavData(navManager)) return;

serializedObject.Update();

navManager.GradientForWaypoints =
EditorGUILayout.GradientField("Waypoint coloring gradient", navManager.GradientForWaypoints);

EditorGUI.BeginChangeCheck();
{
navManager.IsCycled = EditorGUILayout.Toggle("Closed spline", navManager.IsCycled);
DrawParams(navManager);

navManager.StickToColliders = EditorGUILayout.Toggle("Stick to colliders", navManager.StickToColliders);
DrawSmoothing(navManager);

if (navManager.StickToColliders)
{
LayerMask tempMask = EditorGUILayout.MaskField("Raycast mask",
InternalEditorUtility.LayerMaskToConcatenatedLayersMask(navManager.LayerMask),
InternalEditorUtility.layers);

navManager.LayerMask = InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(tempMask);
}
}
if (EditorGUI.EndChangeCheck()) navManager.CalculateWaypoints();

serializedObject.Update();
var onClick = serializedObject.FindProperty("WaypointChanged");

EditorGUILayout.PropertyField(onClick, new GUIContent("On Waypoint Changed"));
serializedObject.ApplyModifiedProperties();
if (DrawAddButton(navManager)) return;

EditorGUILayout.BeginHorizontal();
{
GUI.enabled = navManager.Iterations > 0;
if (GUILayout.Button("-", GUILayout.Width(30)))
{
navManager.Iterations--;
navManager.CalculateWaypoints();
EditorUtility.SetDirty(target);
}
if (DrawWaypoints(navManager)) return;

GUI.enabled = true;
EditorGUILayout.LabelField("Smoothing per unit:");
var prevIterations = navManager.Iterations;
navManager.Iterations = EditorGUILayout.IntField(navManager.Iterations);
if (prevIterations != navManager.Iterations)
{
navManager.CalculateWaypoints();
EditorUtility.SetDirty(target);
}

if (GUILayout.Button("+", GUILayout.Width(30)))
{
navManager.Iterations++;
navManager.CalculateWaypoints();
EditorUtility.SetDirty(target);
}

if (GUILayout.Button("Reload", GUILayout.Width(50)))
{
EditorUtility.SetDirty(target);
navManager.CalculateWaypoints();
}
}
EditorGUILayout.EndHorizontal();

EditorGUILayout.BeginHorizontal(EditorStyles.boldLabel);
{
if (GUILayout.Button(
new GUIContent(_currentMode == Mode.Add ? "x" : "+", "Hold shift to add to the end"),
GUILayout.Width(30)))
{
if (navManager.Waypoints.Count == 0 || Event.current.shift)
{
navManager.AddWaypoint();
return;
}

_currentMode = _currentMode == Mode.Add ? Mode.None : Mode.Add;
}

GUI.enabled = true;
}
EditorGUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck())
SceneView.RepaintAll();
}

/// <summary>
///
/// </summary>
/// <param name="navManager"></param>
/// <returns>Need to break OnInspectorGUI</returns>
private bool DrawWaypoints(NavigationManager navManager)
{
var w = navManager.Waypoints;

for (int i = 0; i <= w.Count; i++)
{
var showMoveButton = _indexFrom != i && _indexFrom != i - 1;

if (_currentMode == Mode.Add)
{
if (GUILayout.Button("Add"))
{
navManager.AddWaypoint(i);
_currentMode = Mode.None;
return;
return true;
}
}

if (_currentMode == Mode.Move && _indexFrom != i && _indexFrom != i - 1)
if (_currentMode == Mode.Move && showMoveButton)
{
if (GUILayout.Button("Move here"))
{
navManager.Relocate(_indexFrom, i);
_currentMode = Mode.None;
_indexFrom = -1;
return;
return true;
}
}

Expand All @@ -180,8 +107,8 @@ public override void OnInspectorGUI()
EditorGUILayout.BeginVertical(GUILayout.Width(30));
{
GUI.backgroundColor = w[i].LabelColor;
GUILayout.Label($"{i + 1}", customGui);
GUI.backgroundColor = guiBackgroundColor;
GUILayout.Label($"{i + 1}", _customGui);
GUI.backgroundColor = _guiBackgroundColor;
}
EditorGUILayout.EndVertical();
EditorGUILayout.BeginVertical();
Expand All @@ -192,12 +119,12 @@ public override void OnInspectorGUI()
{
_currentMode = Mode.None;
_indexFrom = -1;
return;
return true;
}

_indexFrom = i;
_currentMode = Mode.Move;
return;
return true;
}

if (GUILayout.Button(
Expand All @@ -208,7 +135,7 @@ public override void OnInspectorGUI()
"You will lose all it's data", "Delete", "Cancel"))
{
navManager.DeleteWaypoint(i);
return;
return true;
}
}
}
Expand All @@ -234,8 +161,132 @@ public override void OnInspectorGUI()
}
EditorGUILayout.EndHorizontal();
}
if (EditorGUI.EndChangeCheck())
SceneView.RepaintAll();

return false;
}


/// <summary>
/// Draws "add waypoint" button
/// </summary>
/// <param name="navManager"></param>
/// <returns>Need to break OnInspectorGUI</returns>
private bool DrawAddButton(NavigationManager navManager)
{
EditorGUILayout.BeginHorizontal(EditorStyles.boldLabel);
{
if (GUILayout.Button(
new GUIContent(_currentMode == Mode.Add ? "x" : "+", "Hold shift to add to the end"),
GUILayout.Width(30)))
{
if (navManager.Waypoints.Count == 0 || Event.current.shift)
{
navManager.AddWaypoint();
return true;
}

_currentMode = _currentMode == Mode.Add ? Mode.None : Mode.Add;
}

GUI.enabled = true;
}
EditorGUILayout.EndHorizontal();
return false;
}

private void DrawSmoothing(NavigationManager navManager)
{
EditorGUILayout.BeginHorizontal();
{
GUI.enabled = navManager.Iterations > 0;
if (GUILayout.Button("-", GUILayout.Width(30)))
{
navManager.Iterations--;
navManager.CalculateWaypoints();
EditorUtility.SetDirty(target);
}

GUI.enabled = true;
EditorGUILayout.LabelField("Smoothing per unit:");
var prevIterations = navManager.Iterations;
navManager.Iterations = EditorGUILayout.IntField(navManager.Iterations);
if (prevIterations != navManager.Iterations)
{
navManager.CalculateWaypoints();
EditorUtility.SetDirty(target);
}

if (GUILayout.Button("+", GUILayout.Width(30)))
{
navManager.Iterations++;
navManager.CalculateWaypoints();
EditorUtility.SetDirty(target);
}

if (GUILayout.Button("Reload", GUILayout.Width(50)))
{
EditorUtility.SetDirty(target);
navManager.CalculateWaypoints();
}
}
EditorGUILayout.EndHorizontal();
}

/// <summary>
/// Draws gradient, closed and colliders params
/// </summary>
/// <param name="navManager"></param>
private static void DrawParams(NavigationManager navManager)
{
EditorGUI.BeginChangeCheck();
{
navManager.GradientForWaypoints =
EditorGUILayout.GradientField("Waypoint coloring gradient", navManager.GradientForWaypoints);

navManager.IsCycled = EditorGUILayout.Toggle("Closed spline", navManager.IsCycled);

navManager.StickToColliders = EditorGUILayout.Toggle("Stick to colliders", navManager.StickToColliders);

if (navManager.StickToColliders)
{
LayerMask tempMask = EditorGUILayout.MaskField("Raycast mask",
InternalEditorUtility.LayerMaskToConcatenatedLayersMask(navManager.LayerMask),
InternalEditorUtility.layers);

navManager.LayerMask = InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(tempMask);
}
}
if (EditorGUI.EndChangeCheck()) navManager.CalculateWaypoints();
}

/// <summary>
/// Draws NavigationData field
/// </summary>
/// <param name="navManager"></param>
/// <returns>Need to break OnInspectorGUI</returns>
private bool DrawNavData(NavigationManager navManager)
{
navManager.NavigationData = EditorGUILayout.ObjectField("Navigation Data",
navManager.NavigationData, typeof(NavigationData), false) as NavigationData;
serializedObject.Update();

if (navManager.NavigationData == null)
{
GUILayout.Label("You must add navigation data!", EditorStyles.helpBox);
if (GUILayout.Button("Create navigation data"))
{
var path = EditorUtility.SaveFilePanelInProject("Save NavigationData asset",
"New NavigationData",
"asset", "Enter name");
var navData = CreateInstance<NavigationData>();
AssetDatabase.CreateAsset(navData, path);
navManager.NavigationData = navData;
}

return true;
}

return false;
}

private void OnSceneGUI()
Expand Down Expand Up @@ -267,7 +318,7 @@ public static void CreateNavigator()
var parent = Selection.activeTransform;
var navigatorGuid = AssetDatabase.FindAssets("Navigation t:Prefab").First();
var navigatorPath = AssetDatabase.GUIDToAssetPath(navigatorGuid);
Debug.Log($"Navigator prefab finded at {navigatorPath}");
Debug.Log($"Navigator prefab found at {navigatorPath}");
var navigatorPrefab = AssetDatabase.LoadAssetAtPath(navigatorPath, typeof(GameObject));
var navigator = Instantiate(navigatorPrefab, parent);
navigator.name = navigatorPrefab.name;
Expand Down
Loading

0 comments on commit a5735f7

Please sign in to comment.