From 942fe79bab75050e2f3a132c8fafd28a42a052b1 Mon Sep 17 00:00:00 2001 From: lpsandaruwan Date: Wed, 27 Jul 2022 17:59:15 +0530 Subject: [PATCH 1/2] CLYS-116 - unity example patches --- .../Runtime/Example~/Scenes/LobbyScene.unity | Bin 121308 -> 149546 bytes .../Example~/Scripts/ExampleRoomController.cs | 36 ++--- .../Scripts/Lobby/UI/CreateUserMenu.cs | 2 +- .../Scripts/Lobby/UI/LobbyController.cs | 3 + .../Views/ExampleNetworkedEntityView.cs | 6 +- .../Example~/Settings/ColyseusSettings.asset | 4 +- .../Settings/ColyseusSettings.asset.meta | 4 +- .../Scripts/Managers/ColyseusManager.cs | 10 +- .../Runtime/Scripts/Models/ColyseusClient.cs | 1 + Assets/Colyseus/Runtime/Scripts/Request.cs | 23 ++-- .../Scripts/Serializer/Schema/Schema.cs | 5 + .../Scripts/Settings/ColyseusSettings.cs | 128 ++++++++++++++++++ .../Scripts/Settings/ColyseusSettings.cs.meta | 11 ++ Server/package.json | 22 +-- 14 files changed, 204 insertions(+), 51 deletions(-) create mode 100644 Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs create mode 100644 Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs.meta diff --git a/Assets/Colyseus/Runtime/Example~/Scenes/LobbyScene.unity b/Assets/Colyseus/Runtime/Example~/Scenes/LobbyScene.unity index dc02c8d332b03c60d7e48f253c0d7ff37ea1b384..b0f96fc970c636c9bba175ac58ff6b86599b015f 100644 GIT binary patch literal 149546 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 F{{g;Cmu>(6 literal 121308 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 diff --git a/Assets/Colyseus/Runtime/Example~/Scripts/ExampleRoomController.cs b/Assets/Colyseus/Runtime/Example~/Scripts/ExampleRoomController.cs index ed966838..9562c984 100644 --- a/Assets/Colyseus/Runtime/Example~/Scripts/ExampleRoomController.cs +++ b/Assets/Colyseus/Runtime/Example~/Scripts/ExampleRoomController.cs @@ -7,6 +7,7 @@ using GameDevWare.Serialization; using LucidSightTools; using NativeWebSocket; +using Settings; using UnityEngine; /// @@ -136,6 +137,11 @@ public class ExampleRoomController /// public List rooms = new List(); + private Action DisposeNetworkEntitiesOnAdd; + private Action DisposeNetworkEntitiesOnRemove; + private Action DisposeNetworkedUsersOnAdd; + private Action DisposeNetworkedUsersOnRemove; + /// /// Returns the synchronized time from the server in milliseconds. /// @@ -295,7 +301,7 @@ public async Task CreateSpecificRoom(ColyseusClient client, string roomName, str } onComplete?.Invoke(true); - LSLog.LogImportant($"Created Room: {_room.Id}"); + LSLog.LogImportant($"Created Room: {_room.RoomId}"); _lastRoomId = roomId; RegisterRoomHandlers(); } @@ -326,8 +332,8 @@ public async Task JoinOrCreateRoom(Action onComplete = null) } onComplete?.Invoke(true); - LSLog.LogImportant($"Joined / Created Room: {_room.Id}"); - _lastRoomId = _room.Id; + LSLog.LogImportant($"Joined / Created Room: {_room.RoomId}"); + _lastRoomId = _room.RoomId; RegisterRoomHandlers(); } @@ -396,14 +402,12 @@ public virtual void RegisterRoomHandlers() //_room.OnMessage("messageNameInCustomLogic", objectOfTypeYOUR_CUSTOM_MESSAGE => { }); //======================== - _room.State.networkedEntities.OnAdd += OnEntityAdd; - _room.State.networkedEntities.OnRemove += OnEntityRemoved; - - _room.State.networkedUsers.OnAdd += OnUserAdd; - _room.State.networkedUsers.OnRemove += OnUserRemove; + this.DisposeNetworkEntitiesOnAdd = _room.State.networkedEntities.OnAdd(OnEntityAdd); + this.DisposeNetworkEntitiesOnRemove = _room.State.networkedEntities.OnRemove(OnEntityRemoved); - _room.State.TriggerAll(); - //======================== + this.DisposeNetworkedUsersOnAdd = _room.State.networkedUsers.OnAdd(OnUserAdd); + this.DisposeNetworkedUsersOnRemove = _room.State.networkedUsers.OnRemove(OnUserRemove); + _room.colyseusConnection.OnError += Room_OnError; _room.colyseusConnection.OnClose += Room_OnClose; @@ -439,10 +443,10 @@ private void ClearRoomHandlers() return; } - _room.State.networkedEntities.OnAdd -= OnEntityAdd; - _room.State.networkedEntities.OnRemove -= OnEntityRemoved; - _room.State.networkedUsers.OnAdd -= OnUserAdd; - _room.State.networkedUsers.OnRemove -= OnUserRemove; + this.DisposeNetworkEntitiesOnAdd(); + this.DisposeNetworkEntitiesOnRemove(); + this.DisposeNetworkedUsersOnAdd(); + this.DisposeNetworkedUsersOnRemove(); _room.colyseusConnection.OnError -= Room_OnError; _room.colyseusConnection.OnClose -= Room_OnClose; @@ -564,7 +568,7 @@ private void OnUserAdd(string key, ExampleNetworkedUser user) _users.Add(key, user); // On entity update... - user.OnChange += changes => + user.OnChange(() => { user.updateHash = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); @@ -574,7 +578,7 @@ private void OnUserAdd(string key, ExampleNetworkedUser user) { OnCurrentUserStateChanged?.Invoke(user.attributes); } - }; + }); } /// diff --git a/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/CreateUserMenu.cs b/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/CreateUserMenu.cs index 5af1d12c..7fc8f129 100644 --- a/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/CreateUserMenu.cs +++ b/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/CreateUserMenu.cs @@ -29,7 +29,7 @@ public string ServerURL { return serverURLInput.text; } - + return ExampleManager.Instance.ColyseusServerAddress; } } diff --git a/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs b/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs index c43c183d..33ce97df 100644 --- a/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs +++ b/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs @@ -2,6 +2,8 @@ using System.Collections; using System.Collections.Generic; using Colyseus; +using LucidSightTools; +using Settings; using UnityEngine; using UnityEngine.SceneManagement; @@ -61,6 +63,7 @@ public void CreateUser() ColyseusSettings clonedSettings = ExampleManager.Instance.CloneSettings(); clonedSettings.colyseusServerAddress = createUserMenu.ServerURL; + LSLog.Log(clonedSettings.colyseusServerAddress); clonedSettings.colyseusServerPort = createUserMenu.ServerPort; clonedSettings.useSecureProtocol= createUserMenu.UseSecure; diff --git a/Assets/Colyseus/Runtime/Example~/Scripts/Views/ExampleNetworkedEntityView.cs b/Assets/Colyseus/Runtime/Example~/Scripts/Views/ExampleNetworkedEntityView.cs index 5e3dbce2..384cbacc 100644 --- a/Assets/Colyseus/Runtime/Example~/Scripts/Views/ExampleNetworkedEntityView.cs +++ b/Assets/Colyseus/Runtime/Example~/Scripts/Views/ExampleNetworkedEntityView.cs @@ -132,8 +132,8 @@ public void InitiView(ExampleNetworkedEntity entity) { state = entity; IsMine = ExampleManager.Instance.CurrentUser != null && string.Equals(ExampleManager.Instance.CurrentUser.sessionId, state.ownerId); - state.attributes.OnChange += Attributes_OnChange; - state.OnChange += Entity_State_OnChange; + state.attributes.OnChange(Attributes_OnChange); + state.OnChange(Entity_State_OnChange); OwnerId = state.ownerId; Id = state.id; @@ -168,7 +168,7 @@ public virtual void OnEntityRemoved() // Entity removed from room state; } - virtual protected void Entity_State_OnChange(List changes) + virtual protected void Entity_State_OnChange() { // Only record state change has been updated locally lastStateTimestamp = state.timestamp; diff --git a/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset b/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset index ffb9e825..9706b7f7 100644 --- a/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset +++ b/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset @@ -9,7 +9,7 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: abda5a440b0b5634b8654ff3a0129b80, type: 3} + m_Script: {fileID: 11500000, guid: 6ed729989615d4b4db072e1e8c41076c, type: 3} m_Name: ColyseusSettings m_EditorClassIdentifier: colyseusServerAddress: localhost @@ -19,4 +19,4 @@ MonoBehaviour: - name: Content-Type value: application/json - name: Accept - value: application/json + value: application/json \ No newline at end of file diff --git a/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset.meta b/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset.meta index 855dae91..cd596a0f 100644 --- a/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset.meta +++ b/Assets/Colyseus/Runtime/Example~/Settings/ColyseusSettings.asset.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: 5fbf227f540d0384993aafa75df60613 +guid: 988e7a981629a46488c4facbf7657d29 NativeFormatImporter: externalObjects: {} - mainObjectFileID: 0 + mainObjectFileID: 11400000 userData: assetBundleName: assetBundleVariant: diff --git a/Assets/Colyseus/Runtime/Scripts/Managers/ColyseusManager.cs b/Assets/Colyseus/Runtime/Scripts/Managers/ColyseusManager.cs index bfac4205..6f59fe7f 100644 --- a/Assets/Colyseus/Runtime/Scripts/Managers/ColyseusManager.cs +++ b/Assets/Colyseus/Runtime/Scripts/Managers/ColyseusManager.cs @@ -1,12 +1,11 @@ -using System.Collections.Generic; -using LucidSightTools; +using Settings; using UnityEngine; // ReSharper disable InconsistentNaming namespace Colyseus { /// - /// Base manager class + /// Base manager class /// /// public class ColyseusManager : MonoBehaviour @@ -15,7 +14,7 @@ public class ColyseusManager : MonoBehaviour /// Reference to the Colyseus settings object. /// [SerializeField] - protected ColyseusSettings _colyseusSettings; + protected static ColyseusSettings _colyseusSettings; // Getters //========================== @@ -30,7 +29,7 @@ public class ColyseusManager : MonoBehaviour /// public string ColyseusServerAddress { - get { return _colyseusSettings.colyseusServerAddress; } + get { return _colyseusSettings.colyseusServerAddress; } } /// @@ -84,6 +83,7 @@ private void InitializeInstance() } Instance = GetComponent(); + _colyseusSettings = ScriptableObject.CreateInstance(); } /// diff --git a/Assets/Colyseus/Runtime/Scripts/Models/ColyseusClient.cs b/Assets/Colyseus/Runtime/Scripts/Models/ColyseusClient.cs index 5a6f3d78..0eb75112 100644 --- a/Assets/Colyseus/Runtime/Scripts/Models/ColyseusClient.cs +++ b/Assets/Colyseus/Runtime/Scripts/Models/ColyseusClient.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using LucidSightTools; +using Settings; using UnityEngine; // ReSharper disable InconsistentNaming diff --git a/Assets/Colyseus/Runtime/Scripts/Request.cs b/Assets/Colyseus/Runtime/Scripts/Request.cs index ffc2ec5b..ec35b080 100644 --- a/Assets/Colyseus/Runtime/Scripts/Request.cs +++ b/Assets/Colyseus/Runtime/Scripts/Request.cs @@ -8,6 +8,7 @@ using System.IO; using GameDevWare.Serialization; using LucidSightTools; +using Settings; namespace Colyseus { @@ -32,24 +33,24 @@ public async Task Request(string uriMethod, string uriPath, string uriQu using (UnityWebRequest req = new UnityWebRequest()) { req.method = uriMethod; - + req.url = uriBuilder.Uri.ToString(); // Send JSON on request body if (data != null) { req.uploadHandler = data; } - + foreach (KeyValuePair pair in _serverSettings.HeadersDictionary) { req.SetRequestHeader(pair.Key, pair.Value); } - + if (!string.IsNullOrEmpty(Token)) { req.SetRequestHeader("Authorization", "Bearer " + Token); } - + // req.uploadHandler = new UploadHandlerRaw(bytes); req.downloadHandler = new DownloadHandlerBuffer(); await req.SendWebRequest(); @@ -72,9 +73,9 @@ public async Task Request(string uriMethod, string uriPath, string uriQu throw new Exception(req.error); } } - + string json = req.downloadHandler.text; - + return json; } ; } @@ -94,18 +95,18 @@ public async Task Request(string uriMethod, string uriPath, Dictionary pair in _serverSettings.HeadersDictionary) { req.SetRequestHeader(pair.Key, pair.Value); } - + if (headers != null) { foreach (KeyValuePair header in headers) @@ -113,7 +114,7 @@ public async Task Request(string uriMethod, string uriPath, Dictionary Request(string uriMethod, string uriPath, Dictionary __callbacks.OnChange -= handler; } + public void AddToOnChange(OnChangeEventHandler handler) + { + __callbacks.OnChange += handler; + } + /// /// Attaches a callback that is triggered whenever this Schema instance has been removed from the server. /// diff --git a/Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs b/Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs new file mode 100644 index 00000000..c7c26be6 --- /dev/null +++ b/Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace Settings +{ + /// + /// containing relevant Colyseus settings + /// + [CreateAssetMenu(fileName = "MyServerSettings", menuName = "Colyseus/Generate ColyseusSettings Scriptable Object", order = 1)] + [Serializable] + public class ColyseusSettings : ScriptableObject + { + /// + /// The server address + /// + public string colyseusServerAddress = "localhost"; + + /// + /// The port to connect to + /// + public string colyseusServerPort = "2567"; + + /// + /// If true, we use secure protocols (wss, https) otherwise we use ws, http (based on ) + /// + public bool useSecureProtocol = false; + + /// + /// Internal wrapper class for a Request header since Unity cant serialize arrays + /// + [Serializable] + public class RequestHeader + { + public string name; + public string value; + } + + [SerializeField] + private RequestHeader[] _requestHeaders; + + private Dictionary _headersDictionary; + + public void SetRequestHeaders(RequestHeader[] headers) + { + if (headers == null) return; + _requestHeaders = new RequestHeader[headers.Length]; + for (int i = 0; i < headers.Length; i++) + { + _requestHeaders[i] = headers[i]; + } + } + + public RequestHeader[] GetRequestHeaders() + { + return _requestHeaders; + } + + /// + /// Convert the user-defined into a dictionary to be used in a + /// + public Dictionary HeadersDictionary + { + get + { + if (_headersDictionary == null) + { + _headersDictionary = new Dictionary(); + + for (int i = 0; _requestHeaders != null && i < _requestHeaders.Length; ++i) + { + _headersDictionary.Add(_requestHeaders[i].name, _requestHeaders[i].value); + } + } + + return _headersDictionary; + } + } + + /// + /// Centralized location to build and return the WebSocketEndpoint + /// + public string WebSocketEndpoint + { + get + { + if (string.IsNullOrEmpty(colyseusServerPort) || colyseusServerPort.Equals(("80"))) + { + return (useSecureProtocol ? "wss" : "ws") + "://" + colyseusServerAddress; + } + + return (useSecureProtocol ? "wss" : "ws") + "://" + colyseusServerAddress + ":" + colyseusServerPort; + } + } + + /// + /// Centralized location to build and return an WebSocketEndpoint ignoring WS/WSS protocols for Unity Web Requests + /// + public string WebRequestEndpoint + { + get + { + if (string.IsNullOrEmpty(colyseusServerPort) || colyseusServerPort.Equals(("80"))) + { + return (useSecureProtocol ? "https" : "http") + "://" + colyseusServerAddress; + } + + return (useSecureProtocol ? "https" : "http") + "://" + colyseusServerAddress + ":" + colyseusServerPort; + } + } + + /// + /// Create a copy of the provided object + /// + /// The settings to copy + /// A new instance of with values copied from the provided object + public static ColyseusSettings Clone(ColyseusSettings orig) + { + ColyseusSettings clone = CreateInstance(); + clone.colyseusServerAddress = orig.colyseusServerAddress; + clone.colyseusServerPort = orig.colyseusServerPort; + clone.useSecureProtocol = orig.useSecureProtocol; + clone.SetRequestHeaders(orig.GetRequestHeaders()); + + return clone; + } + } +} \ No newline at end of file diff --git a/Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs.meta b/Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs.meta new file mode 100644 index 00000000..817b1186 --- /dev/null +++ b/Assets/Colyseus/Runtime/Scripts/Settings/ColyseusSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ed729989615d4b4db072e1e8c41076c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Server/package.json b/Server/package.json index 22cc3274..18a385e0 100644 --- a/Server/package.json +++ b/Server/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "my-app", - "version": "1.0.0", + "version": "1.1.0", "description": "npm init template for bootstrapping an empty Colyseus project", "main": "lib/index.js", "scripts": { @@ -19,21 +19,21 @@ }, "homepage": "https://github.com/colyseus/create-colyseus#readme", "devDependencies": { - "@colyseus/loadtest": "^0.14.7", - "@colyseus/redis-driver": "^0.14.22", + "@colyseus/loadtest": "^0.15.0-preview.0", + "@colyseus/redis-driver": "^0.15.0-preview.0", "@types/cors": "^2.8.6", "@types/express": "^4.17.1", "rimraf": "^2.7.1", - "ts-node": "^8.1.0", - "ts-node-dev": "^1.0.0-pre.63", - "typescript": "^3.4.5" + "ts-node": "^10.9.1", + "ts-node-dev": "^2.0.0", + "typescript": "^4.7.4" }, "dependencies": { - "@colyseus/arena": "^0.14.24", - "@colyseus/monitor": "^0.14.22", - "colyseus": "^0.14.23", + "@colyseus/arena": "^0.15.0-preview.1", + "@colyseus/monitor": "^0.15.0-preview.1", + "colyseus": "^0.15.0-preview.4", "cors": "^2.8.5", - "express": "^4.16.4", - "winston": "^3.3.3" + "express": "^4.18.1", + "winston": "^3.8.1" } } From 78cdced90e3ae737be1df5cc40966724f37015c5 Mon Sep 17 00:00:00 2001 From: lpsandaruwan Date: Wed, 27 Jul 2022 18:06:46 +0530 Subject: [PATCH 2/2] CLYS-116 - remove debug logs --- .../Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs b/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs index 33ce97df..4d3067ca 100644 --- a/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs +++ b/Assets/Colyseus/Runtime/Example~/Scripts/Lobby/UI/LobbyController.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using Colyseus; @@ -63,7 +63,6 @@ public void CreateUser() ColyseusSettings clonedSettings = ExampleManager.Instance.CloneSettings(); clonedSettings.colyseusServerAddress = createUserMenu.ServerURL; - LSLog.Log(clonedSettings.colyseusServerAddress); clonedSettings.colyseusServerPort = createUserMenu.ServerPort; clonedSettings.useSecureProtocol= createUserMenu.UseSecure;