mirror of
				https://github.com/DerTyp7/defrain-shooter-unity.git
				synced 2025-10-31 13:37:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
