123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- using UnityEditor;
- using UnityEditorInternal;
- using UnityEngine;
- namespace Mirror
- {
- [CustomEditor(typeof(NetworkManager), true)]
- [CanEditMultipleObjects]
- public class NetworkManagerEditor : Editor
- {
- SerializedProperty spawnListProperty;
- ReorderableList spawnList;
- protected NetworkManager networkManager;
- protected void Init()
- {
- if (spawnList == null)
- {
- networkManager = target as NetworkManager;
- spawnListProperty = serializedObject.FindProperty("spawnPrefabs");
- spawnList = new ReorderableList(serializedObject, spawnListProperty)
- {
- drawHeaderCallback = DrawHeader,
- drawElementCallback = DrawChild,
- onReorderCallback = Changed,
- onRemoveCallback = RemoveButton,
- onChangedCallback = Changed,
- onAddCallback = AddButton,
- // this uses a 16x16 icon. other sizes make it stretch.
- elementHeight = 16
- };
- }
- }
- public override void OnInspectorGUI()
- {
- Init();
- DrawDefaultInspector();
- EditorGUI.BeginChangeCheck();
- spawnList.DoLayoutList();
- if (EditorGUI.EndChangeCheck())
- {
- serializedObject.ApplyModifiedProperties();
- }
- }
- static void DrawHeader(Rect headerRect)
- {
- GUI.Label(headerRect, "Registered Spawnable Prefabs:");
- }
- internal void DrawChild(Rect r, int index, bool isActive, bool isFocused)
- {
- SerializedProperty prefab = spawnListProperty.GetArrayElementAtIndex(index);
- GameObject go = (GameObject)prefab.objectReferenceValue;
- GUIContent label;
- if (go == null)
- {
- label = new GUIContent("Empty", "Drag a prefab with a NetworkIdentity here");
- }
- else
- {
- NetworkIdentity identity = go.GetComponent<NetworkIdentity>();
- label = new GUIContent(go.name, identity != null ? "AssetId: [" + identity.assetId + "]" : "No Network Identity");
- }
- GameObject newGameObject = (GameObject)EditorGUI.ObjectField(r, label, go, typeof(GameObject), false);
- if (newGameObject != go)
- {
- if (newGameObject != null && !newGameObject.GetComponent<NetworkIdentity>())
- {
- Debug.LogError("Prefab " + newGameObject + " cannot be added as spawnable as it doesn't have a NetworkIdentity.");
- return;
- }
- prefab.objectReferenceValue = newGameObject;
- }
- }
- internal void Changed(ReorderableList list)
- {
- EditorUtility.SetDirty(target);
- }
- internal void AddButton(ReorderableList list)
- {
- spawnListProperty.arraySize += 1;
- list.index = spawnListProperty.arraySize - 1;
- SerializedProperty obj = spawnListProperty.GetArrayElementAtIndex(spawnListProperty.arraySize - 1);
- obj.objectReferenceValue = null;
- spawnList.index = spawnList.count - 1;
- Changed(list);
- }
- internal void RemoveButton(ReorderableList list)
- {
- spawnListProperty.DeleteArrayElementAtIndex(spawnList.index);
- if (list.index >= spawnListProperty.arraySize)
- {
- list.index = spawnListProperty.arraySize - 1;
- }
- }
- }
- }
|