init
This commit is contained in:
commit
001bb14f16
951 changed files with 270074 additions and 0 deletions
258
Assets/NavMeshComponents/Editor/NavMeshComponentsGUIUtility.cs
Normal file
258
Assets/NavMeshComponents/Editor/NavMeshComponentsGUIUtility.cs
Normal file
|
@ -0,0 +1,258 @@
|
|||
using UnityEngine;
|
||||
using UnityEngine.AI;
|
||||
|
||||
namespace UnityEditor.AI
|
||||
{
|
||||
public static class NavMeshComponentsGUIUtility
|
||||
{
|
||||
public static void AreaPopup(string labelName, SerializedProperty areaProperty)
|
||||
{
|
||||
var areaIndex = -1;
|
||||
var areaNames = GameObjectUtility.GetNavMeshAreaNames();
|
||||
for (var i = 0; i < areaNames.Length; i++)
|
||||
{
|
||||
var areaValue = GameObjectUtility.GetNavMeshAreaFromName(areaNames[i]);
|
||||
if (areaValue == areaProperty.intValue)
|
||||
areaIndex = i;
|
||||
}
|
||||
ArrayUtility.Add(ref areaNames, "");
|
||||
ArrayUtility.Add(ref areaNames, "Open Area Settings...");
|
||||
|
||||
var rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);
|
||||
EditorGUI.BeginProperty(rect, GUIContent.none, areaProperty);
|
||||
|
||||
EditorGUI.BeginChangeCheck();
|
||||
areaIndex = EditorGUI.Popup(rect, labelName, areaIndex, areaNames);
|
||||
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
if (areaIndex >= 0 && areaIndex < areaNames.Length - 2)
|
||||
areaProperty.intValue = GameObjectUtility.GetNavMeshAreaFromName(areaNames[areaIndex]);
|
||||
else if (areaIndex == areaNames.Length - 1)
|
||||
NavMeshEditorHelpers.OpenAreaSettings();
|
||||
}
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
|
||||
public static void AgentTypePopup(string labelName, SerializedProperty agentTypeID)
|
||||
{
|
||||
var index = -1;
|
||||
var count = NavMesh.GetSettingsCount();
|
||||
var agentTypeNames = new string[count + 2];
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
var id = NavMesh.GetSettingsByIndex(i).agentTypeID;
|
||||
var name = NavMesh.GetSettingsNameFromID(id);
|
||||
agentTypeNames[i] = name;
|
||||
if (id == agentTypeID.intValue)
|
||||
index = i;
|
||||
}
|
||||
agentTypeNames[count] = "";
|
||||
agentTypeNames[count + 1] = "Open Agent Settings...";
|
||||
|
||||
bool validAgentType = index != -1;
|
||||
if (!validAgentType)
|
||||
{
|
||||
EditorGUILayout.HelpBox("Agent Type invalid.", MessageType.Warning);
|
||||
}
|
||||
|
||||
var rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);
|
||||
EditorGUI.BeginProperty(rect, GUIContent.none, agentTypeID);
|
||||
|
||||
EditorGUI.BeginChangeCheck();
|
||||
index = EditorGUI.Popup(rect, labelName, index, agentTypeNames);
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
if (index >= 0 && index < count)
|
||||
{
|
||||
var id = NavMesh.GetSettingsByIndex(index).agentTypeID;
|
||||
agentTypeID.intValue = id;
|
||||
}
|
||||
else if (index == count + 1)
|
||||
{
|
||||
NavMeshEditorHelpers.OpenAgentSettings(-1);
|
||||
}
|
||||
}
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
|
||||
// Agent mask is a set (internally array/list) of agentTypeIDs.
|
||||
// It is used to describe which agents modifiers apply to.
|
||||
// There is a special case of "None" which is an empty array.
|
||||
// There is a special case of "All" which is an array of length 1, and value of -1.
|
||||
public static void AgentMaskPopup(string labelName, SerializedProperty agentMask)
|
||||
{
|
||||
// Contents of the dropdown box.
|
||||
string popupContent = "";
|
||||
|
||||
if (agentMask.hasMultipleDifferentValues)
|
||||
popupContent = "\u2014";
|
||||
else
|
||||
popupContent = GetAgentMaskLabelName(agentMask);
|
||||
|
||||
var content = new GUIContent(popupContent);
|
||||
var popupRect = GUILayoutUtility.GetRect(content, EditorStyles.popup);
|
||||
|
||||
EditorGUI.BeginProperty(popupRect, GUIContent.none, agentMask);
|
||||
popupRect = EditorGUI.PrefixLabel(popupRect, 0, new GUIContent(labelName));
|
||||
bool pressed = GUI.Button(popupRect, content, EditorStyles.popup);
|
||||
|
||||
if (pressed)
|
||||
{
|
||||
var show = !agentMask.hasMultipleDifferentValues;
|
||||
var showNone = show && agentMask.arraySize == 0;
|
||||
var showAll = show && IsAll(agentMask);
|
||||
|
||||
var menu = new GenericMenu();
|
||||
menu.AddItem(new GUIContent("None"), showNone, SetAgentMaskNone, agentMask);
|
||||
menu.AddItem(new GUIContent("All"), showAll, SetAgentMaskAll, agentMask);
|
||||
menu.AddSeparator("");
|
||||
|
||||
var count = NavMesh.GetSettingsCount();
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
var id = NavMesh.GetSettingsByIndex(i).agentTypeID;
|
||||
var sname = NavMesh.GetSettingsNameFromID(id);
|
||||
|
||||
var showSelected = show && AgentMaskHasSelectedAgentTypeID(agentMask, id);
|
||||
var userData = new object[] { agentMask, id, !showSelected };
|
||||
menu.AddItem(new GUIContent(sname), showSelected, ToggleAgentMaskItem, userData);
|
||||
}
|
||||
|
||||
menu.DropDown(popupRect);
|
||||
}
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
|
||||
public static GameObject CreateAndSelectGameObject(string suggestedName, GameObject parent)
|
||||
{
|
||||
var parentTransform = parent != null ? parent.transform : null;
|
||||
var uniqueName = GameObjectUtility.GetUniqueNameForSibling(parentTransform, suggestedName);
|
||||
var child = new GameObject(uniqueName);
|
||||
|
||||
Undo.RegisterCreatedObjectUndo(child, "Create " + uniqueName);
|
||||
if (parentTransform != null)
|
||||
Undo.SetTransformParent(child.transform, parentTransform, "Parent " + uniqueName);
|
||||
|
||||
Selection.activeGameObject = child;
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
static bool IsAll(SerializedProperty agentMask)
|
||||
{
|
||||
return agentMask.arraySize == 1 && agentMask.GetArrayElementAtIndex(0).intValue == -1;
|
||||
}
|
||||
|
||||
static void ToggleAgentMaskItem(object userData)
|
||||
{
|
||||
var args = (object[])userData;
|
||||
var agentMask = (SerializedProperty)args[0];
|
||||
var agentTypeID = (int)args[1];
|
||||
var value = (bool)args[2];
|
||||
|
||||
ToggleAgentMaskItem(agentMask, agentTypeID, value);
|
||||
}
|
||||
|
||||
static void ToggleAgentMaskItem(SerializedProperty agentMask, int agentTypeID, bool value)
|
||||
{
|
||||
if (agentMask.hasMultipleDifferentValues)
|
||||
{
|
||||
agentMask.ClearArray();
|
||||
agentMask.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
// Find which index this agent type is in the agentMask array.
|
||||
int idx = -1;
|
||||
for (var j = 0; j < agentMask.arraySize; j++)
|
||||
{
|
||||
var elem = agentMask.GetArrayElementAtIndex(j);
|
||||
if (elem.intValue == agentTypeID)
|
||||
idx = j;
|
||||
}
|
||||
|
||||
// Handle "All" special case.
|
||||
if (IsAll(agentMask))
|
||||
{
|
||||
agentMask.DeleteArrayElementAtIndex(0);
|
||||
}
|
||||
|
||||
// Toggle value.
|
||||
if (value)
|
||||
{
|
||||
if (idx == -1)
|
||||
{
|
||||
agentMask.InsertArrayElementAtIndex(agentMask.arraySize);
|
||||
agentMask.GetArrayElementAtIndex(agentMask.arraySize - 1).intValue = agentTypeID;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (idx != -1)
|
||||
{
|
||||
agentMask.DeleteArrayElementAtIndex(idx);
|
||||
}
|
||||
}
|
||||
|
||||
agentMask.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
static void SetAgentMaskNone(object data)
|
||||
{
|
||||
var agentMask = (SerializedProperty)data;
|
||||
agentMask.ClearArray();
|
||||
agentMask.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
static void SetAgentMaskAll(object data)
|
||||
{
|
||||
var agentMask = (SerializedProperty)data;
|
||||
agentMask.ClearArray();
|
||||
agentMask.InsertArrayElementAtIndex(0);
|
||||
agentMask.GetArrayElementAtIndex(0).intValue = -1;
|
||||
agentMask.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
static string GetAgentMaskLabelName(SerializedProperty agentMask)
|
||||
{
|
||||
if (agentMask.arraySize == 0)
|
||||
return "None";
|
||||
|
||||
if (IsAll(agentMask))
|
||||
return "All";
|
||||
|
||||
if (agentMask.arraySize <= 3)
|
||||
{
|
||||
var labelName = "";
|
||||
for (var j = 0; j < agentMask.arraySize; j++)
|
||||
{
|
||||
var elem = agentMask.GetArrayElementAtIndex(j);
|
||||
var settingsName = NavMesh.GetSettingsNameFromID(elem.intValue);
|
||||
if (string.IsNullOrEmpty(settingsName))
|
||||
continue;
|
||||
|
||||
if (labelName.Length > 0)
|
||||
labelName += ", ";
|
||||
labelName += settingsName;
|
||||
}
|
||||
return labelName;
|
||||
}
|
||||
|
||||
return "Mixed...";
|
||||
}
|
||||
|
||||
static bool AgentMaskHasSelectedAgentTypeID(SerializedProperty agentMask, int agentTypeID)
|
||||
{
|
||||
for (var j = 0; j < agentMask.arraySize; j++)
|
||||
{
|
||||
var elem = agentMask.GetArrayElementAtIndex(j);
|
||||
if (elem.intValue == agentTypeID)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue