diff --git a/Assets/Mirror/Cloud.meta b/Assets/Mirror/Cloud.meta new file mode 100644 index 00000000..978f39f6 --- /dev/null +++ b/Assets/Mirror/Cloud.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +<<<<<<< HEAD:Assets/Mirror/Tests/Runtime/TestScene.meta +guid: 4b81deaf3bd524b9fba41328bc05176a +======= +guid: 73a9bb2dacafa8141bce8feef34e33a7 +>>>>>>> upstream:Assets/Mirror/Cloud.meta +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/ApiConnector.cs b/Assets/Mirror/Cloud/ApiConnector.cs new file mode 100644 index 00000000..fb6713f6 --- /dev/null +++ b/Assets/Mirror/Cloud/ApiConnector.cs @@ -0,0 +1,61 @@ +using Mirror.Cloud.ListServerService; +using UnityEngine; + +namespace Mirror.Cloud +{ + /// + /// Used to requests and responses from the mirror api + /// + public interface IApiConnector + { + ListServer ListServer { get; } + } + + /// + /// Used to requests and responses from the mirror api + /// + [DisallowMultipleComponent] + [AddComponentMenu("Network/CloudServices/ApiConnector")] + [HelpURL("https://mirror-networking.com/docs/CloudServices/ApiConnector.html")] + public class ApiConnector : MonoBehaviour, IApiConnector, ICoroutineRunner + { + #region Inspector + [Header("Settings")] + + [Tooltip("Base URL of api, including https")] + [SerializeField] string ApiAddress = ""; + + [Tooltip("Api key required to access api")] + [SerializeField] string ApiKey = ""; + + [Header("Events")] + + [Tooltip("Triggered when server list updates")] + [SerializeField] ServerListEvent _onServerListUpdated = new ServerListEvent(); + #endregion + + IRequestCreator requestCreator; + + public ListServer ListServer { get; private set; } + + void Awake() + { + requestCreator = new RequestCreator(ApiAddress, ApiKey, this); + + InitListServer(); + } + + void InitListServer() + { + IListServerServerApi serverApi = new ListServerServerApi(this, requestCreator); + IListServerClientApi clientApi = new ListServerClientApi(this, requestCreator, _onServerListUpdated); + ListServer = new ListServer(serverApi, clientApi); + } + + public void OnDestroy() + { + ListServer.ServerApi.Shutdown(); + ListServer.ClientApi.Shutdown(); + } + } +} diff --git a/Assets/Mirror/Cloud/ApiConnector.cs.meta b/Assets/Mirror/Cloud/ApiConnector.cs.meta new file mode 100644 index 00000000..baa0279a --- /dev/null +++ b/Assets/Mirror/Cloud/ApiConnector.cs.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +<<<<<<< HEAD:Assets/Mirror/Examples/Pong/Scripts/PaddleSpawner.cs.meta +guid: 36a14b30edd4b4ebab8bd1018b677a83 +======= +guid: 8bdb99a29e179d14cb0acc43f175d9ad +>>>>>>> upstream:Assets/Mirror/Cloud/ApiConnector.cs.meta +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/CompilerSymbols.meta b/Assets/Mirror/Cloud/Core.meta similarity index 77% rename from Assets/Mirror/CompilerSymbols.meta rename to Assets/Mirror/Cloud/Core.meta index 375a4ef3..8c000591 100644 --- a/Assets/Mirror/CompilerSymbols.meta +++ b/Assets/Mirror/Cloud/Core.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 236a2ed16c1a34c7d8a0c6b94285da78 +guid: 3f34c32971e65984c93a15376ec11c65 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Mirror/Cloud/Core/BaseApi.cs b/Assets/Mirror/Cloud/Core/BaseApi.cs new file mode 100644 index 00000000..720f5981 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/BaseApi.cs @@ -0,0 +1,25 @@ +using System; + +namespace Mirror.Cloud +{ + public interface IBaseApi + { + /// + /// Cleans up any data created by the instance + /// For Example: removing server from list + /// + void Shutdown(); + } + + public abstract class BaseApi + { + protected readonly ICoroutineRunner runner; + protected readonly IRequestCreator requestCreator; + + protected BaseApi(ICoroutineRunner runner, IRequestCreator requestCreator) + { + this.runner = runner ?? throw new ArgumentNullException(nameof(runner)); + this.requestCreator = requestCreator ?? throw new ArgumentNullException(nameof(requestCreator)); + } + } +} diff --git a/Assets/Mirror/Cloud/Core/BaseApi.cs.meta b/Assets/Mirror/Cloud/Core/BaseApi.cs.meta new file mode 100644 index 00000000..f66b84e1 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/BaseApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 70f563b7a7210ae43bbcde5cb7721a94 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/Events.cs b/Assets/Mirror/Cloud/Core/Events.cs new file mode 100644 index 00000000..ffee4d32 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/Events.cs @@ -0,0 +1,12 @@ +using System; +using Mirror.Cloud.ListServerService; +using UnityEngine.Events; + +namespace Mirror.Cloud +{ + [Serializable] + public class ServerListEvent : UnityEvent { } + + [Serializable] + public class MatchFoundEvent : UnityEvent { } +} diff --git a/Assets/Mirror/Cloud/Core/Events.cs.meta b/Assets/Mirror/Cloud/Core/Events.cs.meta new file mode 100644 index 00000000..150d85b2 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/Events.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7c472a3ea1bc4348bd5a0b05bf7cc3b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/Extensions.cs b/Assets/Mirror/Cloud/Core/Extensions.cs new file mode 100644 index 00000000..fa7dfa70 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/Extensions.cs @@ -0,0 +1,12 @@ +using UnityEngine.Networking; + +namespace Mirror.Cloud +{ + public static class Extensions + { + public static bool IsOk(this UnityWebRequest webRequest) + { + return 200 <= webRequest.responseCode && webRequest.responseCode <= 299; + } + } +} diff --git a/Assets/Mirror/Cloud/Core/Extensions.cs.meta b/Assets/Mirror/Cloud/Core/Extensions.cs.meta new file mode 100644 index 00000000..6bf6291e --- /dev/null +++ b/Assets/Mirror/Cloud/Core/Extensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 97501e783fc67a4459b15d10e6c63563 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/ICoroutineRunner.cs b/Assets/Mirror/Cloud/Core/ICoroutineRunner.cs new file mode 100644 index 00000000..7fe3bbf3 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/ICoroutineRunner.cs @@ -0,0 +1,12 @@ +using System.Collections; +using UnityEngine; + +namespace Mirror.Cloud +{ + public interface ICoroutineRunner : IUnityEqualCheck + { + Coroutine StartCoroutine(IEnumerator routine); + void StopCoroutine(IEnumerator routine); + void StopCoroutine(Coroutine routine); + } +} diff --git a/Assets/Mirror/Cloud/Core/ICoroutineRunner.cs.meta b/Assets/Mirror/Cloud/Core/ICoroutineRunner.cs.meta new file mode 100644 index 00000000..f1149a99 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/ICoroutineRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 43472c60a7c72e54eafe559290dd0fc6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/IRequestCreator.cs b/Assets/Mirror/Cloud/Core/IRequestCreator.cs new file mode 100644 index 00000000..2709707f --- /dev/null +++ b/Assets/Mirror/Cloud/Core/IRequestCreator.cs @@ -0,0 +1,42 @@ +using System.Collections; +using UnityEngine.Networking; + +namespace Mirror.Cloud +{ + public delegate void RequestSuccess(string responseBody); + + public delegate void RequestFail(string responseBody); + + /// + /// Objects that can be sent to the Api must have this interface + /// + public interface ICanBeJson { } + + /// + /// Methods to create and send UnityWebRequest + /// + public interface IRequestCreator + { + UnityWebRequest Delete(string page); + UnityWebRequest Get(string page); + UnityWebRequest Patch(string page, T json) where T : struct, ICanBeJson; + UnityWebRequest Post(string page, T json) where T : struct, ICanBeJson; + + /// + /// Sends Request to api and invokes callback when finished + /// Starts Coroutine of SendRequestEnumerator + /// + /// + /// + /// + void SendRequest(UnityWebRequest request, RequestSuccess onSuccess = null, RequestFail onFail = null); + /// + /// Sends Request to api and invokes callback when finished + /// + /// + /// + /// + /// + IEnumerator SendRequestEnumerator(UnityWebRequest request, RequestSuccess onSuccess = null, RequestFail onFail = null); + } +} diff --git a/Assets/Mirror/Cloud/Core/IRequestCreator.cs.meta b/Assets/Mirror/Cloud/Core/IRequestCreator.cs.meta new file mode 100644 index 00000000..966c5031 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/IRequestCreator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b80b95532a9d6e8418aa676a261e4f69 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/IUnityEqualCheck.cs b/Assets/Mirror/Cloud/Core/IUnityEqualCheck.cs new file mode 100644 index 00000000..be5e057c --- /dev/null +++ b/Assets/Mirror/Cloud/Core/IUnityEqualCheck.cs @@ -0,0 +1,26 @@ +using UnityEngine; + +namespace Mirror.Cloud +{ + /// + /// Adds Extension to check if unity object is null. + /// Use these methods to stop MissingReferenceException + /// + public interface IUnityEqualCheck + { + + } + + public static class UnityEqualCheckExtension + { + public static bool IsNull(this IUnityEqualCheck obj) + { + return (obj as Object) == null; + } + + public static bool IsNotNull(this IUnityEqualCheck obj) + { + return (obj as Object) != null; + } + } +} diff --git a/Assets/Mirror/Cloud/Core/IUnityEqualCheck.cs.meta b/Assets/Mirror/Cloud/Core/IUnityEqualCheck.cs.meta new file mode 100644 index 00000000..7cb2a59f --- /dev/null +++ b/Assets/Mirror/Cloud/Core/IUnityEqualCheck.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05185b973ba389a4588fc8a99c75a4f6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/JsonStructs.cs b/Assets/Mirror/Cloud/Core/JsonStructs.cs new file mode 100644 index 00000000..7827abcb --- /dev/null +++ b/Assets/Mirror/Cloud/Core/JsonStructs.cs @@ -0,0 +1,24 @@ +using System; + +namespace Mirror.Cloud +{ + [Serializable] + public struct CreatedIdJson : ICanBeJson + { + public string id; + } + + [Serializable] + public struct ErrorJson : ICanBeJson + { + public string code; + public string message; + + public int HtmlCode => int.Parse(code); + } + + [Serializable] + public struct EmptyJson : ICanBeJson + { + } +} diff --git a/Assets/Mirror/Cloud/Core/JsonStructs.cs.meta b/Assets/Mirror/Cloud/Core/JsonStructs.cs.meta new file mode 100644 index 00000000..2c040090 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/JsonStructs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0688c0fdae5376e4ea74d5c3904eed17 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/Logger.cs b/Assets/Mirror/Cloud/Core/Logger.cs new file mode 100644 index 00000000..32e22ae0 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/Logger.cs @@ -0,0 +1,65 @@ +using System; +using UnityEngine; +using UnityEngine.Networking; + +namespace Mirror.Cloud +{ + public static class Logger + { + public static bool VerboseLogging = false; + static readonly ILogger logger = LogFactory.GetLogger("MirrorCloudServices"); + + public static void LogRequest(string page, string method, bool hasJson, string json) + { + if (hasJson) + { + logger.LogFormat(LogType.Log, "Request: {0} {1} {2}", method, page, json); + } + else + { + logger.LogFormat(LogType.Log, "Request: {0} {1}", method, page); + } + } + + public static void LogResponse(UnityWebRequest statusRequest) + { + long code = statusRequest.responseCode; + LogType logType = statusRequest.IsOk() + ? LogType.Log + : LogType.Error; + + string format = "Response: {0} {1} {2} {3}"; + if (logger.IsLogTypeAllowed(logType)) + { + // we split path like this to make sure api key doesn't leak + Uri uri = new Uri(statusRequest.url); + string path = string.Join("", uri.Segments); + logger.LogFormat(logType, format, statusRequest.method, code, path, statusRequest.downloadHandler.text); + } + } + + internal static void Log(string msg) + { + if (logger.LogEnabled()) + logger.Log(msg); + } + + internal static void LogWarning(string msg) + { + if (logger.WarnEnabled()) + logger.LogWarning(msg); + } + + internal static void LogError(string msg) + { + if (logger.ErrorEnabled()) + logger.LogError(msg); + } + + internal static void Verbose(string msg) + { + if (VerboseLogging && logger.LogEnabled()) + logger.Log(msg); + } + } +} diff --git a/Assets/Mirror/Cloud/Core/Logger.cs.meta b/Assets/Mirror/Cloud/Core/Logger.cs.meta new file mode 100644 index 00000000..5984ce30 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/Logger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 457ba2df6cb6e1542996c17c715ee81b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Core/RequestCreator.cs b/Assets/Mirror/Cloud/Core/RequestCreator.cs new file mode 100644 index 00000000..7195c0e7 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/RequestCreator.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections; +using System.Text; +using UnityEngine; +using UnityEngine.Networking; + +namespace Mirror.Cloud +{ + /// + /// Methods to create and send UnityWebRequest + /// + public class RequestCreator : IRequestCreator + { + const string GET = "GET"; + const string POST = "POST"; + const string PATCH = "PATCH"; + const string DELETE = "DELETE"; + + public readonly string baseAddress; + public readonly string apiKey; + readonly ICoroutineRunner runner; + + public RequestCreator(string baseAddress, string apiKey, ICoroutineRunner coroutineRunner) + { + if (string.IsNullOrEmpty(baseAddress)) + { + throw new ArgumentNullException(nameof(baseAddress)); + } + + if (string.IsNullOrEmpty(apiKey)) + { + throw new ArgumentNullException(nameof(apiKey)); + } + + this.baseAddress = baseAddress; + this.apiKey = apiKey; + + runner = coroutineRunner ?? throw new ArgumentNullException(nameof(coroutineRunner)); + } + + + Uri CreateUri(string page) + { + return new Uri(string.Format("{0}/{1}?key={2}", baseAddress, page, apiKey)); + } + + UnityWebRequest CreateWebRequest(string page, string method, string json = null) + { + bool hasJson = !string.IsNullOrEmpty(json); + Logger.LogRequest(page, method, hasJson, json); + + UnityWebRequest request = new UnityWebRequest(CreateUri(page)); + request.method = method; + if (hasJson) + { + request.SetRequestHeader("Content-Type", "application/json"); + } + + request.downloadHandler = new DownloadHandlerBuffer(); + + byte[] bodyRaw = hasJson + ? Encoding.UTF8.GetBytes(json) + : null; + + request.uploadHandler = new UploadHandlerRaw(bodyRaw); + + return request; + } + + + + /// + /// Create Get Request to page + /// + /// + /// + public UnityWebRequest Get(string page) + { + return CreateWebRequest(page, GET); + } + + /// + /// Creates Post Request to page with Json body + /// + /// + /// + /// + /// + public UnityWebRequest Post(string page, T json) where T : struct, ICanBeJson + { + string jsonString = JsonUtility.ToJson(json); + return CreateWebRequest(page, POST, jsonString); + } + + /// + /// Creates Patch Request to page with Json body + /// + /// + /// + /// + /// + public UnityWebRequest Patch(string page, T json) where T : struct, ICanBeJson + { + string jsonString = JsonUtility.ToJson(json); + return CreateWebRequest(page, PATCH, jsonString); + } + + /// + /// Create Delete Request to page + /// + /// + /// + public UnityWebRequest Delete(string page) + { + return CreateWebRequest(page, DELETE); + } + + + public void SendRequest(UnityWebRequest request, RequestSuccess onSuccess = null, RequestFail onFail = null) + { + runner.StartCoroutine(SendRequestEnumerator(request, onSuccess, onFail)); + } + + public IEnumerator SendRequestEnumerator(UnityWebRequest request, RequestSuccess onSuccess = null, RequestFail onFail = null) + { + using (UnityWebRequest webRequest = request) + { + yield return webRequest.SendWebRequest(); + Logger.LogResponse(webRequest); + + string text = webRequest.downloadHandler.text; + Logger.Verbose(text); + if (webRequest.IsOk()) + { + onSuccess?.Invoke(text); + } + else + { + onFail?.Invoke(text); + } + } + } + } +} diff --git a/Assets/Mirror/Cloud/Core/RequestCreator.cs.meta b/Assets/Mirror/Cloud/Core/RequestCreator.cs.meta new file mode 100644 index 00000000..eb139af4 --- /dev/null +++ b/Assets/Mirror/Cloud/Core/RequestCreator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cfaa626443cc7c94eae138a2e3a04d7c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Examples/ListServer.meta b/Assets/Mirror/Cloud/ListServer.meta similarity index 77% rename from Assets/Mirror/Examples/ListServer.meta rename to Assets/Mirror/Cloud/ListServer.meta index af33e59e..bc85c3d0 100644 --- a/Assets/Mirror/Examples/ListServer.meta +++ b/Assets/Mirror/Cloud/ListServer.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e192f90e0acbb41f88dfe3dba300a5c9 +guid: c4c4be148a492b143a881cd08bf7e320 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Mirror/Cloud/ListServer/ListServer.cs b/Assets/Mirror/Cloud/ListServer/ListServer.cs new file mode 100644 index 00000000..8b4af805 --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServer.cs @@ -0,0 +1,66 @@ +using System; +using UnityEngine.Events; + +namespace Mirror.Cloud.ListServerService +{ + public sealed class ListServer + { + public readonly IListServerServerApi ServerApi; + public readonly IListServerClientApi ClientApi; + + public ListServer(IListServerServerApi serverApi, IListServerClientApi clientApi) + { + ServerApi = serverApi ?? throw new ArgumentNullException(nameof(serverApi)); + ClientApi = clientApi ?? throw new ArgumentNullException(nameof(clientApi)); + } + } + + public interface IListServerServerApi : IBaseApi + { + /// + /// Has a server been added to the list with this connection + /// + bool ServerInList { get; } + /// + /// Add a server to the list + /// + /// + void AddServer(ServerJson server); + /// + /// Update the current server + /// + /// + void UpdateServer(int newPlayerCount); + /// + /// Update the current server + /// + /// + void UpdateServer(ServerJson server); + /// + /// Removes the current server + /// + void RemoveServer(); + } + + public interface IListServerClientApi : IBaseApi + { + /// + /// Called when the server list is updated + /// + event UnityAction onServerListUpdated; + + /// + /// Get the server list once + /// + void GetServerList(); + /// + /// Start getting the server list every interval + /// + /// + void StartGetServerListRepeat(int interval); + /// + /// Stop getting the server list + /// + void StopGetServerListRepeat(); + } +} diff --git a/Assets/Mirror/Cloud/ListServer/ListServer.cs.meta b/Assets/Mirror/Cloud/ListServer/ListServer.cs.meta new file mode 100644 index 00000000..b243d45a --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServer.cs.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +<<<<<<< HEAD:Assets/Mirror/Examples/ChangeScene/Scripts/SceneSwitcherHud.cs.meta +guid: e03a8e920924641f6a48d4649375f99c +======= +guid: 6f0311899162c5b49a3c11fa9bd9c133 +>>>>>>> upstream:Assets/Mirror/Cloud/ListServer/ListServer.cs.meta +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/ListServer/ListServerBaseApi.cs b/Assets/Mirror/Cloud/ListServer/ListServerBaseApi.cs new file mode 100644 index 00000000..05d2e2e6 --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerBaseApi.cs @@ -0,0 +1,9 @@ +namespace Mirror.Cloud.ListServerService +{ + public abstract class ListServerBaseApi : BaseApi + { + protected ListServerBaseApi(ICoroutineRunner runner, IRequestCreator requestCreator) : base(runner, requestCreator) + { + } + } +} diff --git a/Assets/Mirror/Cloud/ListServer/ListServerBaseApi.cs.meta b/Assets/Mirror/Cloud/ListServer/ListServerBaseApi.cs.meta new file mode 100644 index 00000000..a9d32ea0 --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerBaseApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6838f9df45594d48873518cbb75b329 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/ListServer/ListServerClientApi.cs b/Assets/Mirror/Cloud/ListServer/ListServerClientApi.cs new file mode 100644 index 00000000..22867c17 --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerClientApi.cs @@ -0,0 +1,70 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.Networking; + +namespace Mirror.Cloud.ListServerService +{ + public sealed class ListServerClientApi : ListServerBaseApi, IListServerClientApi + { + readonly ServerListEvent _onServerListUpdated; + + Coroutine getServerListRepeatCoroutine; + + public event UnityAction onServerListUpdated + { + add => _onServerListUpdated.AddListener(value); + remove => _onServerListUpdated.RemoveListener(value); + } + + public ListServerClientApi(ICoroutineRunner runner, IRequestCreator requestCreator, ServerListEvent onServerListUpdated) : base(runner, requestCreator) + { + _onServerListUpdated = onServerListUpdated; + } + + public void Shutdown() + { + StopGetServerListRepeat(); + } + + public void GetServerList() + { + runner.StartCoroutine(getServerList()); + } + + public void StartGetServerListRepeat(int interval) + { + getServerListRepeatCoroutine = runner.StartCoroutine(GetServerListRepeat(interval)); + } + + public void StopGetServerListRepeat() + { + // if runner is null it has been destroyed and will alraedy be null + if (runner.IsNotNull() && getServerListRepeatCoroutine != null) + { + runner.StopCoroutine(getServerListRepeatCoroutine); + } + } + + IEnumerator GetServerListRepeat(int interval) + { + while (true) + { + yield return getServerList(); + + yield return new WaitForSeconds(interval); + } + } + IEnumerator getServerList() + { + UnityWebRequest request = requestCreator.Get("servers"); + yield return requestCreator.SendRequestEnumerator(request, onSuccess); + + void onSuccess(string responseBody) + { + ServerCollectionJson serverlist = JsonUtility.FromJson(responseBody); + _onServerListUpdated?.Invoke(serverlist); + } + } + } +} diff --git a/Assets/Mirror/Cloud/ListServer/ListServerClientApi.cs.meta b/Assets/Mirror/Cloud/ListServer/ListServerClientApi.cs.meta new file mode 100644 index 00000000..306bf7c6 --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerClientApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d49649fb32cb96b46b10f013b38a4b50 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/ListServer/ListServerJson.cs b/Assets/Mirror/Cloud/ListServer/ListServerJson.cs new file mode 100644 index 00000000..72688000 --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerJson.cs @@ -0,0 +1,45 @@ +using System; + +namespace Mirror.Cloud.ListServerService +{ + [Serializable] + public struct ServerCollectionJson : ICanBeJson + { + public ServerJson[] servers; + } + + [Serializable] + public struct ServerJson : ICanBeJson + { + public string protocol; + public int port; + public int playerCount; + public int maxPlayerCount; + + /// + /// optional + /// + public string displayName; + /// + /// This is returns from the api, any incoming address fields will be ignored + /// + public string address; + } + + [Serializable] + public struct PartialServerJson : ICanBeJson + { + /// + /// optional + /// + public int playerCount; + /// + /// optional + /// + public int maxPlayerCount; + /// + /// optional + /// + public string displayName; + } +} diff --git a/Assets/Mirror/Cloud/ListServer/ListServerJson.cs.meta b/Assets/Mirror/Cloud/ListServer/ListServerJson.cs.meta new file mode 100644 index 00000000..7e206f11 --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerJson.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a963606335eae0f47abe7ecb5fd028ea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/ListServer/ListServerServerApi.cs b/Assets/Mirror/Cloud/ListServer/ListServerServerApi.cs new file mode 100644 index 00000000..1d66ae2a --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerServerApi.cs @@ -0,0 +1,222 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.Networking; + +namespace Mirror.Cloud.ListServerService +{ + public sealed class ListServerServerApi : ListServerBaseApi, IListServerServerApi + { + const int PingInterval = 15; + const int MaxPingFails = 3; + + ServerJson currentServer; + string serverId; + + Coroutine _pingCoroutine; + /// + /// If the server has already been added + /// + bool added; + /// + /// if a request is currently sending + /// + bool sending; + /// + /// If an update request was recently sent + /// + bool skipNextPing; + /// + /// How many failed pings in a row + /// + int pingFails = 0; + + public bool ServerInList => added; + + public ListServerServerApi(ICoroutineRunner runner, IRequestCreator requestCreator) : base(runner, requestCreator) + { + } + + public void Shutdown() + { + stopPingCoroutine(); + if (added) + { + removeServerWithoutCoroutine(); + } + added = false; + } + + public void AddServer(ServerJson server) + { + if (added) { Logger.LogWarning("AddServer called when server was already adding or added"); return; } + bool valid = ValidateServerJson(server); + if (!valid) { return; } + + runner.StartCoroutine(addServer(server)); + } + + bool ValidateServerJson(ServerJson server) + { + if (string.IsNullOrEmpty(server.protocol)) + { + Logger.LogError("ServerJson should not have empty protocol"); + return false; + } + if (server.port == 0) + { + Logger.LogError("ServerJson should not have port equal 0"); + return false; + } + if (server.maxPlayerCount == 0) + { + Logger.LogError("ServerJson should not have maxPlayerCount equal 0"); + return false; + } + + return true; + } + + public void UpdateServer(int newPlayerCount) + { + if (!added) { Logger.LogWarning("UpdateServer called when before server was added"); return; } + + currentServer.playerCount = newPlayerCount; + UpdateServer(currentServer); + } + + public void UpdateServer(ServerJson server) + { + // TODO, use PartialServerJson as Arg Instead + if (!added) { Logger.LogWarning("UpdateServer called when before server was added"); return; } + + PartialServerJson partialServer = new PartialServerJson + { + displayName = server.displayName, + playerCount = server.playerCount, + maxPlayerCount = server.maxPlayerCount, + }; + + runner.StartCoroutine(updateServer(partialServer)); + } + + public void RemoveServer() + { + if (!added) { return; } + + stopPingCoroutine(); + runner.StartCoroutine(removeServer()); + } + + void stopPingCoroutine() + { + if (_pingCoroutine != null) + { + runner.StopCoroutine(_pingCoroutine); + _pingCoroutine = null; + } + } + + IEnumerator addServer(ServerJson server) + { + added = true; + sending = true; + currentServer = server; + + UnityWebRequest request = requestCreator.Post("servers", currentServer); + yield return requestCreator.SendRequestEnumerator(request, onSuccess, onFail); + sending = false; + + void onSuccess(string responseBody) + { + CreatedIdJson created = JsonUtility.FromJson(responseBody); + serverId = created.id; + + // Start ping to keep server alive + _pingCoroutine = runner.StartCoroutine(ping()); + } + void onFail(string responseBody) + { + added = false; + } + } + + IEnumerator updateServer(PartialServerJson server) + { + // wait to not be sending + while (sending) + { + yield return new WaitForSeconds(1); + } + + // We need to check added incase Update is called soon after Add, and add failed + if (!added) { Logger.LogWarning("UpdateServer called when before server was added"); yield break; } + + sending = true; + UnityWebRequest request = requestCreator.Patch("servers/" + serverId, server); + yield return requestCreator.SendRequestEnumerator(request, onSuccess); + sending = false; + + void onSuccess(string responseBody) + { + skipNextPing = true; + + if (_pingCoroutine == null) + { + _pingCoroutine = runner.StartCoroutine(ping()); + } + } + } + + /// + /// Keeps server alive in database + /// + /// + IEnumerator ping() + { + while (pingFails <= MaxPingFails) + { + yield return new WaitForSeconds(PingInterval); + if (skipNextPing) { continue; } + + sending = true; + UnityWebRequest request = requestCreator.Patch("servers/" + serverId, new EmptyJson()); + yield return requestCreator.SendRequestEnumerator(request, onSuccess, onFail); + sending = false; + } + + Logger.LogWarning("Max ping fails reached, stoping to ping server"); + _pingCoroutine = null; + + + void onSuccess(string responseBody) + { + pingFails = 0; + } + void onFail(string responseBody) + { + pingFails++; + } + } + + IEnumerator removeServer() + { + sending = true; + UnityWebRequest request = requestCreator.Delete("servers/" + serverId); + yield return requestCreator.SendRequestEnumerator(request); + sending = false; + + added = false; + } + + void removeServerWithoutCoroutine() + { + UnityWebRequest request = requestCreator.Delete("servers/" + serverId); + UnityWebRequestAsyncOperation operation = request.SendWebRequest(); + + operation.completed += (op) => + { + Logger.LogResponse(request); + }; + } + } +} diff --git a/Assets/Mirror/Cloud/ListServer/ListServerServerApi.cs.meta b/Assets/Mirror/Cloud/ListServer/ListServerServerApi.cs.meta new file mode 100644 index 00000000..82e23fdf --- /dev/null +++ b/Assets/Mirror/Cloud/ListServer/ListServerServerApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 675f0d0fd4e82b04290c4d30c8d78ede +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/Mirror.Cloud.asmdef b/Assets/Mirror/Cloud/Mirror.Cloud.asmdef new file mode 100644 index 00000000..dbea9716 --- /dev/null +++ b/Assets/Mirror/Cloud/Mirror.Cloud.asmdef @@ -0,0 +1,14 @@ +{ + "name": "Mirror.Cloud", + "references": [ + "Mirror" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/Mirror/Cloud/Mirror.Cloud.asmdef.meta b/Assets/Mirror/Cloud/Mirror.Cloud.asmdef.meta new file mode 100644 index 00000000..bd17c2b3 --- /dev/null +++ b/Assets/Mirror/Cloud/Mirror.Cloud.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c21ba7b8c3183cb47b7fe3b3799d49c4 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/README.md b/Assets/Mirror/Cloud/README.md new file mode 100644 index 00000000..00128ce5 --- /dev/null +++ b/Assets/Mirror/Cloud/README.md @@ -0,0 +1,19 @@ +# Mirror Cloud Services + +## Mirror List Server + +Example has API key that can be used for as a demo. + +To get an API key to use within your game you can subscribe on the [Mirror Networking Website](https://mirror-networking.com/list-server/) + +### Key features + +- The Cloud Service works via https so is secure and can be used from any platform. +- It runs on Google Cloud so there is no worry about server down time. +- It scales really well. Default quota is 1000 API requests per minute. If you have high demands, contact us and we can increase that limit. + +## List Server Examples + +An example for this can be found in Mirror/Examples/Cloud/ + +*Note: you can not connect to your own public ip address, you will need at least people to test this* \ No newline at end of file diff --git a/Assets/Mirror/Cloud/README.md.meta b/Assets/Mirror/Cloud/README.md.meta new file mode 100644 index 00000000..d669f54f --- /dev/null +++ b/Assets/Mirror/Cloud/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 04945d14ccbed964597a1ee00805c059 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Cloud/version.txt b/Assets/Mirror/Cloud/version.txt new file mode 100644 index 00000000..7b0bc8d6 --- /dev/null +++ b/Assets/Mirror/Cloud/version.txt @@ -0,0 +1 @@ +MirrorCloudServices v0.1.0 \ No newline at end of file diff --git a/Assets/Mirror/Cloud/version.txt.meta b/Assets/Mirror/Cloud/version.txt.meta new file mode 100644 index 00000000..1e13fd52 --- /dev/null +++ b/Assets/Mirror/Cloud/version.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bf81e376b88e68e48a47531b8bfeb0f4 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Components/Experimental/NetworkRigidbody.cs b/Assets/Mirror/Components/Experimental/NetworkRigidbody.cs new file mode 100644 index 00000000..3d08d1b2 --- /dev/null +++ b/Assets/Mirror/Components/Experimental/NetworkRigidbody.cs @@ -0,0 +1,363 @@ +using UnityEngine; + +namespace Mirror.Experimental +{ + [AddComponentMenu("Network/Experimental/NetworkRigidbody")] + [HelpURL("https://mirror-networking.com/docs/Components/NetworkRigidbody.html")] + public class NetworkRigidbody : NetworkBehaviour + { + static readonly ILogger logger = LogFactory.GetLogger(typeof(NetworkRigidbody)); + + [Header("Settings")] + [SerializeField] internal Rigidbody target = null; + + [Tooltip("Set to true if moves come from owner client, set to false if moves always come from server")] + [SerializeField] bool clientAuthority = false; + + [Header("Velocity")] + + [Tooltip("Syncs Velocity every SyncInterval")] + [SerializeField] bool syncVelocity = true; + + [Tooltip("Set velocity to 0 each frame (only works if syncVelocity is false")] + [SerializeField] bool clearVelocity = false; + + [Tooltip("Only Syncs Value if distance between previous and current is great than sensitivity")] + [SerializeField] float velocitySensitivity = 0.1f; + + + [Header("Angular Velocity")] + + [Tooltip("Syncs AngularVelocity every SyncInterval")] + [SerializeField] bool syncAngularVelocity = true; + + [Tooltip("Set angularVelocity to 0 each frame (only works if syncAngularVelocity is false")] + [SerializeField] bool clearAngularVelocity = false; + + [Tooltip("Only Syncs Value if distance between previous and current is great than sensitivity")] + [SerializeField] float angularVelocitySensitivity = 0.1f; + + /// + /// Values sent on client with authoirty after they are sent to the server + /// + readonly ClientSyncState previousValue = new ClientSyncState(); + + void OnValidate() + { + if (target == null) + { + target = GetComponent(); + } + } + + + #region Sync vars + [SyncVar(hook = nameof(OnVelocityChanged))] + Vector3 velocity; + + [SyncVar(hook = nameof(OnAngularVelocityChanged))] + Vector3 angularVelocity; + + [SyncVar(hook = nameof(OnIsKinematicChanged))] + bool isKinematic; + + [SyncVar(hook = nameof(OnUseGravityChanged))] + bool useGravity; + + [SyncVar(hook = nameof(OnuDragChanged))] + float drag; + + [SyncVar(hook = nameof(OnAngularDragChanged))] + float angularDrag; + + /// + /// Ignore value if is host or client with Authority + /// + /// + bool IgnoreSync => IsServer || ClientWithAuthority; + + bool ClientWithAuthority => clientAuthority && HasAuthority; + + void OnVelocityChanged(Vector3 _, Vector3 newValue) + { + if (IgnoreSync) + return; + + target.velocity = newValue; + } + + + void OnAngularVelocityChanged(Vector3 _, Vector3 newValue) + { + if (IgnoreSync) + return; + + target.angularVelocity = newValue; + } + + void OnIsKinematicChanged(bool _, bool newValue) + { + if (IgnoreSync) + return; + + target.isKinematic = newValue; + } + + void OnUseGravityChanged(bool _, bool newValue) + { + if (IgnoreSync) + return; + + target.useGravity = newValue; + } + + void OnuDragChanged(float _, float newValue) + { + if (IgnoreSync) + return; + + target.drag = newValue; + } + + void OnAngularDragChanged(float _, float newValue) + { + if (IgnoreSync) + return; + + target.angularDrag = newValue; + } + #endregion + + + internal void Update() + { + if (IsServer) + { + SyncToClients(); + } + else if (ClientWithAuthority) + { + SendToServer(); + } + } + + internal void FixedUpdate() + { + if (clearAngularVelocity && !syncAngularVelocity) + { + target.angularVelocity = Vector3.zero; + } + + if (clearVelocity && !syncVelocity) + { + target.velocity = Vector3.zero; + } + } + + /// + /// Updates sync var values on server so that they sync to the client + /// + [Server] + void SyncToClients() + { + // only update if they have changed more than Sensitivity + + Vector3 currentVelocity = syncVelocity ? target.velocity : default; + Vector3 currentAngularVelocity = syncAngularVelocity ? target.angularVelocity : default; + + bool velocityChanged = syncVelocity && ((previousValue.velocity - currentVelocity).sqrMagnitude > velocitySensitivity * velocitySensitivity); + bool angularVelocityChanged = syncAngularVelocity && ((previousValue.angularVelocity - currentAngularVelocity).sqrMagnitude > angularVelocitySensitivity * angularVelocitySensitivity); + + if (velocityChanged) + { + velocity = currentVelocity; + previousValue.velocity = currentVelocity; + } + + if (angularVelocityChanged) + { + angularVelocity = currentVelocity; + previousValue.angularVelocity = currentAngularVelocity; + } + + // other rigidbody settings + isKinematic = target.isKinematic; + useGravity = target.useGravity; + drag = target.drag; + angularDrag = target.angularDrag; + } + + /// + /// Uses Command to send values to server + /// + [Client] + void SendToServer() + { + if (!HasAuthority) + { + logger.LogWarning("SendToServer called without authority"); + return; + } + + SendVelocity(); + SendRigidBodySettings(); + } + + [Client] + void SendVelocity() + { + float now = Time.time; + if (now < previousValue.nextSyncTime) + return; + + Vector3 currentVelocity = syncVelocity ? target.velocity : default; + Vector3 currentAngularVelocity = syncAngularVelocity ? target.angularVelocity : default; + + bool velocityChanged = syncVelocity && ((previousValue.velocity - currentVelocity).sqrMagnitude > velocitySensitivity * velocitySensitivity); + bool angularVelocityChanged = syncAngularVelocity && ((previousValue.angularVelocity - currentAngularVelocity).sqrMagnitude > angularVelocitySensitivity * angularVelocitySensitivity); + + // if angularVelocity has changed it is likely that velocity has also changed so just sync both values + // however if only velocity has changed just send velocity + if (angularVelocityChanged) + { + CmdSendVelocityAndAngular(currentVelocity, currentAngularVelocity); + previousValue.velocity = currentVelocity; + previousValue.angularVelocity = currentAngularVelocity; + } + else if (velocityChanged) + { + CmdSendVelocity(currentVelocity); + previousValue.velocity = currentVelocity; + } + + + // only update syncTime if either has changed + if (angularVelocityChanged || velocityChanged) + { + previousValue.nextSyncTime = now + syncInterval; + } + } + + [Client] + void SendRigidBodySettings() + { + // These shouldn't change often so it is ok to send in their own Command + if (previousValue.isKinematic != target.isKinematic) + { + CmdSendIsKinematic(target.isKinematic); + previousValue.isKinematic = target.isKinematic; + } + if (previousValue.useGravity != target.useGravity) + { + CmdSendUseGravity(target.useGravity); + previousValue.useGravity = target.useGravity; + } + if (previousValue.drag != target.drag) + { + CmdSendDrag(target.drag); + previousValue.drag = target.drag; + } + if (previousValue.angularDrag != target.angularDrag) + { + CmdSendAngularDrag(target.angularDrag); + previousValue.angularDrag = target.angularDrag; + } + } + + /// + /// Called when only Velocity has changed on the client + /// + [Command] + void CmdSendVelocity(Vector3 velocity) + { + // Ignore messages from client if not in client authority mode + if (!clientAuthority) + return; + + this.velocity = velocity; + target.velocity = velocity; + } + + /// + /// Called when angularVelocity has changed on the client + /// + [Command] + void CmdSendVelocityAndAngular(Vector3 velocity, Vector3 angularVelocity) + { + // Ignore messages from client if not in client authority mode + if (!clientAuthority) + return; + + if (syncVelocity) + { + this.velocity = velocity; + + target.velocity = velocity; + + } + this.angularVelocity = angularVelocity; + target.angularVelocity = angularVelocity; + } + + [Command] + void CmdSendIsKinematic(bool isKinematic) + { + // Ignore messages from client if not in client authority mode + if (!clientAuthority) + return; + + this.isKinematic = isKinematic; + target.isKinematic = isKinematic; + } + + [Command] + void CmdSendUseGravity(bool useGravity) + { + // Ignore messages from client if not in client authority mode + if (!clientAuthority) + return; + + this.useGravity = useGravity; + target.useGravity = useGravity; + } + + [Command] + void CmdSendDrag(float drag) + { + // Ignore messages from client if not in client authority mode + if (!clientAuthority) + return; + + this.drag = drag; + target.drag = drag; + } + + [Command] + void CmdSendAngularDrag(float angularDrag) + { + // Ignore messages from client if not in client authority mode + if (!clientAuthority) + return; + + this.angularDrag = angularDrag; + target.angularDrag = angularDrag; + } + + /// + /// holds previously synced values + /// + public class ClientSyncState + { + /// + /// Next sync time that velocity will be synced, based on syncInterval. + /// + public float nextSyncTime; + public Vector3 velocity; + public Vector3 angularVelocity; + public bool isKinematic; + public bool useGravity; + public float drag; + public float angularDrag; + } + } +} diff --git a/Assets/Mirror/Components/Experimental/NetworkRigidbody.cs.meta b/Assets/Mirror/Components/Experimental/NetworkRigidbody.cs.meta new file mode 100644 index 00000000..1610f0a7 --- /dev/null +++ b/Assets/Mirror/Components/Experimental/NetworkRigidbody.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 83392ae5c1b731446909f252fd494ae4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 7453abfe9e8b2c04a8a47eb536fe21eb, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Components/Experimental/NetworkTransformBase.cs b/Assets/Mirror/Components/Experimental/NetworkTransformBase.cs index 98a26faa..f6824af3 100644 --- a/Assets/Mirror/Components/Experimental/NetworkTransformBase.cs +++ b/Assets/Mirror/Components/Experimental/NetworkTransformBase.cs @@ -1,4 +1,4 @@ -// vis2k: +// vis2k: // base class for NetworkTransform and NetworkTransformChild. // New method is simple and stupid. No more 1500 lines of code. // @@ -134,7 +134,7 @@ void FixedUpdate() // serialize // local position/rotation for VR support // send to server - CmdClientToServerSync(targetTransform.transform.localPosition, targetTransform.transform.localRotation, targetTransform.transform.localScale); + CmdClientToServerSync(targetTransform.localPosition, targetTransform.localRotation, targetTransform.localScale); } } } diff --git a/Assets/Mirror/Components/NetworkAnimator.cs b/Assets/Mirror/Components/NetworkAnimator.cs index e904ac8b..5c63a03f 100644 --- a/Assets/Mirror/Components/NetworkAnimator.cs +++ b/Assets/Mirror/Components/NetworkAnimator.cs @@ -41,7 +41,7 @@ public class NetworkAnimator : NetworkBehaviour // multiple layers int[] animationHash; int[] transitionHash; - float sendTimer; + float nextSendTime; bool SendMessagesAllowed { @@ -85,6 +85,9 @@ void FixedUpdate() if (!SendMessagesAllowed) return; + if (!Animator.enabled) + return; + CheckSendRate(); for (int i = 0; i < Animator.layerCount; i++) @@ -139,9 +142,10 @@ bool CheckAnimStateChanged(out int stateHash, out float normalizedTime, int laye void CheckSendRate() { - if (SendMessagesAllowed && syncInterval > 0 && sendTimer < Time.time) + float now = Time.time; + if (SendMessagesAllowed && syncInterval >= 0 && now > nextSendTime) { - sendTimer = Time.time + syncInterval; + nextSendTime = now + syncInterval; using (PooledNetworkWriter writer = NetworkWriterPool.GetWriter()) { @@ -185,7 +189,8 @@ void HandleAnimMsg(int stateHash, float normalizedTime, int layerId, NetworkRead // NOTE: there is no API to play a transition(?) if (stateHash != 0) { - Animator.Play(stateHash, layerId, normalizedTime); + if (Animator.enabled) + Animator.Play(stateHash, layerId, normalizedTime); } ReadParameters(reader); @@ -201,12 +206,14 @@ void HandleAnimParamsMsg(NetworkReader reader) void HandleAnimTriggerMsg(int hash) { - Animator.SetTrigger(hash); + if (Animator.enabled) + Animator.SetTrigger(hash); } void HandleAnimResetTriggerMsg(int hash) { - Animator.ResetTrigger(hash); + if (Animator.enabled) + Animator.ResetTrigger(hash); } ulong NextDirtyBits() @@ -220,19 +227,23 @@ ulong NextDirtyBits() { int newIntValue = Animator.GetInteger(par.nameHash); changed = newIntValue != lastIntParameters[i]; - lastIntParameters[i] = newIntValue; + if (changed) + lastIntParameters[i] = newIntValue; } else if (par.type == AnimatorControllerParameterType.Float) { float newFloatValue = Animator.GetFloat(par.nameHash); changed = Mathf.Abs(newFloatValue - lastFloatParameters[i]) > 0.001f; - lastFloatParameters[i] = newFloatValue; + // only set lastValue if it was changed, otherwise value could slowly drift within the 0.001f limit each frame + if (changed) + lastFloatParameters[i] = newFloatValue; } else if (par.type == AnimatorControllerParameterType.Bool) { bool newBoolValue = Animator.GetBool(par.nameHash); changed = newBoolValue != lastBoolParameters[i]; - lastBoolParameters[i] = newBoolValue; + if (changed) + lastBoolParameters[i] = newBoolValue; } if (changed) { @@ -273,6 +284,9 @@ bool WriteParameters(NetworkWriter writer, bool forceAll = false) void ReadParameters(NetworkReader reader) { + bool animatorEnabled = Animator.enabled; + // need to read values from NetworkReader even if animator is disabled + ulong dirtyBits = reader.ReadPackedUInt64(); for (int i = 0; i < parameters.Length; i++) { @@ -283,17 +297,20 @@ void ReadParameters(NetworkReader reader) if (par.type == AnimatorControllerParameterType.Int) { int newIntValue = reader.ReadPackedInt32(); - Animator.SetInteger(par.nameHash, newIntValue); + if (animatorEnabled) + Animator.SetInteger(par.nameHash, newIntValue); } else if (par.type == AnimatorControllerParameterType.Float) { float newFloatValue = reader.ReadSingle(); - Animator.SetFloat(par.nameHash, newFloatValue); + if (animatorEnabled) + Animator.SetFloat(par.nameHash, newFloatValue); } else if (par.type == AnimatorControllerParameterType.Bool) { bool newBoolValue = reader.ReadBoolean(); - Animator.SetBool(par.nameHash, newBoolValue); + if (animatorEnabled) + Animator.SetBool(par.nameHash, newBoolValue); } } } @@ -390,6 +407,7 @@ public void SetTrigger(int hash) return; } + HandleAnimTriggerMsg(hash); RpcOnAnimationTriggerClientMessage(hash); } } @@ -435,6 +453,7 @@ public void ResetTrigger(int hash) return; } + HandleAnimResetTriggerMsg(hash); RpcOnAnimationResetTriggerClientMessage(hash); } } @@ -518,6 +537,7 @@ void RpcOnAnimationParametersClientMessage(byte[] parameters) [ClientRpc] void RpcOnAnimationTriggerClientMessage(int hash) { + // host handles this before it is sent if (IsServer) return; HandleAnimTriggerMsg(hash); @@ -526,6 +546,7 @@ void RpcOnAnimationTriggerClientMessage(int hash) [ClientRpc] void RpcOnAnimationResetTriggerClientMessage(int hash) { + // host handles this before it is sent if (IsServer) return; HandleAnimResetTriggerMsg(hash); @@ -533,4 +554,4 @@ void RpcOnAnimationResetTriggerClientMessage(int hash) #endregion } -} +} \ No newline at end of file diff --git a/Assets/Mirror/Editor/Weaver/Extensions.cs b/Assets/Mirror/Editor/Weaver/Extensions.cs index 7320db18..43a6b6e2 100644 --- a/Assets/Mirror/Editor/Weaver/Extensions.cs +++ b/Assets/Mirror/Editor/Weaver/Extensions.cs @@ -219,6 +219,32 @@ public static List GetMethods(this TypeDefinition td, string m return methods; } + public static MethodDefinition GetMethodInBaseType(this TypeDefinition td, string methodName) + { + TypeDefinition typedef = td; + while (typedef != null) + { + foreach (MethodDefinition md in typedef.Methods) + { + if (md.Name == methodName) + return md; + } + + try + { + TypeReference parent = typedef.BaseType; + typedef = parent?.Resolve(); + } + catch (AssemblyResolutionException) + { + // this can happen for pluins. + break; + } + } + + return null; + } + /// /// /// diff --git a/Assets/Mirror/Editor/Weaver/Processors/MethodProcessor.cs b/Assets/Mirror/Editor/Weaver/Processors/MethodProcessor.cs index d2d64d3f..c247f585 100644 --- a/Assets/Mirror/Editor/Weaver/Processors/MethodProcessor.cs +++ b/Assets/Mirror/Editor/Weaver/Processors/MethodProcessor.cs @@ -84,7 +84,19 @@ public static void FixRemoteCallToBaseMethod(TypeDefinition type, MethodDefiniti calledMethod.Name == baseRemoteCallName) { TypeDefinition baseType = type.BaseType.Resolve(); - MethodDefinition baseMethod = baseType.GetMethod(callName); + MethodDefinition baseMethod = baseType.GetMethodInBaseType(callName); + + if (baseMethod == null) + { + Weaver.Error($"Could not find base method for {callName}", method); + return; + } + + if (!baseMethod.IsVirtual) + { + Weaver.Error($"Could not find base method that was virutal {callName}", method); + return; + } instruction.Operand = baseMethod; diff --git a/Assets/Mirror/Editor/Weaver/Processors/PropertySiteProcessor.cs b/Assets/Mirror/Editor/Weaver/Processors/PropertySiteProcessor.cs index 6ddf71c9..1e511d7b 100644 --- a/Assets/Mirror/Editor/Weaver/Processors/PropertySiteProcessor.cs +++ b/Assets/Mirror/Editor/Weaver/Processors/PropertySiteProcessor.cs @@ -183,8 +183,7 @@ static void ProcessInstructionMethod(MethodDefinition md, Instruction instr, Met // so the earlier instruction that loads the event field is replaced with a Noop. // go backwards until find a ldfld instruction that matches ANY event - bool found = false; - while (iCount > 0 && !found) + while (iCount > 0) { iCount -= 1; Instruction inst = md.Body.Instructions[iCount]; @@ -195,11 +194,11 @@ static void ProcessInstructionMethod(MethodDefinition md, Instruction instr, Met // find replaceEvent with matching name // NOTE: original weaver compared .Name, not just the MethodDefinition, // that's why we use dict. - if (Weaver.WeaveLists.replaceEvents.TryGetValue(opField.Name, out MethodDefinition replacement)) + if (Weaver.WeaveLists.replaceEvents.TryGetValue(opField.FullName, out MethodDefinition replacement)) { instr.Operand = replacement; inst.OpCode = OpCodes.Nop; - found = true; + return; } } } diff --git a/Assets/Mirror/Editor/Weaver/Processors/SyncEventProcessor.cs b/Assets/Mirror/Editor/Weaver/Processors/SyncEventProcessor.cs index 3130a2ee..d29a6aa4 100644 --- a/Assets/Mirror/Editor/Weaver/Processors/SyncEventProcessor.cs +++ b/Assets/Mirror/Editor/Weaver/Processors/SyncEventProcessor.cs @@ -146,10 +146,9 @@ public static void ProcessEvents(TypeDefinition td, List events td.Methods.Add(eventCallFunc); // original weaver compares .Name, not EventDefinition. - Weaver.WeaveLists.replaceEvents[ed.Name] = eventCallFunc; + Weaver.WeaveLists.replaceEvents[ed.FullName] = eventCallFunc; Weaver.DLog(td, " Event: " + ed.Name); - break; } } } diff --git a/Assets/Mirror/Editor/Weaver/Weaver.cs b/Assets/Mirror/Editor/Weaver/Weaver.cs index c7e75d0c..7eb2ae1b 100644 --- a/Assets/Mirror/Editor/Weaver/Weaver.cs +++ b/Assets/Mirror/Editor/Weaver/Weaver.cs @@ -573,7 +573,7 @@ static bool WeaveModule(ModuleDefinition moduleDefinition) catch (Exception ex) { Error(ex.ToString()); - throw ex; + throw; } } diff --git a/Assets/Mirror/Runtime/Transport/Telepathy.meta b/Assets/Mirror/Examples/Cloud.meta similarity index 77% rename from Assets/Mirror/Runtime/Transport/Telepathy.meta rename to Assets/Mirror/Examples/Cloud.meta index 50b4104e..f8e53b05 100644 --- a/Assets/Mirror/Runtime/Transport/Telepathy.meta +++ b/Assets/Mirror/Examples/Cloud.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9114a2934b7ee44a89dc4f66e70aa98a +guid: c6191af3a22db3a40bb6e21d80a01c25 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Mirror/Plugins.meta b/Assets/Mirror/Examples/Cloud/PongWithListServer.meta similarity index 77% rename from Assets/Mirror/Plugins.meta rename to Assets/Mirror/Examples/Cloud/PongWithListServer.meta index 46f11b77..477c2ab8 100644 --- a/Assets/Mirror/Plugins.meta +++ b/Assets/Mirror/Examples/Cloud/PongWithListServer.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cd9378534d7cf4e90820042d90dc0781 +guid: ceb3581477b32e44d8e26574395c922e folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Mirror/Examples/ListServer/Scenes.meta b/Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes.meta similarity index 77% rename from Assets/Mirror/Examples/ListServer/Scenes.meta rename to Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes.meta index e0412be3..d7376214 100644 --- a/Assets/Mirror/Examples/ListServer/Scenes.meta +++ b/Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9826d673f42ad4c59b8fc27ae86729e1 +guid: d41f99f706c19884da8409b895f978d8 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes/ListServerLobbyScenePong.unity b/Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes/ListServerLobbyScenePong.unity new file mode 100644 index 00000000..5c81f55f --- /dev/null +++ b/Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes/ListServerLobbyScenePong.unity @@ -0,0 +1,625 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 512 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &460456769 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460456772} + - component: {fileID: 460456771} + - component: {fileID: 460456770} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &460456770 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460456769} + m_Enabled: 1 +--- !u!20 &460456771 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460456769} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.44313726, g: 0, b: 0.33105087, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &460456772 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460456769} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &631456684 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 631456686} + - component: {fileID: 631456685} + m_Layer: 0 + m_Name: InstantiateNetworkManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &631456685 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 631456684} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbabb497385c20346a3c8bda4ae69508, type: 3} + m_Name: + m_EditorClassIdentifier: + prefab: {fileID: 4798169800353248846, guid: f9aa4197a8467cd49a35cba69f73ad73, type: 3} +--- !u!4 &631456686 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 631456684} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1092693834 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1092693837} + - component: {fileID: 1092693836} + - component: {fileID: 1092693835} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1092693835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1092693834} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1092693836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1092693834} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1092693837 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1092693834} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1621652715 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2647107856379666145, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_ChildControlWidth + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2647107856379666145, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Spacing + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 2647107856379666145, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Padding.m_Left + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 2647107856379666145, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Padding.m_Right + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4346059805251566766, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Padding.m_Left + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4346059805251566766, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Padding.m_Right + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4971607475626354593, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_FontData.m_Alignment + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4971607475626354594, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607475626354594, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607475626354594, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607475626354594, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607475641435050, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Value + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4971607475644947932, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.y + value: 22 + objectReference: {fileID: 0} + - target: {fileID: 4971607475644947932, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0.000015258789 + objectReference: {fileID: 0} + - target: {fileID: 4971607475644947932, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607475644947932, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4971607475644947932, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4971607476029058369, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_FontData.m_Alignment + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4971607476029058370, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476029058370, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476029058370, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476029058370, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476373752080, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_FontData.m_Alignment + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4971607476373752081, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476373752081, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476373752081, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476373752081, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476435516855, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_FontData.m_Alignment + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4971607476435516856, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476435516856, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476435516856, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476435516856, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476873278848, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476873278848, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476873278848, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432301, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607476965432305, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_Name + value: ListServer Canvas + objectReference: {fileID: 0} + - target: {fileID: 4971607476985653605, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4971607477325490914, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: 4971607477325490914, guid: e16e442bbd8d4434cb606afd72bcd08b, + type: 3} + propertyPath: m_SizeDelta.x + value: -1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: e16e442bbd8d4434cb606afd72bcd08b, type: 3} diff --git a/Assets/Mirror/Examples/ListServer/Scenes/Scene.unity.meta b/Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes/ListServerLobbyScenePong.unity.meta similarity index 74% rename from Assets/Mirror/Examples/ListServer/Scenes/Scene.unity.meta rename to Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes/ListServerLobbyScenePong.unity.meta index a4159e23..21f8b1f7 100644 --- a/Assets/Mirror/Examples/ListServer/Scenes/Scene.unity.meta +++ b/Assets/Mirror/Examples/Cloud/PongWithListServer/Scenes/ListServerLobbyScenePong.unity.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ccdea83d270df4b078963a0243e41ac0 +guid: 1f04219b066ed4646a078c4c3b2b9180 DefaultImporter: externalObjects: {} userData: diff --git a/Assets/Mirror/Examples/ListServer/Scenes/Scene.unity b/Assets/Mirror/Examples/ListServer/Scenes/Scene.unity deleted file mode 100644 index fd0e99c0..00000000 --- a/Assets/Mirror/Examples/ListServer/Scenes/Scene.unity +++ /dev/null @@ -1,3646 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &4 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 0 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 1024 - m_ReflectionCompression: 2 - m_MixedBakeMode: 1 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 0 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 0 ---- !u!196 &5 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 23800000, guid: b7816657e55c04901be36ace7275ad85, type: 2} ---- !u!1 &13922436 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 13922437} - - component: {fileID: 13922439} - - component: {fileID: 13922438} - m_Layer: 5 - m_Name: TextStatus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &13922437 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 13922436} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1926990971} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -29} - m_SizeDelta: {x: 0, y: 18} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &13922438 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 13922436} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Status ---- !u!222 &13922439 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 13922436} - m_CullTransparentMesh: 0 ---- !u!1 &21701407 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 21701408} - - component: {fileID: 21701410} - - component: {fileID: 21701409} - m_Layer: 5 - m_Name: TextJoinServer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &21701408 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 21701407} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 776519261} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -29} - m_SizeDelta: {x: 0, y: 18} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &21701409 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 21701407} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Join Server ---- !u!222 &21701410 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 21701407} - m_CullTransparentMesh: 0 ---- !u!1 &88936773 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 88936777} - - component: {fileID: 88936776} - - component: {fileID: 88936775} - - component: {fileID: 88936774} - - component: {fileID: 88936778} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &88936774 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_Enabled: 1 ---- !u!124 &88936775 -Behaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_Enabled: 1 ---- !u!20 &88936776 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &88936777 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_LocalRotation: {x: 0, y: 0.92387956, z: -0.38268343, w: 0} - m_LocalPosition: {x: 0, y: 6.5, z: 8} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 45, y: 180, z: 0} ---- !u!114 &88936778 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 88936773} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fc6b510c425006f458e9b99cb817c55b, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &123981370 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 123981371} - - component: {fileID: 123981373} - - component: {fileID: 123981372} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &123981371 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 123981370} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 276447173} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &123981372 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 123981370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Cancel ---- !u!222 &123981373 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 123981370} - m_CullTransparentMesh: 0 ---- !u!1 &177548782 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 177548783} - - component: {fileID: 177548785} - - component: {fileID: 177548784} - m_Layer: 5 - m_Name: TextTitle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &177548783 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 177548782} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1007872741} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -36, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &177548784 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 177548782} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.23137255, g: 1, b: 0.6862745, a: 1} - m_RaycastTarget: 0 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Mirror ListServer Demo* ---- !u!222 &177548785 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 177548782} - m_CullTransparentMesh: 0 ---- !u!1 &232720476 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 232720477} - - component: {fileID: 232720479} - - component: {fileID: 232720478} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &232720477 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 232720476} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1578438653} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 7, y: 0} - m_SizeDelta: {x: 218, y: 20} - m_Pivot: {x: 0, y: 1} ---- !u!114 &232720478 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 232720476} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 0.23137255, b: 0.5803922, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Server ---- !u!222 &232720479 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 232720476} - m_CullTransparentMesh: 0 ---- !u!1 &251893064 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 251893065} - - component: {fileID: 251893066} - m_Layer: 0 - m_Name: Spawn - m_TagString: Untagged - m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &251893065 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 251893064} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 3, y: 0, z: 3} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 8 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &251893066 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 251893064} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &276447172 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 276447173} - - component: {fileID: 276447176} - - component: {fileID: 276447175} - - component: {fileID: 276447174} - m_Layer: 5 - m_Name: ButtonCancel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &276447173 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 276447172} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 123981371} - m_Father: {fileID: 1926990971} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 4, y: 16} - m_SizeDelta: {x: -8, y: 20} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &276447174 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 276447172} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 0.32156864, g: 0.32156864, b: 0.32156864, a: 1} - m_HighlightedColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} - m_PressedColor: {r: 0.3882353, g: 0.3882353, b: 0.3882353, a: 1} - m_SelectedColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} - m_DisabledColor: {r: 0.3882353, g: 0.3882353, b: 0.3882353, a: 0.2509804} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 276447175} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &276447175 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 276447172} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &276447176 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 276447172} - m_CullTransparentMesh: 0 ---- !u!1 &354490534 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 354490535} - - component: {fileID: 354490537} - - component: {fileID: 354490536} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &354490535 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 354490534} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1578438653} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 345, y: 0} - m_SizeDelta: {x: 130, y: 20} - m_Pivot: {x: 0, y: 1} ---- !u!114 &354490536 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 354490534} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 0.23137255, b: 0.5803922, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 5 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Address ---- !u!222 &354490537 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 354490534} - m_CullTransparentMesh: 0 ---- !u!1 &424897549 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 424897550} - - component: {fileID: 424897552} - - component: {fileID: 424897551} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &424897550 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 424897549} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1578438653} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 225, y: 0} - m_SizeDelta: {x: 60, y: 20} - m_Pivot: {x: 0, y: 1} ---- !u!114 &424897551 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 424897549} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 0.23137255, b: 0.5803922, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 5 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Players ---- !u!222 &424897552 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 424897549} - m_CullTransparentMesh: 0 ---- !u!1 &531282979 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 531282980} - - component: {fileID: 531282982} - - component: {fileID: 531282981} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &531282980 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 531282979} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1004751478} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &531282981 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 531282979} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Server & Play ---- !u!222 &531282982 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 531282979} - m_CullTransparentMesh: 0 ---- !u!1 &535675709 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 535675710} - - component: {fileID: 535675712} - - component: {fileID: 535675711} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &535675710 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 535675709} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1578438653} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 285, y: 0} - m_SizeDelta: {x: 60, y: 20} - m_Pivot: {x: 0, y: 1} ---- !u!114 &535675711 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 535675709} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 0.23137255, b: 0.5803922, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 5 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Latency ---- !u!222 &535675712 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 535675709} - m_CullTransparentMesh: 0 ---- !u!1 &535739935 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 535739936} - - component: {fileID: 535739937} - m_Layer: 0 - m_Name: Spawn - m_TagString: Untagged - m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &535739936 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 535739935} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 3, y: 0, z: -3} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &535739937 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 535739935} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &583153858 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 583153859} - - component: {fileID: 583153861} - - component: {fileID: 583153860} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &583153859 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 583153858} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1918165881} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 560, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &583153860 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 583153858} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 2 - m_Right: 2 - m_Top: 4 - m_Bottom: 2 - m_ChildAlignment: 0 - m_StartCorner: 0 - m_StartAxis: 0 - m_CellSize: {x: 560, y: 16} - m_Spacing: {x: 0, y: 0} - m_Constraint: 1 - m_ConstraintCount: 1 ---- !u!114 &583153861 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 583153858} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 ---- !u!1 &586458803 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 586458804} - - component: {fileID: 586458807} - - component: {fileID: 586458806} - - component: {fileID: 586458805} - m_Layer: 5 - m_Name: Scrollbar Vertical - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &586458804 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 586458803} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1345848863} - m_Father: {fileID: 1918165881} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!114 &586458805 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 586458803} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 0.4117647, g: 0.4117647, b: 0.4117647, a: 1} - m_HighlightedColor: {r: 0.41176474, g: 0.41176474, b: 0.41176474, a: 1} - m_PressedColor: {r: 0.41176474, g: 0.41176474, b: 0.41176474, a: 1} - m_SelectedColor: {r: 0.41176474, g: 0.41176474, b: 0.41176474, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 2064208032} - m_HandleRect: {fileID: 2064208031} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &586458806 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 586458803} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.24313726, g: 0.24313726, b: 0.24313726, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &586458807 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 586458803} - m_CullTransparentMesh: 0 ---- !u!1 &635355836 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 635355837} - - component: {fileID: 635355839} - - component: {fileID: 635355838} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &635355837 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 635355836} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1578438653} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 475, y: 0} - m_SizeDelta: {x: 40, y: 20} - m_Pivot: {x: 0, y: 1} ---- !u!114 &635355838 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 635355836} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 0.23137255, b: 0.5803922, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 5 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Action ---- !u!222 &635355839 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 635355836} - m_CullTransparentMesh: 0 ---- !u!1 &651109221 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 651109222} - - component: {fileID: 651109224} - - component: {fileID: 651109223} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &651109222 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 651109221} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1206549608} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 863, y: 754} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &651109223 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 651109221} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.39215687, g: 0.58431375, b: 0.92941177, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &651109224 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 651109221} - m_CullTransparentMesh: 0 ---- !u!1 &712827150 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 712827151} - - component: {fileID: 712827153} - - component: {fileID: 712827152} - m_Layer: 5 - m_Name: TextStatus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &712827151 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 712827150} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 776519261} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -3, y: -19} - m_SizeDelta: {x: 157.79, y: 19} - m_Pivot: {x: 1, y: 1} ---- !u!114 &712827152 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 712827150} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.24313726} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 2 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 5 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Status ---- !u!222 &712827153 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 712827150} - m_CullTransparentMesh: 0 ---- !u!1 &719699535 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1206549608} - - component: {fileID: 719699536} - m_Layer: 5 - m_Name: ServerList - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &719699536 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719699535} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 69f796b44735c414783d66f47b150c5f, type: 3} - m_Name: - m_EditorClassIdentifier: - manager: {fileID: 1282001520} - listServerUrl: tpc4://35.243.149.104:8888 - transport: {fileID: 1282001521} - Connecting: 0 - Connected: 0 - mainPanel: {fileID: 719699535} - content: {fileID: 583153859} - statusText: {fileID: 712827152} - slotPrefab: {fileID: 114611570997501482, guid: 611330311f6094567ad2f8012b470129, - type: 3} - serverAndPlayButton: {fileID: 1004751479} - serverOnlyButton: {fileID: 993261495} - connectingPanel: {fileID: 1926990970} - connectingText: {fileID: 1081204139} - connectingCancelButton: {fileID: 276447174} - connectingDots: 0 ---- !u!1 &747705678 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 747705679} - - component: {fileID: 747705681} - - component: {fileID: 747705680} - m_Layer: 5 - m_Name: TitleBar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &747705679 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 747705678} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1093045669} - m_Father: {fileID: 1926990971} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &747705680 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 747705678} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.31764707, g: 0.31764707, b: 0.31764707, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &747705681 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 747705678} - m_CullTransparentMesh: 0 ---- !u!1 &776519260 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 776519261} - - component: {fileID: 776519264} - - component: {fileID: 776519263} - m_Layer: 5 - m_Name: ServerListPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &776519261 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 776519260} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1007872741} - - {fileID: 21701408} - - {fileID: 712827151} - - {fileID: 1578438653} - - {fileID: 1918165881} - - {fileID: 1052220088} - - {fileID: 1291804678} - - {fileID: 777480155} - m_Father: {fileID: 1206549608} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 526, y: 400} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &776519263 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 776519260} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &776519264 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 776519260} - m_CullTransparentMesh: 0 ---- !u!1 &777480154 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 777480155} - - component: {fileID: 777480157} - - component: {fileID: 777480156} - m_Layer: 5 - m_Name: TextFootnote - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &777480155 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 777480154} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 776519261} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: -10} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &777480156 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 777480154} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 2 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: '* Host your own List Server with: mirror-networking.com/list-server' ---- !u!222 &777480157 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 777480154} - m_CullTransparentMesh: 0 ---- !u!1 &993261493 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 993261494} - - component: {fileID: 993261497} - - component: {fileID: 993261496} - - component: {fileID: 993261495} - m_Layer: 5 - m_Name: ButtonServerOnly - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &993261494 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 993261493} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 2020215609} - m_Father: {fileID: 1291804678} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -2, y: 0} - m_SizeDelta: {x: 260, y: 20} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &993261495 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 993261493} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 0.32156864, g: 0.32156864, b: 0.32156864, a: 1} - m_HighlightedColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} - m_PressedColor: {r: 0.3882353, g: 0.3882353, b: 0.3882353, a: 1} - m_SelectedColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} - m_DisabledColor: {r: 0.3882353, g: 0.3882353, b: 0.3882353, a: 0.2509804} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 993261496} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &993261496 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 993261493} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &993261497 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 993261493} - m_CullTransparentMesh: 0 ---- !u!1 &1004751477 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1004751478} - - component: {fileID: 1004751481} - - component: {fileID: 1004751480} - - component: {fileID: 1004751479} - m_Layer: 5 - m_Name: ButtonServer&Play - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1004751478 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1004751477} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 531282980} - m_Father: {fileID: 1291804678} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 2, y: 0} - m_SizeDelta: {x: 260, y: 20} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &1004751479 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1004751477} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 0.32156864, g: 0.32156864, b: 0.32156864, a: 1} - m_HighlightedColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} - m_PressedColor: {r: 0.3882353, g: 0.3882353, b: 0.3882353, a: 1} - m_SelectedColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} - m_DisabledColor: {r: 0.3882353, g: 0.3882353, b: 0.3882353, a: 0.2509804} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1004751480} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1004751480 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1004751477} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1004751481 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1004751477} - m_CullTransparentMesh: 0 ---- !u!1 &1007872740 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1007872741} - - component: {fileID: 1007872744} - - component: {fileID: 1007872743} - m_Layer: 5 - m_Name: TitleBar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1007872741 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1007872740} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 177548783} - m_Father: {fileID: 776519261} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &1007872743 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1007872740} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.31764707, g: 0.31764707, b: 0.31764707, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1007872744 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1007872740} - m_CullTransparentMesh: 0 ---- !u!1 &1052220087 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1052220088} - - component: {fileID: 1052220090} - - component: {fileID: 1052220089} - m_Layer: 5 - m_Name: TextStartServer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1052220088 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1052220087} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 776519261} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 40} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1052220089 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1052220087} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Start Server ---- !u!222 &1052220090 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1052220087} - m_CullTransparentMesh: 0 ---- !u!1 &1081204137 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1081204138} - - component: {fileID: 1081204140} - - component: {fileID: 1081204139} - m_Layer: 5 - m_Name: TextConnecting - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1081204138 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081204137} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1926990971} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1081204139 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081204137} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 0.23137255, b: 0.5803922, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Connecting... ---- !u!222 &1081204140 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081204137} - m_CullTransparentMesh: 0 ---- !u!1 &1093045668 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1093045669} - - component: {fileID: 1093045671} - - component: {fileID: 1093045670} - m_Layer: 5 - m_Name: TextTitle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1093045669 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1093045668} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 747705679} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -36, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1093045670 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1093045668} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.23137255, g: 1, b: 0.6862745, a: 1} - m_RaycastTarget: 0 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!222 &1093045671 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1093045668} - m_CullTransparentMesh: 0 ---- !u!1 &1107091652 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1107091656} - - component: {fileID: 1107091655} - - component: {fileID: 1107091654} - - component: {fileID: 1107091653} - m_Layer: 0 - m_Name: Ground - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!23 &1107091653 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1107091652} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RenderingLayerMask: 4294967295 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 29b49c27a74f145918356859bd7af511, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!64 &1107091654 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1107091652} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!33 &1107091655 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1107091652} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1107091656 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1107091652} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!224 &1206549608 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719699535} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 651109222} - - {fileID: 776519261} - - {fileID: 1926990971} - m_Father: {fileID: 1972322034} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1282001517 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1282001518} - - component: {fileID: 1282001520} - - component: {fileID: 1282001523} - - component: {fileID: 1282001519} - - component: {fileID: 1282001521} - - component: {fileID: 1282001522} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1282001518 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1282001519 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: abe6be14204d94224a3e7cd99dd2ea73, type: 3} - m_Name: - m_EditorClassIdentifier: - authenticator: {fileID: 0} - Connected: - m_PersistentCalls: - m_Calls: [] - Authenticated: - m_PersistentCalls: - m_Calls: [] - ClientNotReady: - m_PersistentCalls: - m_Calls: [] - ClientChangeScene: - m_PersistentCalls: - m_Calls: [] - ClientSceneChanged: - m_PersistentCalls: - m_Calls: [] - Disconnected: - m_PersistentCalls: - m_Calls: [] - spawnPrefabs: - - {fileID: 1916082411674582, guid: 6f43bf5488a7443d19ab2a83c6b91f35, type: 3} - - {fileID: 2011878188} - - {fileID: 9081919128954505657, guid: ecd52c53a6ef7496693343d3e32dace1, type: 3} - Transport: {fileID: 1282001521} ---- !u!114 &1282001520 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8aab4c8111b7c411b9b92cf3dbc5bd4e, type: 3} - m_Name: - m_EditorClassIdentifier: - dontDestroyOnLoad: 1 - startOnHeadless: 1 - serverTickRate: 30 - server: {fileID: 1282001523} - client: {fileID: 1282001519} - transport: {fileID: 1282001521} - OnStartHost: - m_PersistentCalls: - m_Calls: [] - OnStopHost: - m_PersistentCalls: - m_Calls: [] - networkSceneName: ---- !u!114 &1282001521 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6ce81336eed77486e8ed5e3721e54c47, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 ---- !u!114 &1282001522 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a7aaac73a16c040fd871cb977b5c557b, type: 3} - m_Name: - m_EditorClassIdentifier: - client: {fileID: 1282001519} - server: {fileID: 1282001523} - playerPrefab: {fileID: 1410032569926419539, guid: ecd52c53a6ef7496693343d3e32dace1, - type: 3} - startPositionIndex: 0 - startPositions: [] - playerSpawnMethod: 0 ---- !u!114 &1282001523 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a5f5ec068f5604c32b160bc49ee97b75, type: 3} - m_Name: - m_EditorClassIdentifier: - MaxConnections: 4 - Started: - m_PersistentCalls: - m_Calls: [] - Connected: - m_PersistentCalls: - m_Calls: [] - Authenticated: - m_PersistentCalls: - m_Calls: [] - ServerChangeScene: - m_PersistentCalls: - m_Calls: [] - ServerSceneChanged: - m_PersistentCalls: - m_Calls: [] - Disconnected: - m_PersistentCalls: - m_Calls: [] - Stopped: - m_PersistentCalls: - m_Calls: [] - authenticator: {fileID: 0} - Listening: 1 - transport: {fileID: 1282001521} ---- !u!1 &1291804677 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1291804678} - - component: {fileID: 1291804680} - - component: {fileID: 1291804679} - m_Layer: 5 - m_Name: PanelStartServer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1291804678 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1291804677} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1004751478} - - {fileID: 993261494} - m_Father: {fileID: 776519261} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 16} - m_SizeDelta: {x: -4, y: 28} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1291804679 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1291804677} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.25882354, g: 0.25882354, b: 0.25882354, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1291804680 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1291804677} - m_CullTransparentMesh: 0 ---- !u!1 &1345848862 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1345848863} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1345848863 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1345848862} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 2064208031} - m_Father: {fileID: 586458804} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1458789072 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1458789073} - - component: {fileID: 1458789074} - m_Layer: 0 - m_Name: Spawn - m_TagString: Untagged - m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1458789073 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1458789072} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3, y: 0, z: 3} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1458789074 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1458789072} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1501912662 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1501912663} - - component: {fileID: 1501912664} - m_Layer: 0 - m_Name: Spawn - m_TagString: Untagged - m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1501912663 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1501912662} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3, y: 0, z: -3} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1501912664 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1501912662} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 41f84591ce72545258ea98cb7518d8b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1578438652 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1578438653} - - component: {fileID: 1578438655} - - component: {fileID: 1578438654} - m_Layer: 5 - m_Name: PanelTableHeader - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1578438653 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1578438652} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 232720477} - - {fileID: 424897550} - - {fileID: 535675710} - - {fileID: 354490535} - - {fileID: 635355837} - m_Father: {fileID: 776519261} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -48} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1578438654 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1578438652} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.25882354, g: 0.25882354, b: 0.25882354, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1578438655 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1578438652} - m_CullTransparentMesh: 0 ---- !u!1 &1680368249 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1680368252} - - component: {fileID: 1680368251} - - component: {fileID: 1680368250} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1680368250 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1680368249} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &1680368251 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1680368249} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &1680368252 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1680368249} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1918165880 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1918165881} - - component: {fileID: 1918165885} - - component: {fileID: 1918165884} - - component: {fileID: 1918165883} - - component: {fileID: 1918165882} - m_Layer: 5 - m_Name: Scroll View - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1918165881 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918165880} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 583153859} - - {fileID: 586458804} - m_Father: {fileID: 776519261} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -3} - m_SizeDelta: {x: -2, y: -106} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1918165882 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918165880} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &1918165883 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918165880} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.25882354, g: 0.25882354, b: 0.25882354, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1918165884 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918165880} - m_CullTransparentMesh: 0 ---- !u!114 &1918165885 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918165880} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 583153859} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 0} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 586458805} - m_HorizontalScrollbarVisibility: 2 - m_VerticalScrollbarVisibility: 1 - m_HorizontalScrollbarSpacing: -3 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!1 &1926990970 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1926990971} - - component: {fileID: 1926990973} - - component: {fileID: 1926990972} - m_Layer: 5 - m_Name: ConnectingPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1926990971 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1926990970} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 747705679} - - {fileID: 13922437} - - {fileID: 1081204138} - - {fileID: 276447173} - m_Father: {fileID: 1206549608} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 250, y: 100} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1926990972 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1926990970} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1926990973 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1926990970} - m_CullTransparentMesh: 0 ---- !u!1 &1972322030 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1972322034} - - component: {fileID: 1972322033} - - component: {fileID: 1972322032} - - component: {fileID: 1972322031} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1972322031 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1972322030} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1972322032 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1972322030} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1972322033 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1972322030} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 1 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &1972322034 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1972322030} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1206549608} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &2011878188 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2011878191} - - component: {fileID: 2011878190} - - component: {fileID: 2011878189} - m_Layer: 0 - m_Name: RegisterServer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2011878189 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2011878188} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1168177110de9455e84958a15375ae6d, type: 3} - m_Name: - m_EditorClassIdentifier: - lastSyncTime: 0 - syncMode: 0 - syncInterval: 0.1 - netIdentityCache: {fileID: 0} - manager: {fileID: 1282001520} - listServerUrl: tcp4://35.243.149.104:8887 - gameServerTitle: Deathmatch - transport: {fileID: 1282001521} ---- !u!114 &2011878190 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2011878188} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3} - m_Name: - m_EditorClassIdentifier: - sceneId: 1146589430 - serverOnly: 1 - m_AssetId: - OnStartServer: - m_PersistentCalls: - m_Calls: [] - OnStartClient: - m_PersistentCalls: - m_Calls: [] - OnStartLocalPlayer: - m_PersistentCalls: - m_Calls: [] - OnStartAuthority: - m_PersistentCalls: - m_Calls: [] - OnStopAuthority: - m_PersistentCalls: - m_Calls: [] - OnStopClient: - m_PersistentCalls: - m_Calls: [] - OnStopServer: - m_PersistentCalls: - m_Calls: [] - hasSpawned: 0 ---- !u!4 &2011878191 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2011878188} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 10 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2020215608 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2020215609} - - component: {fileID: 2020215611} - - component: {fileID: 2020215610} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2020215609 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2020215608} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 993261494} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2020215610 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2020215608} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Server Only ---- !u!222 &2020215611 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2020215608} - m_CullTransparentMesh: 0 ---- !u!1 &2054208274 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2054208276} - - component: {fileID: 2054208275} - m_Layer: 0 - m_Name: Directional light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &2054208275 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2054208274} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.802082 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &2054208276 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2054208274} - m_LocalRotation: {x: 0.10938167, y: 0.8754261, z: -0.40821788, w: 0.23456976} - m_LocalPosition: {x: 0, y: 10, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 50, y: 150, z: 0} ---- !u!1 &2064208030 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2064208031} - - component: {fileID: 2064208033} - - component: {fileID: 2064208032} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2064208031 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2064208030} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1345848863} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2064208032 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2064208030} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &2064208033 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2064208030} - m_CullTransparentMesh: 0 diff --git a/Assets/Mirror/Examples/Tanks/Scenes/Scene.unity b/Assets/Mirror/Examples/Tanks/Scenes/Scene.unity index 1f245a09..a0fa3576 100644 --- a/Assets/Mirror/Examples/Tanks/Scenes/Scene.unity +++ b/Assets/Mirror/Examples/Tanks/Scenes/Scene.unity @@ -54,7 +54,7 @@ LightmapSettings: m_EnableBakedLightmaps: 0 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 12 + serializedVersion: 10 m_Resolution: 2 m_BakeResolution: 40 m_AtlasSize: 1024 @@ -62,7 +62,6 @@ LightmapSettings: m_AOMaxDistance: 1 m_CompAOExponent: 1 m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 m_Padding: 2 m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 @@ -77,16 +76,10 @@ LightmapSettings: m_PVRDirectSampleCount: 32 m_PVRSampleCount: 500 m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 m_PVRFilterTypeDirect: 0 m_PVRFilterTypeIndirect: 0 m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 m_PVRCulling: 1 m_PVRFilteringGaussRadiusDirect: 1 m_PVRFilteringGaussRadiusIndirect: 5 @@ -94,9 +87,7 @@ LightmapSettings: m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 + m_ShowResolutionOverlay: 1 m_LightingDataAsset: {fileID: 0} m_UseShadowmask: 1 --- !u!196 &4 @@ -167,7 +158,7 @@ MonoBehaviour: m_GameObject: {fileID: 20677886} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -177,6 +168,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -247,10 +240,9 @@ Camera: m_ClearFlags: 1 m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 @@ -393,7 +385,7 @@ MonoBehaviour: m_GameObject: {fileID: 472317786} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -403,6 +395,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -514,7 +508,7 @@ MonoBehaviour: m_GameObject: {fileID: 597109994} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -524,6 +518,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 20 @@ -593,7 +589,7 @@ MonoBehaviour: m_GameObject: {fileID: 607305577} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -603,6 +599,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 20 @@ -672,7 +670,7 @@ MonoBehaviour: m_GameObject: {fileID: 637114753} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -682,6 +680,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -751,7 +751,7 @@ MonoBehaviour: m_GameObject: {fileID: 721152070} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -761,6 +761,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -831,7 +833,7 @@ MonoBehaviour: m_GameObject: {fileID: 721760294} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -845,20 +847,17 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} m_DisabledSprite: {fileID: 0} m_AnimationTriggers: m_NormalTrigger: Normal m_HighlightedTrigger: Highlighted m_PressedTrigger: Pressed - m_SelectedTrigger: Highlighted m_DisabledTrigger: Disabled m_Interactable: 1 m_TargetGraphic: {fileID: 721760297} @@ -876,6 +875,8 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 1 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null --- !u!114 &721760297 MonoBehaviour: m_ObjectHideFlags: 0 @@ -885,7 +886,7 @@ MonoBehaviour: m_GameObject: {fileID: 721760294} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -895,6 +896,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} m_Type: 1 m_PreserveAspect: 0 @@ -904,7 +907,6 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 --- !u!222 &721760298 CanvasRenderer: m_ObjectHideFlags: 0 @@ -959,16 +961,17 @@ MonoBehaviour: m_GameObject: {fileID: 754665786} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} m_RaycastTarget: 1 - m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -1083,7 +1086,6 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 - m_ReceiveGI: 1 m_PreserveUVs: 1 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -1186,7 +1188,7 @@ MonoBehaviour: m_GameObject: {fileID: 1117608592} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -1196,6 +1198,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -1256,7 +1260,7 @@ MonoBehaviour: m_GameObject: {fileID: 1162041873} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -1266,6 +1270,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -1333,7 +1339,6 @@ MonoBehaviour: IsGameReady: 0 IsGameOver: 0 players: [] - NetworkManager: {fileID: 1282001520} --- !u!114 &1273045293 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1343,7 +1348,7 @@ MonoBehaviour: m_GameObject: {fileID: 1273045291} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreReversedGraphics: 1 @@ -1360,7 +1365,7 @@ MonoBehaviour: m_GameObject: {fileID: 1273045291} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_UiScaleMode: 0 @@ -1463,7 +1468,7 @@ MonoBehaviour: m_GameObject: {fileID: 1278248528} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -1473,6 +1478,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 @@ -1584,110 +1591,50 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a7aaac73a16c040fd871cb977b5c557b, type: 3} m_Name: m_EditorClassIdentifier: - client: {fileID: 0} - server: {fileID: 0} - playerPrefab: {fileID: 114118589361100106, guid: 6f43bf5488a7443d19ab2a83c6b91f35, - type: 3} - startPositionIndex: 0 - startPositions: [] - playerSpawnMethod: 0 ---- !u!114 &1282001522 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6ce81336eed77486e8ed5e3721e54c47, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 ---- !u!114 &1282001523 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: abe6be14204d94224a3e7cd99dd2ea73, type: 3} - m_Name: - m_EditorClassIdentifier: - authenticator: {fileID: 0} - Connected: + OnClientConnected: m_PersistentCalls: m_Calls: [] - Authenticated: + m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnClientDataReceived: m_PersistentCalls: m_Calls: [] - ClientNotReady: + m_TypeName: Mirror.ClientDataReceivedEvent, Mirror, Version=0.0.0.0, Culture=neutral, + PublicKeyToken=null + OnClientError: m_PersistentCalls: m_Calls: [] - ClientChangeScene: + m_TypeName: Mirror.UnityEventException, Mirror, Version=0.0.0.0, Culture=neutral, + PublicKeyToken=null + OnClientDisconnected: m_PersistentCalls: m_Calls: [] - ClientSceneChanged: + m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnServerConnected: m_PersistentCalls: m_Calls: [] - Disconnected: + m_TypeName: Mirror.UnityEventInt, Mirror, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnServerDataReceived: m_PersistentCalls: m_Calls: [] - spawnPrefabs: - - {fileID: 1916082411674582, guid: 6f43bf5488a7443d19ab2a83c6b91f35, type: 3} - Transport: {fileID: 1282001524} ---- !u!114 &1282001523 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a5f5ec068f5604c32b160bc49ee97b75, type: 3} - m_Name: - m_EditorClassIdentifier: - MaxConnections: 4 - Started: + m_TypeName: Mirror.ServerDataReceivedEvent, Mirror, Version=0.0.0.0, Culture=neutral, + PublicKeyToken=null + OnServerError: m_PersistentCalls: m_Calls: [] - Connected: + m_TypeName: Mirror.UnityEventIntException, Mirror, Version=0.0.0.0, Culture=neutral, + PublicKeyToken=null + OnServerDisconnected: m_PersistentCalls: m_Calls: [] - Authenticated: - m_PersistentCalls: - m_Calls: [] - ServerChangeScene: - m_PersistentCalls: - m_Calls: [] - ServerSceneChanged: - m_PersistentCalls: - m_Calls: [] - Disconnected: - m_PersistentCalls: - m_Calls: [] - Stopped: - m_PersistentCalls: - m_Calls: [] - authenticator: {fileID: 0} - Listening: 1 - transport: {fileID: 1282001524} ---- !u!114 &1282001524 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1282001517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6ce81336eed77486e8ed5e3721e54c47, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 + m_TypeName: Mirror.UnityEventInt, Mirror, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + port: 7777 + NoDelay: 1 + serverMaxMessageSize: 16384 + serverMaxReceivesPerTick: 10000 + clientMaxMessageSize: 16384 + clientMaxReceivesPerTick: 1000 --- !u!1 &1458789072 GameObject: m_ObjectHideFlags: 0 @@ -1801,7 +1748,7 @@ MonoBehaviour: m_GameObject: {fileID: 1633146726} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_HorizontalAxis: Horizontal @@ -1820,7 +1767,7 @@ MonoBehaviour: m_GameObject: {fileID: 1633146726} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_FirstSelected: {fileID: 0} @@ -1887,7 +1834,7 @@ MonoBehaviour: m_GameObject: {fileID: 1966128034} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -1897,6 +1844,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} m_Type: 1 m_PreserveAspect: 0 @@ -1906,7 +1855,6 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 --- !u!222 &1966128037 CanvasRenderer: m_ObjectHideFlags: 0 @@ -1964,7 +1912,7 @@ MonoBehaviour: m_GameObject: {fileID: 1986496789} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Script: {fileID: 575553740, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -1978,20 +1926,17 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} m_DisabledSprite: {fileID: 0} m_AnimationTriggers: m_NormalTrigger: Normal m_HighlightedTrigger: Highlighted m_PressedTrigger: Pressed - m_SelectedTrigger: Highlighted m_DisabledTrigger: Disabled m_Interactable: 1 m_TargetGraphic: {fileID: 1986496792} @@ -2008,9 +1953,13 @@ MonoBehaviour: m_OnEndEdit: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.InputField+SubmitEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null m_OnValueChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.InputField+OnChangeEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} m_CustomCaretColor: 0 m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} @@ -2027,7 +1976,7 @@ MonoBehaviour: m_GameObject: {fileID: 1986496789} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -2037,6 +1986,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} m_Type: 1 m_PreserveAspect: 0 @@ -2046,7 +1997,6 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 --- !u!222 &1986496793 CanvasRenderer: m_ObjectHideFlags: 0 @@ -2080,14 +2030,13 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2054208274} m_Enabled: 1 - serializedVersion: 10 + serializedVersion: 8 m_Type: 1 m_Shape: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1 m_Range: 10 m_SpotAngle: 30 - m_InnerSpotAngle: 21.802082 m_CookieSize: 10 m_Shadows: m_Type: 2 @@ -2097,24 +2046,6 @@ Light: m_Bias: 0.05 m_NormalBias: 0.4 m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 m_Cookie: {fileID: 0} m_DrawHalo: 0 m_Flare: {fileID: 0} @@ -2122,15 +2053,12 @@ Light: m_CullingMask: serializedVersion: 2 m_Bits: 4294967295 - m_RenderingLayerMask: 1 m_Lightmapping: 4 m_LightShadowCasterMode: 0 m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 m_ColorTemperature: 6570 m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 --- !u!4 &2054208276 diff --git a/Assets/Mirror/Runtime/Logging/ConsoleColorLogHandler.cs b/Assets/Mirror/Runtime/Logging/ConsoleColorLogHandler.cs new file mode 100644 index 00000000..a1b7d22c --- /dev/null +++ b/Assets/Mirror/Runtime/Logging/ConsoleColorLogHandler.cs @@ -0,0 +1,44 @@ +using System; +using UnityEngine; + +namespace Mirror.Logging +{ + public class ConsoleColorLogHandler : ILogHandler + { + readonly bool showExceptionStackTrace; + + public ConsoleColorLogHandler(bool showExceptionStackTrace) + { + this.showExceptionStackTrace = showExceptionStackTrace; + } + + public void LogException(Exception exception, UnityEngine.Object context) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine($"Exception: {exception.Message}"); + if (showExceptionStackTrace) + { + Console.WriteLine($" {exception.StackTrace}"); + } + Console.ResetColor(); + } + + public void LogFormat(LogType logType, UnityEngine.Object context, string format, params object[] args) + { + switch (logType) + { + case LogType.Exception: + case LogType.Error: + case LogType.Assert: + Console.ForegroundColor = ConsoleColor.Red; + break; + case LogType.Warning: + Console.ForegroundColor = ConsoleColor.Yellow; + break; + } + + Console.WriteLine(string.Format(format, args)); + Console.ResetColor(); + } + } +} diff --git a/Assets/Mirror/Runtime/Logging/ConsoleColorLogHandler.cs.meta b/Assets/Mirror/Runtime/Logging/ConsoleColorLogHandler.cs.meta new file mode 100644 index 00000000..329c6eba --- /dev/null +++ b/Assets/Mirror/Runtime/Logging/ConsoleColorLogHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a9618569c20a504aa86feb5913c70e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Runtime/Logging/NetworkHeadlessLogger.cs b/Assets/Mirror/Runtime/Logging/NetworkHeadlessLogger.cs new file mode 100644 index 00000000..98423d06 --- /dev/null +++ b/Assets/Mirror/Runtime/Logging/NetworkHeadlessLogger.cs @@ -0,0 +1,24 @@ +using UnityEngine; +using UnityEngine.Rendering; + +namespace Mirror.Logging +{ + /// + /// Used to replace log hanlder with Console Color LogHandler + /// + [DisallowMultipleComponent] + [AddComponentMenu("Network/NetworkHeadlessLogger")] + [HelpURL("https://mirror-networking.com/docs/Components/NetworkHeadlessLogger.html")] + public class NetworkHeadlessLogger : MonoBehaviour + { + [SerializeField] bool showExceptionStackTrace = false; + + void Awake() + { + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null) + { + LogFactory.ReplaceLogHandler(new ConsoleColorLogHandler(showExceptionStackTrace)); + } + } + } +} diff --git a/Assets/Mirror/Runtime/Logging/NetworkHeadlessLogger.cs.meta b/Assets/Mirror/Runtime/Logging/NetworkHeadlessLogger.cs.meta new file mode 100644 index 00000000..221a61b8 --- /dev/null +++ b/Assets/Mirror/Runtime/Logging/NetworkHeadlessLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7627623f2b9fad4484082517cd73e67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 7453abfe9e8b2c04a8a47eb536fe21eb, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mirror/Runtime/Messages.cs b/Assets/Mirror/Runtime/Messages.cs index 6436d2b5..1e38e241 100644 --- a/Assets/Mirror/Runtime/Messages.cs +++ b/Assets/Mirror/Runtime/Messages.cs @@ -159,16 +159,43 @@ public void Serialize(NetworkWriter writer) #region Internal System Messages public struct SpawnMessage : IMessageBase { + /// + /// netId of new or existing object + /// public uint netId; + /// + /// Is the spawning object the local player. Sets ClientScene.localPlayer + /// public bool isLocalPlayer; + /// + /// Sets hasAuthority on the spawned object + /// public bool isOwner; + /// + /// The id of the scene object to spawn + /// public ulong sceneId; + /// + /// The id of the prefab to spawn + /// If sceneId != 0 then it is used instead of assetId + /// public Guid assetId; + /// + /// Local position + /// public Vector3 position; + /// + /// Local rotation + /// public Quaternion rotation; + /// + /// Local scale + /// public Vector3 scale; - // the serialized component data - // -> ArraySegment to avoid unnecessary allocations + /// + /// The serialized component data + /// ArraySegment to avoid unnecessary allocations + /// public ArraySegment payload; public void Deserialize(NetworkReader reader) diff --git a/Assets/Mirror/Runtime/NetworkReader.cs b/Assets/Mirror/Runtime/NetworkReader.cs index c9793de9..d76e1342 100644 --- a/Assets/Mirror/Runtime/NetworkReader.cs +++ b/Assets/Mirror/Runtime/NetworkReader.cs @@ -347,9 +347,19 @@ public static byte[] ReadBytes(this NetworkReader reader, int count) } public static Guid ReadGuid(this NetworkReader reader) => new Guid(reader.ReadBytes(16)); + public static Transform ReadTransform(this NetworkReader reader) + { + // Dont use null propagation here as it could lead to MissingReferenceException + NetworkIdentity networkIdentity = reader.ReadNetworkIdentity(); + return networkIdentity != null ? networkIdentity.transform : null; + } - public static Transform ReadTransform(this NetworkReader reader) => reader.ReadNetworkIdentity()?.transform; - public static GameObject ReadGameObject(this NetworkReader reader) => reader.ReadNetworkIdentity()?.gameObject; + public static GameObject ReadGameObject(this NetworkReader reader) + { + // Dont use null propagation here as it could lead to MissingReferenceException + NetworkIdentity networkIdentity = reader.ReadNetworkIdentity(); + return networkIdentity != null ? networkIdentity.gameObject : null; + } public static NetworkIdentity ReadNetworkIdentity(this NetworkReader reader) { diff --git a/Assets/Mirror/Runtime/NetworkServer.cs b/Assets/Mirror/Runtime/NetworkServer.cs index 55e278fe..5843bea1 100644 --- a/Assets/Mirror/Runtime/NetworkServer.cs +++ b/Assets/Mirror/Runtime/NetworkServer.cs @@ -330,8 +330,7 @@ internal void OnServerChangeScene(string newSceneName) } /// - /// Called on the server when a scene is completed loaded, when the scene load was initiated by the server with ServerChangeScene(). - /// + /// Called on the server when a scene is completed loaded, when the scene load was initiated by the server with ServerChangeScene(). /// /// The name of the new scene. internal void OnServerSceneChanged(string sceneName) { diff --git a/Assets/Mirror/Runtime/SyncDictionary.cs b/Assets/Mirror/Runtime/SyncDictionary.cs index bf6ca64f..391bef0d 100644 --- a/Assets/Mirror/Runtime/SyncDictionary.cs +++ b/Assets/Mirror/Runtime/SyncDictionary.cs @@ -7,7 +7,7 @@ namespace Mirror { [EditorBrowsable(EditorBrowsableState.Never)] - public abstract class SyncIDictionary : IDictionary, ISyncObject + public abstract class SyncIDictionary : IDictionary, ISyncObject, IReadOnlyDictionary { protected readonly IDictionary objects; @@ -88,6 +88,10 @@ protected virtual void SerializeItem(NetworkWriter writer, TValue item) { } public ICollection Values => objects.Values; + IEnumerable IReadOnlyDictionary.Keys => objects.Keys; + + IEnumerable IReadOnlyDictionary.Values => objects.Values; + // throw away all the changes // this should be called after a successfull sync public void Flush() => changes.Clear(); diff --git a/Assets/Mirror/Runtime/Transport/Transport.cs b/Assets/Mirror/Runtime/Transport/Transport.cs index 64473b0e..115667bf 100644 --- a/Assets/Mirror/Runtime/Transport/Transport.cs +++ b/Assets/Mirror/Runtime/Transport/Transport.cs @@ -192,7 +192,9 @@ public virtual Task ClientConnectAsync(Uri uri) // e.g. in uSurvival Transport would apply Cmds before // ShoulderRotation.LateUpdate, resulting in projectile // spawns at the point before shoulder rotation. +#pragma warning disable UNT0001 // Empty Unity message public void Update() { } +#pragma warning restore UNT0001 // Empty Unity message /// /// called when quitting the application by closing the window / pressing stop in the editor diff --git a/Assets/Mirror/Runtime/Transport/Websocket/Plugins/WebSocket.jslib b/Assets/Mirror/Runtime/Transport/Websocket/Plugins/WebSocket.jslib index ff1e6220..b6a6deeb 100644 --- a/Assets/Mirror/Runtime/Transport/Websocket/Plugins/WebSocket.jslib +++ b/Assets/Mirror/Runtime/Transport/Websocket/Plugins/WebSocket.jslib @@ -88,7 +88,11 @@ var LibraryWebSockets = { SocketState: function (socketInstance) { var socket = webSocketInstances[socketInstance]; - return socket.readyState; + + if(socket) + return socket.readyState; + + return false; }, SocketSend: function (socketInstance, ptr, length) diff --git a/Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj b/Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj index 16da27a9..4f41f31e 100644 --- a/Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj +++ b/Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj @@ -100,6 +100,8 @@ + + @@ -176,6 +178,7 @@ + diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs index 2cf42a47..d1857498 100644 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs +++ b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests.cs @@ -64,6 +64,18 @@ public void OverrideVirtualCallBaseCommand() Assert.That(weaverErrors, Is.Empty); } + [Test] + public void OverrideVirtualCallsBaseCommandWithMultipleBaseClasses() + { + Assert.That(weaverErrors, Is.Empty); + } + + [Test] + public void OverrideVirtualCallsBaseCommandWithOverride() + { + Assert.That(weaverErrors, Is.Empty); + } + [Test] public void AbstractCommand() { diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs index f60cc667..0784e170 100644 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs +++ b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallBaseCommand.cs @@ -1,6 +1,5 @@ using Mirror; - namespace WeaverCommandTests.OverrideVirtualCallBaseCommand { class OverrideVirtualCallBaseCommand : baseBehaviour diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithMultipleBaseClasses.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithMultipleBaseClasses.cs new file mode 100644 index 00000000..842fa556 --- /dev/null +++ b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithMultipleBaseClasses.cs @@ -0,0 +1,27 @@ +using Mirror; + +namespace WeaverCommandTests.OverrideVirtualCallsBaseCommandWithMultipleBaseClasses +{ + class OverrideVirtualCallsBaseCommandWithMultipleBaseClasses : middleBehaviour + { + [Command] + protected override void CmdDoSomething() + { + // do somethin + base.CmdDoSomething(); + } + } + + class middleBehaviour : baseBehaviour + { + } + + class baseBehaviour : NetworkBehaviour + { + [Command] + protected virtual void CmdDoSomething() + { + // do more stuff + } + } +} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithOverride.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithOverride.cs new file mode 100644 index 00000000..35736d78 --- /dev/null +++ b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCallsBaseCommandWithOverride.cs @@ -0,0 +1,34 @@ +using Mirror; + +namespace WeaverCommandTests.OverrideVirtualCallsBaseCommandWithOverride +{ + class OverrideVirtualCallsBaseCommandWithOverride : middleBehaviour + { + [Command] + protected override void CmdDoSomething() + { + // do something + base.CmdDoSomething(); + } + } + + + class middleBehaviour : baseBehaviour + { + [Command] + protected override void CmdDoSomething() + { + // do something else + base.CmdDoSomething(); + } + } + + class baseBehaviour : NetworkBehaviour + { + [Command] + protected virtual void CmdDoSomething() + { + // do more stuff + } + } +} diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs index e6b18766..c02684b2 100644 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs +++ b/Assets/Mirror/Tests/Editor/Weaver/WeaverCommandTests~/OverrideVirtualCommand.cs @@ -1,6 +1,5 @@ using Mirror; - namespace WeaverCommandTests.OverrideVirtualCommand { class OverrideVirtualCommand : baseBehaviour diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncEventTests.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncEventTests.cs index 46e494e1..280e1a3e 100644 --- a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncEventTests.cs +++ b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncEventTests.cs @@ -10,6 +10,12 @@ public void SyncEventValid() Assert.That(weaverErrors, Is.Empty); } + [Test] + public void MultipleSyncEvent() + { + Assert.That(weaverErrors, Is.Empty); + } + [Test] public void ErrorWhenSyncEventDoesntStartWithEvent() { diff --git a/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncEventTests~/MultipleSyncEvent.cs b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncEventTests~/MultipleSyncEvent.cs new file mode 100644 index 00000000..591023c8 --- /dev/null +++ b/Assets/Mirror/Tests/Editor/Weaver/WeaverSyncEventTests~/MultipleSyncEvent.cs @@ -0,0 +1,16 @@ +using Mirror; + +namespace WeaverSyncEventTests.MultipleSyncEvent +{ + class MultipleSyncEvent : NetworkBehaviour + { + public delegate void MySyncEventDelegate(); + public delegate void MySyncEventDelegate2(int someNumber); + + [SyncEvent] + public event MySyncEventDelegate EventDoCoolThingsWithExcitingPeople; + + [SyncEvent] + public event MySyncEventDelegate2 EventDoMoreCoolThingsWithExcitingPeople; + } +} diff --git a/Assets/Mirror/Tests/Runtime/TestScene.meta b/Assets/Mirror/Tests/Runtime/TestScene.meta index 19c8dcf1..754e9277 100644 --- a/Assets/Mirror/Tests/Runtime/TestScene.meta +++ b/Assets/Mirror/Tests/Runtime/TestScene.meta @@ -1,5 +1,9 @@ fileFormatVersion: 2 +<<<<<<< HEAD:Assets/Mirror/Tests/Runtime/TestScene.meta guid: 97bfba373f9dbd24e90eaca7003cd411 +======= +guid: 73a9bb2dacafa8141bce8feef34e33a7 +>>>>>>> upstream:Assets/Mirror/Cloud.meta folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c5e1952b..72776b4b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ Following these guidelines helps to communicate that you respect the time of the This is an open source project and we love to receive contributions from our community — you! There are many ways to contribute, from writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be incorporated into the main project itself. -If you haven't already, come find us in [Discord](https://discord.gg/yTYe3h). We want you working on things you're excited about, and we can give you instant feedback. +If you haven't already, come find us in [Discord](https://discord.gg/N9QVxbM). We want you working on things you're excited about, and we can give you instant feedback. ### I don't want to read this whole thing I just have a question!! diff --git a/doc/Components/Authenticators/index.md b/doc/Components/Authenticators/index.md index 7c2e43ff..e54f7abc 100644 --- a/doc/Components/Authenticators/index.md +++ b/doc/Components/Authenticators/index.md @@ -2,7 +2,7 @@ When you have a multiplayer game, often you need to store information about your player for later games, keep game stats or communicate with your friends. For all these use cases, you often need a way to uniquely identify a user. Being able to tell users apart is called authentication. There are several methods available, some examples include: - Ask the user for username and password -- Use a third party oath or OpenID identity provider, such as Facebook, Twitter, Google +- Use a third party OAuth2 or OpenID identity provider, such as Facebook, Twitter, Google - Use a third party service such as PlayFab, GameLift or Steam - Use the device id, very popular method in mobile - Use Google Play in Android diff --git a/doc/Components/NetworkHeadlessLogger.md b/doc/Components/NetworkHeadlessLogger.md new file mode 100644 index 00000000..0a61dc2b --- /dev/null +++ b/doc/Components/NetworkHeadlessLogger.md @@ -0,0 +1,9 @@ +# Network Headless Logger + +Network Headless Logger replaces the the default log handler with one that set `Console.ForegroundColor`. + +Only replaces the handler when running in headless mode. + +![Inspector](NetworkHeadlessLogger.png) + +`showExceptionStackTrace` will log the stack trace of any exceptions sent to the handler. \ No newline at end of file diff --git a/doc/Components/NetworkHeadlessLogger.png b/doc/Components/NetworkHeadlessLogger.png new file mode 100644 index 00000000..53bd4d0a Binary files /dev/null and b/doc/Components/NetworkHeadlessLogger.png differ diff --git a/doc/Components/NetworkRigidbody.md b/doc/Components/NetworkRigidbody.md new file mode 100644 index 00000000..fa68471a --- /dev/null +++ b/doc/Components/NetworkRigidbody.md @@ -0,0 +1,21 @@ +# Network Rigidbody + +> The Network Rigidbody classed as "Experimental" for now so please share any problems or bugs you find with it and use at your own risk if production builds. + +The Network Rigidbody component synchronizes velocity and other properties of a rigidbody across the network. This component is useful when you have a non-kinematic rigidbody that have constant forces applied to them, like gravity, but also want to apply forces or change velocity to that rigidbody or server or client with authority. For example, objects that move and jump using rigidbody using gravity. + +A game object with a Network Rigidbody component must also have a Network Identity component. When you add a Network Rigidbody component to a game object, Mirror also adds a Network Identity component on that game object if it does not already have one. + +Network Rigidbody works best when there is also a NetworkTransform for the object to keep position as well as velocity in sync. + +![Network Rigidbody inspector](NetworkRigidbody.png) + +By default, Network Rigidbody is server-authoritative unless you check the box for **Client Authority**. Client Authority applies to player objects as well as non-player objects that have been specifically assigned to a client, but only for this component. With this enabled, value changes are send from the client to the server. + +The **Sensitivity** options allow you to set a minimum thresholds before values are send over network. This helps minimize network traffic for very small changes. + +For some object you may not want them to rotate but don't need to sync the Angular Velocity. The **Clear Angular Velocity** will set the Angular Velocity to zero each frame causing the minimizing when objects rotation. The same can apply to **Clear Velocity**. If **Clear Velocity Velocity** is enabled then clear is ignored. + +Normally, changes are sent to all observers of the object this component is on. Setting **Sync Mode** to Owner Only makes the changes private between the server and the client owner of the object. + +You can use the **Sync Interval** to specify how often it syncs (in seconds). This applies both to Client Authority and Server Authority. diff --git a/doc/Components/NetworkRigidbody.png b/doc/Components/NetworkRigidbody.png new file mode 100644 index 00000000..241e9b1b Binary files /dev/null and b/doc/Components/NetworkRigidbody.png differ diff --git a/doc/Components/index.md b/doc/Components/index.md index 3812148f..20997c96 100644 --- a/doc/Components/index.md +++ b/doc/Components/index.md @@ -8,10 +8,10 @@ These core components are included in Mirror: Network Authenticators facilitate integration of user accounts and credentials into your application. - [Network Discovery](NetworkDiscovery.md) Network Discovery uses a UDP broadcast on the LAN enabling clients to find the running server and connect to it. -- [Network Ping Display](NetworkPingDisplay.md) - Network Ping Display shows the Ping time for clients using OnGUI - [Network Identity](NetworkIdentity.md) The Network Identity component is at the heart of the Mirror networking high-level API. It controls a game object’s unique identity on the network, and it uses that identity to make the networking system aware of the game object. It offers two different options for configuration and they are mutually exclusive, which means either one of the options or none can be checked. +- [Network Headless Logger](NetworkHeadlessLogger.md) + Network Headless Logger adds color to log when running in headless mode - [Network Log Settings](NetworkLogSettings.md) The Network Log Settings component allows you to configure logging levels and load the settings in a build. - [Network Manager](NetworkManager.md) @@ -20,8 +20,12 @@ These core components are included in Mirror: The Network Manager HUD is a quick-start tool to help you start building your multiplayer game straight away, without first having to build a user interface for game creation/connection/joining. It allows you to jump straight into your gameplay programming, and means you can build your own version of these controls later in your development schedule. - [Network Match Checker](NetworkMatchChecker.md) The Network Match Checker component controls visibility of networked objects based on match id. +- [Network Ping Display](NetworkPingDisplay.md) + Network Ping Display shows the Ping time for clients using OnGUI - [Network Proximity Checker](NetworkProximityChecker.md) The Network Proximity Checker component controls the visibility of game objects for network clients, based on proximity to players. +- [Network Rigidbody](NetworkRigidbody.md) + The Network Rigidbody synchronizes velocity and other properties of a rigidbody across the network. - [Network Room Manager](NetworkRoomManager.md) The Network Room Manager is an extension component of Network Manager that provides a basic functional room. - [Network Room Player](NetworkRoomPlayer.md) diff --git a/doc/Components/toc.yml b/doc/Components/toc.yml index c115a14d..9b9ee355 100644 --- a/doc/Components/toc.yml +++ b/doc/Components/toc.yml @@ -9,6 +9,8 @@ href: NetworkDiscovery.md - name: Network Identity href: NetworkIdentity.md +- name: Network Headless Logger + href: NetworkHeadlessLogger.md - name: Network Log Settings href: NetworkLogSettings.md - name: Network Manager @@ -17,8 +19,12 @@ href: NetworkManagerHUD.md - name: Network Match Checker href: NetworkMatchChecker.md +- name: Network Ping Display + href: NetworkPingDisplay.md - name: Network Proximity Checker href: NetworkProximityChecker.md +- name: Network Rigidbody + href: NetworkRigidbody.md - name: Network Room Manager href: NetworkRoomManager.md - name: Network Room Player diff --git a/doc/Guides/Attributes.md b/doc/Guides/Attributes.md index aa34bc0e..c8d8a588 100644 --- a/doc/Guides/Attributes.md +++ b/doc/Guides/Attributes.md @@ -3,6 +3,9 @@ Networking attributes are added to member functions of NetworkBehaviour scripts, to make them run on either the client or server. These attributes can be used for Unity game loop methods like Start or Update, as well as other implemented methods. + +> **NOTE**: when using abstract or virtual methods the Attributes need to be applied to the override methods too. + - **NetworkSettings** This attribute has been deprecated because `channels` were moved to transports (where applicable) and `interval` was moved to an inspector property - **Server** diff --git a/doc/Guides/Profiler.md b/doc/Guides/Profiler.md index 2c2666a2..81593078 100644 --- a/doc/Guides/Profiler.md +++ b/doc/Guides/Profiler.md @@ -1,16 +1,16 @@ # Mirror Network Profiler -The [mirror profiler](https://mirror-networking.com/download/mirror-profiler/) is part of the Mirror Pro suit. -As of this writing it is accessible to our Github Supporters. +The Mirror Profiler is part of the Mirror Pro suit. +As of this writing it is accessible to our [GitHub Sponsors](https://github.com/sponsors/vis2k). ![Network Profiler](Profiler.png) ## Installation -1. Make sure you have the latest version of Mirror -2. Become a [Github Supporter](https://github.com/sponsors/vis2k) if you haven't. -3. [Download](https://mirror-networking.com/download/mirror-profiler/) the profiler -4. Install the unity package in your project +1. Make sure you have the latest version of Mirror. +2. Become a [GitHub Sponsor](https://github.com/sponsors/vis2k) if you haven't. +3. Download the profiler. +4. Install the unity package in your project. ## Usage diff --git a/doc/Transports/FizzyFacepunch.PNG b/doc/Transports/FizzyFacepunch.PNG new file mode 100644 index 00000000..ae605a60 Binary files /dev/null and b/doc/Transports/FizzyFacepunch.PNG differ diff --git a/doc/Transports/FizzyFacepunch.md b/doc/Transports/FizzyFacepunch.md new file mode 100644 index 00000000..d0639e58 --- /dev/null +++ b/doc/Transports/FizzyFacepunch.md @@ -0,0 +1,19 @@ +# FizzyFacepunch Transport + +FizzyFacepunch is a Steam P2P transport for Mirror, it utilizes Steam's P2P service to directly connect or relay your connection to another player. FizzyFacepunch is based on the [Facepunch.Steamworks](https://github.com/Facepunch/Facepunch.Steamworks) wrapper. + +You can get the release **[Here](https://github.com/Chykary/FizzyFacepunch/releases)** or you can clone the repo **[Here](https://github.com/Chykary/FizzyFacepunch)**. + +## Features + +* Multiple Customizable Channels : You can customize the channels in the transport, whether you want just 1 or 5 channels that are unreliable or reliable (best to leave channel 0 as reliable). +* Steam Nat Punching & Relay : The transport will use Steam to do Nat Punching to your destination, and if that doesn't work, steam's relay Server will be used to ensure you can always connect (latency may vary). +* No Code Changes Needed : If you Already use Mirror, you just need to slap this transport in (maybe add your steam App ID in your build), and everything should work the same like any other Mirror Transport. "It Just Works" -Todd Howard + +![The FizzySteamworks Transport component in the Inspector window](FizzyFacepunch.PNG) + +## Credits +* [Chykary](https://github.com/Chykary/FizzyFacepunch) : The author of this Transport. +* [Facepunch](https://github.com/Facepunch) : Creator of Facepunch.Steamworks. +* [vis2k](https://github.com/vis2k) : Creator of Mirror. +* Valve : Steam diff --git a/doc/Transports/FizzySteamworks.PNG b/doc/Transports/FizzySteamworks.PNG new file mode 100644 index 00000000..557c0c27 Binary files /dev/null and b/doc/Transports/FizzySteamworks.PNG differ diff --git a/doc/Transports/Fizzy.md b/doc/Transports/FizzySteamworks.md similarity index 60% rename from doc/Transports/Fizzy.md rename to doc/Transports/FizzySteamworks.md index d3ff06bf..dbb0c5c6 100644 --- a/doc/Transports/Fizzy.md +++ b/doc/Transports/FizzySteamworks.md @@ -1,8 +1,8 @@ -# FizzySteam Transport +# FizzySteamworks Transport -Fizzy Steam is a Steam P2P transport for Mirror, it utilizes Steam's P2P service to directly connect or relay your connection to another player. Fizzy Steam is based of [Steamworks.Net](https://github.com/rlabrecque/Steamworks.NET) wrapper. +FizzySteamworks is a Steam P2P transport for Mirror, it utilizes Steam's P2P service to directly connect or relay your connection to another player. FizzySteamworks is based on the [Steamworks.Net](https://github.com/rlabrecque/Steamworks.NET) wrapper. -You can get the release **[Here](https://github.com/Chykary/FizzySteamyMirror/releases)** with the latest version of Steamworks.Net included or you can clone the repo **[Here](https://github.com/Chykary/FizzySteamyMirror)**. +You can get the release **[Here](https://github.com/Chykary/FizzySteamworks/releases)** with the latest version of Steamworks.Net included or you can clone the repo **[Here](https://github.com/Chykary/FizzySteamworks)**. ## Features @@ -10,11 +10,11 @@ You can get the release **[Here](https://github.com/Chykary/FizzySteamyMirror/re * Steam Nat Punching & Relay : The transport will use Steam to do Nat Punching to your destination, and if that doesn't work, steam's relay Server will be used to ensure you can always connect (latency may vary). * No Code Changes Needed : If you Already use Mirror, you just need to slap this transport in (maybe add your steam App ID in your build), and everything should work the same like any other Mirror Transport. "It Just Works" -Todd Howard -![The Fizzy Transport component in the Inspector window](SteamTransport.PNG) +![The FizzySteamworks Transport component in the Inspector window](FizzySteamworks.PNG) ## Credits * [Fizz Cube](https://github.com/FizzCube) : Original author for this Transport. -* [Chykary](https://github.com/Chykary/FizzySteamyMirror) : The current maintainer for this Transport. +* [Chykary](https://github.com/Chykary/FizzySteamworks) : The current maintainer for this Transport. * [rlabrecque](https://github.com/rlabrecque) : Creator of Steamworks.Net. * [vis2k](https://github.com/vis2k) : Creator of Mirror. * Valve : Steam diff --git a/doc/Transports/LiteNetLib4Mirror.md b/doc/Transports/LiteNetLib4Mirror.md index 5ba6487b..a9884c94 100644 --- a/doc/Transports/LiteNetLib4Mirror.md +++ b/doc/Transports/LiteNetLib4Mirror.md @@ -27,6 +27,15 @@ - Connection statisitcs (need DEBUG or STATS_ENABLED flag) - Multicasting (for discovering hosts in local network) +## IL2CPP Warning! +With IL2CPP, IPv6 is only supported on Unity 2018.3.6f1 and later because of this: +[Unity ChangeLog](https://unity3d.com/unity/whats-new/2018.3.6) +> IL2CPP: Added protocol support for IPv6 on Windows. (1099133) +> +> IL2CPP: Correctly indicate that IPv6 is not supported on non-IPv6 platforms. (1108823) + +Also, socket Reuse Address option isn't available in IL2CPP. + ## Credits RevenantX - for [LiteNetLib](https://github.com/RevenantX/LiteNetLib/releases) vis2k & Paul - for [Mirror](https://assetstore.unity.com/packages/tools/network/mirror-129321) diff --git a/doc/Transports/SteamTransport.PNG b/doc/Transports/SteamTransport.PNG deleted file mode 100644 index 2ee8d242..00000000 Binary files a/doc/Transports/SteamTransport.PNG and /dev/null differ diff --git a/doc/Transports/index.md b/doc/Transports/index.md index 551143d4..a3084679 100644 --- a/doc/Transports/index.md +++ b/doc/Transports/index.md @@ -18,4 +18,6 @@ Mirror is a high level Networking Library that can use several different low lev - [UDP - LiteNetLib4Mirror](LiteNetLib4Mirror.md) LiteNetLib4Mirror implements a UDP transport based on LiteNetLib with Network Discovery and uPnP included. -- [Steam - Fizzy](Fizzy.md) A complete rebuild utilising Async (Previously SteamNetNetworkTransport) of a Steam P2P network transport layer. +- [Steam - FizzySteamworks](FizzySteamworks.md) Transport utilising Steam P2P network, building on Steamworks.NET. + +- [Steam - FizzyFacepunch](FizzyFacepunch.md) Transport utilising Steam P2P network, building on Facepunch.Steamworks. \ No newline at end of file diff --git a/doc/Transports/toc.yml b/doc/Transports/toc.yml index 5bd9b3fb..22c40473 100644 --- a/doc/Transports/toc.yml +++ b/doc/Transports/toc.yml @@ -12,5 +12,7 @@ href: Ignorance.md - name: UDP - LiteNetLib4Mirror href: LiteNetLib4Mirror.md -- name: Steam - Fizzy - href: Fizzy.md +- name: Steam - FizzySteamworks + href: FizzySteamworks.md +- name: Steam - FizzyFacepunch + href: FizzyFacepunch.md diff --git a/doc/doc.csproj b/doc/doc.csproj index 11e8f6a5..3d74cf6b 100644 --- a/doc/doc.csproj +++ b/doc/doc.csproj @@ -6,6 +6,7 @@ + \ No newline at end of file diff --git a/doc/index.md b/doc/index.md index 4e7fe709..0289c289 100644 --- a/doc/index.md +++ b/doc/index.md @@ -17,7 +17,7 @@ uMMORPG was possible with \<6000 lines of code. We needed a networking library t - **TCP** ([Telepathy](Transports/Telepathy.md) and [Apathy](https://mirror-networking.com/apathy/) and [Booster](https://mirror-networking.com/booster/)) - **UDP** ([ENet](Transports/Ignorance.md) and [LiteNetLib](Transports/LiteNetLib4Mirror.md)) - **WebGL** ([Secure Web Sockets](Transports/WebSockets.md)) -- **Steam** ([Steamworks.Net or FacePunch](Transports/Fizzy.md)) +- **Steam** ([Steamworks.Net](Transports/FizzySteamworks.md)) and ([FacePunch](Transports/FizzyFacepunch.md)) - **Multiplexer** ([Multiplexer](Transports/Multiplexer.md)) - **Fallback** ([Fallback](Transports/Fallback.md))