mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 19:10:32 +00:00
123 lines
4.5 KiB
C#
123 lines
4.5 KiB
C#
#if ENABLE_UNET
|
|
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
|
|
namespace UnityEditor
|
|
{
|
|
[CustomEditor(typeof(NetworkIdentity), true)]
|
|
[CanEditMultipleObjects]
|
|
public class NetworkIdentityEditor : Editor
|
|
{
|
|
SerializedProperty m_ServerOnlyProperty;
|
|
SerializedProperty m_LocalPlayerAuthorityProperty;
|
|
|
|
GUIContent m_ServerOnlyLabel;
|
|
GUIContent m_LocalPlayerAuthorityLabel;
|
|
GUIContent m_SpawnLabel;
|
|
|
|
NetworkIdentity m_NetworkIdentity;
|
|
bool m_Initialized;
|
|
bool m_ShowObservers;
|
|
|
|
void Init()
|
|
{
|
|
if (m_Initialized)
|
|
{
|
|
return;
|
|
}
|
|
m_Initialized = true;
|
|
m_NetworkIdentity = target as NetworkIdentity;
|
|
|
|
m_ServerOnlyProperty = serializedObject.FindProperty("m_ServerOnly");
|
|
m_LocalPlayerAuthorityProperty = serializedObject.FindProperty("m_LocalPlayerAuthority");
|
|
|
|
m_ServerOnlyLabel = new GUIContent("Server Only", "True if the object should only exist on the server.");
|
|
m_LocalPlayerAuthorityLabel = new GUIContent("Local Player Authority", "True if this object will be controlled by a player on a client.");
|
|
m_SpawnLabel = new GUIContent("Spawn Object", "This causes an unspawned server object to be spawned on clients");
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
if (m_ServerOnlyProperty == null)
|
|
{
|
|
m_Initialized = false;
|
|
}
|
|
|
|
Init();
|
|
|
|
serializedObject.Update();
|
|
|
|
if (m_ServerOnlyProperty.boolValue)
|
|
{
|
|
EditorGUILayout.PropertyField(m_ServerOnlyProperty, m_ServerOnlyLabel);
|
|
EditorGUILayout.LabelField("Local Player Authority cannot be set for server-only objects");
|
|
}
|
|
else if (m_LocalPlayerAuthorityProperty.boolValue)
|
|
{
|
|
EditorGUILayout.LabelField("Server Only cannot be set for Local Player Authority objects");
|
|
EditorGUILayout.PropertyField(m_LocalPlayerAuthorityProperty, m_LocalPlayerAuthorityLabel);
|
|
}
|
|
else
|
|
{
|
|
EditorGUILayout.PropertyField(m_ServerOnlyProperty, m_ServerOnlyLabel);
|
|
EditorGUILayout.PropertyField(m_LocalPlayerAuthorityProperty, m_LocalPlayerAuthorityLabel);
|
|
}
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
if (!Application.isPlaying)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Runtime actions below here
|
|
|
|
EditorGUILayout.Separator();
|
|
|
|
if (m_NetworkIdentity.observers != null && m_NetworkIdentity.observers.Count > 0)
|
|
{
|
|
m_ShowObservers = EditorGUILayout.Foldout(m_ShowObservers, "Observers");
|
|
if (m_ShowObservers)
|
|
{
|
|
EditorGUI.indentLevel += 1;
|
|
foreach (var o in m_NetworkIdentity.observers)
|
|
{
|
|
GameObject obj = null;
|
|
foreach (var p in o.playerControllers)
|
|
{
|
|
if (p != null)
|
|
{
|
|
obj = p.gameObject;
|
|
break;
|
|
}
|
|
}
|
|
if (obj)
|
|
EditorGUILayout.ObjectField("Connection " + o.connectionId, obj, typeof(GameObject), false);
|
|
else
|
|
EditorGUILayout.TextField("Connection " + o.connectionId);
|
|
}
|
|
EditorGUI.indentLevel -= 1;
|
|
}
|
|
}
|
|
|
|
PrefabType prefabType = PrefabUtility.GetPrefabType(m_NetworkIdentity.gameObject);
|
|
if (prefabType == PrefabType.Prefab)
|
|
return;
|
|
|
|
if (m_NetworkIdentity.gameObject.activeSelf && m_NetworkIdentity.netId.IsEmpty() && NetworkServer.active)
|
|
{
|
|
EditorGUILayout.BeginHorizontal();
|
|
EditorGUILayout.LabelField(m_SpawnLabel);
|
|
if (GUILayout.Toggle(false, "Spawn", EditorStyles.miniButtonLeft))
|
|
{
|
|
NetworkServer.Spawn(m_NetworkIdentity.gameObject);
|
|
EditorUtility.SetDirty(target); // preview window STILL doens't update immediately..
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif //ENABLE_UNET
|