From fab51d6139cc85fca16905485dd7bff593283f60 Mon Sep 17 00:00:00 2001 From: momintlh <77355191+momintlh@users.noreply.github.com> Date: Mon, 30 Dec 2024 16:45:45 +0500 Subject: [PATCH 1/5] chore: init commit --- .../2d-platformer/scripts/GameManager2d.cs | 1 + .../discord-activity/discord-activity.unity | 4 +- .../scripts/GameManagerIsometric.cs | 22 +++++++- .../scripts/GameManagerDemo.cs | 53 ++++++++++++++++--- .../Examples/package-showcase/showcase.unity | 6 ++- .../modules/Helpers/CallbackManager.cs | 2 +- .../BrowserMode/BrowserMockService.cs | 2 +- .../BrowserMode/MockModeBrowser_old.cs | 3 -- Assets/Scenes/topdown.unity | 12 +++++ Assets/Scripts/GameManager.cs | 38 +------------ ProjectSettings/EditorBuildSettings.asset | 4 +- 11 files changed, 92 insertions(+), 55 deletions(-) diff --git a/Assets/PlayroomKit/Examples/2d-platformer/scripts/GameManager2d.cs b/Assets/PlayroomKit/Examples/2d-platformer/scripts/GameManager2d.cs index b72a75b..6c9d90b 100644 --- a/Assets/PlayroomKit/Examples/2d-platformer/scripts/GameManager2d.cs +++ b/Assets/PlayroomKit/Examples/2d-platformer/scripts/GameManager2d.cs @@ -194,6 +194,7 @@ private static void RemovePlayer(string playerID) if (PlayerDict.TryGetValue(playerID, out GameObject player)) { PlayerDict.Remove(playerID); + players.Remove(players.Find(p => p.id == playerID)); playerGameObjects.Remove(player); Destroy(player); } diff --git a/Assets/PlayroomKit/Examples/discord-activity/discord-activity.unity b/Assets/PlayroomKit/Examples/discord-activity/discord-activity.unity index 31f37cf..40eb148 100644 --- a/Assets/PlayroomKit/Examples/discord-activity/discord-activity.unity +++ b/Assets/PlayroomKit/Examples/discord-activity/discord-activity.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 1429187865} - m_IndirectSpecularColor: {r: 0.44657815, g: 0.49641192, b: 0.5748165, a: 1} + m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -224,7 +224,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8987662522597341863, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} propertyPath: mockMode - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8987662522597341863, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} propertyPath: enableLogs diff --git a/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs b/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs index 5837975..829a235 100644 --- a/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs +++ b/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using AOT; +using ParrelSync; using Playroom; using UnityEngine; using Random = UnityEngine.Random; @@ -22,7 +23,24 @@ public class GameManagerIsometric : MonoBehaviour [SerializeField] private GameObject playerPrefab; - private readonly PlayroomKit _playroomKit = new(); + private PlayroomKit _playroomKit; + + private void Awake() + { + _playroomKit = new PlayroomKit(); + +#if UNITY_EDITOR + if (ClonesManager.IsClone()) + { + string hi = ClonesManager.GetArgument(); + Debug.LogWarning($"{hi} from clone"); + } + else + { + Debug.LogWarning("OG Project"); + } +#endif + } private void Start() { @@ -111,7 +129,7 @@ private static void RemovePlayer(string playerID) Destroy(player); foreach (var (key, value) in PlayerDict) Debug.Log($"player {key} is still in the room"); - + Debug.Log(playerID + " has left the room!"); } else diff --git a/Assets/PlayroomKit/Examples/package-showcase/scripts/GameManagerDemo.cs b/Assets/PlayroomKit/Examples/package-showcase/scripts/GameManagerDemo.cs index e45d7cc..cc96880 100644 --- a/Assets/PlayroomKit/Examples/package-showcase/scripts/GameManagerDemo.cs +++ b/Assets/PlayroomKit/Examples/package-showcase/scripts/GameManagerDemo.cs @@ -31,6 +31,14 @@ public class GameManagerDemo : MonoBehaviour private PlayroomKit _playroomKit = new(); + + [Serializable] + private class TempData + { + public Vector3 pos; + public string message; + } + // Update is called once per frame private void Update() { @@ -149,6 +157,18 @@ private void SetStateColor(Color color) if (playerJoined) { var myPlayer = _playroomKit.MyPlayer(); + + var data = new TempData() + { + message = "Sending Pos", + pos = new Vector3(6f, 1f, 4f) + }; + + Debug.LogWarning($"Setting data : {data}"); + + string d = JsonUtility.ToJson(data); + myPlayer.SetState("data", d); + myPlayer.SetState("color", color); logsText.text = $"setting color to {color}"; } @@ -170,6 +190,8 @@ private void GetStateColor() for (var i = 0; i < players.Count; i++) if (players[i] != null) { + Debug.LogWarning($"Getting data ${players[i].GetState("data")}"); + var color = players[i].GetState("color"); if (playerGameObjects[i] != null) @@ -238,7 +260,8 @@ public void HandleValueChange(int index) public void RegisterRpcShoot() { - _playroomKit.RpcRegister("ShootLaser", HandleScoreUpdate); + _playroomKit.RpcRegister("hostCall", hostCall); + _playroomKit.RpcRegister("clientCall", clientCall); Debug.Log("Shoot function registered"); logsText.text = "ShootLaser RPC registered"; @@ -265,6 +288,19 @@ private void HandleScoreUpdate(string data, string caller) { Debug.LogError($"No GameObject found for caller: {caller}"); } + + _playroomKit.RpcCall("ChainCall", "", PlayroomKit.RpcMode.ALL); + } + + private void hostCall(string data, string senderID) + { + Debug.LogWarning("HOST CALL"); + _playroomKit.RpcCall("clientCall", "", PlayroomKit.RpcMode.ALL); + } + + private void clientCall(string data, string senderID) + { + Debug.LogWarning("CLIENT CALL"); } @@ -273,12 +309,15 @@ public void ShootLaser() var myPlayer = _playroomKit.MyPlayer(); var index = players.IndexOf(myPlayer); score = playerGameObjects[index].GetComponent().ShootLaser(score); - - _playroomKit.RpcCall("ShootLaser", score, PlayroomKit.RpcMode.ALL, - () => - { - Debug.Log("ShootLaser RPC Called"); - logsText.text = "ShootLaser RPC Called"; }); + + // _playroomKit.RpcCall("ShootLaser", score, PlayroomKit.RpcMode.ALL, + // () => + // { + // Debug.Log("ShootLaser RPC Called"); + // logsText.text = "ShootLaser RPC Called"; + // }); + + _playroomKit.RpcCall("hostCall", "", PlayroomKit.RpcMode.HOST); } public void GetRoomCode() diff --git a/Assets/PlayroomKit/Examples/package-showcase/showcase.unity b/Assets/PlayroomKit/Examples/package-showcase/showcase.unity index bf989b0..8165cc4 100644 --- a/Assets/PlayroomKit/Examples/package-showcase/showcase.unity +++ b/Assets/PlayroomKit/Examples/package-showcase/showcase.unity @@ -6823,6 +6823,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 8899696337967424923, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} + propertyPath: browser + value: 1 + objectReference: {fileID: 0} - target: {fileID: 8899696337967424923, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} propertyPath: webDriverDirectory value: Assets\ @@ -6833,7 +6837,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8987662522597341863, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} propertyPath: enableLogs - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8987662522597341863, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} propertyPath: insertCoinCaller diff --git a/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs b/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs index 041fd1d..95cb985 100644 --- a/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs +++ b/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs @@ -77,7 +77,7 @@ public static void InvokeCallback(string key, params string[] args) } else { - Debug.LogWarning( + DebugLogger.Log( $"Callback with key {key} not found!, maybe register the callback or call the correct playroom function?"); } } diff --git a/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs b/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs index 42c94ee..2e5746d 100644 --- a/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs +++ b/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs @@ -33,7 +33,7 @@ public void InsertCoin(InitOptions options = null, Action onLaunchCallBack = nul { options.roomCode = "TEST_ROOM"; optionsJson = Helpers.SerializeInitOptions(options); - } + } var gameObjectName = _ubb.GetGameObject("InsertCoin").name; var devManagerName = _ubb.GetGameObject("devManager").name; diff --git a/Assets/PlayroomKit/modules/MockMode/BrowserMode/MockModeBrowser_old.cs b/Assets/PlayroomKit/modules/MockMode/BrowserMode/MockModeBrowser_old.cs index 67fc023..54009da 100644 --- a/Assets/PlayroomKit/modules/MockMode/BrowserMode/MockModeBrowser_old.cs +++ b/Assets/PlayroomKit/modules/MockMode/BrowserMode/MockModeBrowser_old.cs @@ -2,10 +2,7 @@ using System.Collections.Generic; using System.Reflection; using UBB; -using Unity.VisualScripting; using UnityEngine; -using UnityEngine.Networking; -using Random = System.Random; namespace Playroom diff --git a/Assets/Scenes/topdown.unity b/Assets/Scenes/topdown.unity index 3988ca8..4d0df78 100644 --- a/Assets/Scenes/topdown.unity +++ b/Assets/Scenes/topdown.unity @@ -279,6 +279,18 @@ PrefabInstance: propertyPath: additionalGameObjects.Array.data[2].targetObject value: objectReference: {fileID: 0} + - target: {fileID: 8899696337967424923, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} + propertyPath: httpServerPort + value: 6700 + objectReference: {fileID: 0} + - target: {fileID: 8899696337967424923, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} + propertyPath: webDriverDirectory + value: Assets\ + objectReference: {fileID: 0} + - target: {fileID: 8987662522597341863, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} + propertyPath: insertCoinCaller + value: + objectReference: {fileID: 1054460205} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index 57c333e..1d889d8 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -41,6 +41,7 @@ void Start() maxPlayersPerRoom = 15, }, () => { + _playroomKit.SetState("hi", "Test"); _playroomKit.OnPlayerJoin(AddPlayer); _playroomKit.RpcRegister("score", (data, caller) => print($"{data} by {_playroomKit.GetPlayer(caller).GetProfile().name}")); @@ -53,23 +54,7 @@ void Start() /// private void Update() { - if (Input.GetKey(KeyCode.K)) - { - // PlayroomKit.SetState("score", 500); - _playroomKit.RpcCall("score", 500); - Debug.Log(_playroomKit.GetRoomCode()); - } - - if (Input.GetKey(KeyCode.L)) - { - var s = _playroomKit.GetState("score"); - _playroomKit.RpcCall("score", "lol"); - score.text = $"Score: {s}"; - } - - - Reset(); /* if (!playerJoined) return; @@ -102,21 +87,6 @@ private void Update() } - private void Reset() - { - if (Input.GetKeyDown(KeyCode.R) && _playroomKit.IsHost()) - { - _playroomKit.ResetStates(new[] { "pos" }, () => - { - var defscore = _playroomKit.GetState("score"); - score.text = defscore.ToString(); - - Debug.Log("Resetting Player states from Unity, Invoking from JS!"); - }); - } - } - - /// /// Adds the "player" to the game scene. /// @@ -129,11 +99,7 @@ public void AddPlayer(PlayroomKit.Player player) var spawnPos = new Vector3(Random.Range(-4, 4), Random.Range(1, 5), 0); var playerObj = Instantiate(playerPrefab, spawnPos, Quaternion.identity); - // Debug.Log($"Player ID: {player.id}"); - // - // Debug.Log($"Player Name: {player.GetProfile().color}"); - // Debug.Log( - // $"Player ID: {player.GetProfile().name}"); + Debug.LogWarning("Getting a state: " + _playroomKit.GetState("hi")); PlayerDict.Add(player.id, playerObj); players.Add(player); diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 8fde211..0273124 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,13 +5,13 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 + - enabled: 0 path: Assets/PlayroomKit/Examples/2d-platformer/2d-platformer.unity guid: cf82eec4c654cf44b89cec2a91afebd5 - enabled: 0 path: Assets/PlayroomKit/Examples/discord-activity/discord-activity.unity guid: bb7ef8e4a67f3fb46b78e5d95a6858a7 - - enabled: 0 + - enabled: 1 path: Assets/PlayroomKit/Examples/package-showcase/showcase.unity guid: 85c9af77ae006408ab24500b953a9035 m_configObjects: {} From 2f3c477823b99ad0c5b4865447cb7fb30403bf95 Mon Sep 17 00:00:00 2001 From: momintlh <77355191+momintlh@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:04:38 +0500 Subject: [PATCH 2/5] chore: removed code from example --- .../scripts/GameManagerIsometric.cs | 13 +- .../Scenes/{topdown.unity => TestScene.unity} | 0 ...opdown.unity.meta => TestScene.unity.meta} | 0 Assets/Scripts/GameManager.cs | 118 +++--------------- ProjectSettings/EditorBuildSettings.asset | 5 +- ProjectSettings/ProjectSettings.asset | 2 +- 6 files changed, 23 insertions(+), 115 deletions(-) rename Assets/Scenes/{topdown.unity => TestScene.unity} (100%) rename Assets/Scenes/{topdown.unity.meta => TestScene.unity.meta} (100%) diff --git a/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs b/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs index 829a235..ab3253e 100644 --- a/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs +++ b/Assets/PlayroomKit/Examples/discord-activity/scripts/GameManagerIsometric.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using AOT; -using ParrelSync; using Playroom; using UnityEngine; using Random = UnityEngine.Random; @@ -29,21 +28,11 @@ private void Awake() { _playroomKit = new PlayroomKit(); -#if UNITY_EDITOR - if (ClonesManager.IsClone()) - { - string hi = ClonesManager.GetArgument(); - Debug.LogWarning($"{hi} from clone"); - } - else - { - Debug.LogWarning("OG Project"); - } -#endif } private void Start() { + _playroomKit.InsertCoin(new InitOptions { maxPlayersPerRoom = 3, diff --git a/Assets/Scenes/topdown.unity b/Assets/Scenes/TestScene.unity similarity index 100% rename from Assets/Scenes/topdown.unity rename to Assets/Scenes/TestScene.unity diff --git a/Assets/Scenes/topdown.unity.meta b/Assets/Scenes/TestScene.unity.meta similarity index 100% rename from Assets/Scenes/topdown.unity.meta rename to Assets/Scenes/TestScene.unity.meta diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index 1d889d8..f1ac85b 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -8,122 +8,38 @@ public class GameManager : MonoBehaviour { - private static bool playerJoined; - - /// - /// List of players and their gameObjects. - /// - [SerializeField] - private List players = new(); - - private static readonly List playerGameObjects = new(); - private static readonly Dictionary PlayerDict = new(); - - [SerializeField] - private GameObject playerPrefab; - - [SerializeField] - private TextMeshProUGUI playerIDText; - [SerializeField] - private TextMeshProUGUI score; - - - [SerializeField] - private string playerID; - - private PlayroomKit _playroomKit = new PlayroomKit(); + private PlayroomKit kit; void Start() { - // countdownText.gameObject.SetActive(false); - _playroomKit.InsertCoin(new InitOptions + kit = new(); + kit.InsertCoin(new InitOptions() { - maxPlayersPerRoom = 15, + gameId = "[my game id]", + maxPlayersPerRoom = 8, + discord = true }, () => { - _playroomKit.SetState("hi", "Test"); - _playroomKit.OnPlayerJoin(AddPlayer); - _playroomKit.RpcRegister("score", - (data, caller) => print($"{data} by {_playroomKit.GetPlayer(caller).GetProfile().name}")); - }, () => { Debug.Log("OnDisconnect callback"); }); + kit.RpcRegister("A", A); + kit.RpcRegister("B", B); + }); } - - /// - /// Update the player position and sync. - /// private void Update() { - -/* - if (!playerJoined) return; - - var player = PlayroomKit.Me(); - var index = players.IndexOf(player); - - // Move and sync the local player's position - playerGameObjects[index].GetComponent().Move(); - player.SetState("pos", playerGameObjects[index].transform.position); - - - // Update other players' positions - for (var i = 0; i < players.Count; i++) - { - // if (players[i] == myPlayer) continue; - - if (players[i] != null) - { - var posX = PlayroomKit.MyPlayer().GetState("pos"); - // var posY = PlayroomKit.GetPlayer(players[i]).GetState("posY"); - - if (playerGameObjects != null) - { - // Vector3 pos = new(posX, posY, 0); - playerGameObjects[i].GetComponent().position = posX; - } - } - } - */ + if (Input.GetMouseButtonDown(0)) + kit.RpcCall("A", "", PlayroomKit.RpcMode.ALL); + else if (Input.GetMouseButtonDown(1)) + kit.RpcCall("B", "", PlayroomKit.RpcMode.ALL); } - - /// - /// Adds the "player" to the game scene. - /// - public void AddPlayer(PlayroomKit.Player player) + private void A(string data, string senderID) { - playerIDText.text += $"{player.id} joined the game!"; - - playerID = player.id; - - var spawnPos = new Vector3(Random.Range(-4, 4), Random.Range(1, 5), 0); - var playerObj = Instantiate(playerPrefab, spawnPos, Quaternion.identity); - - Debug.LogWarning("Getting a state: " + _playroomKit.GetState("hi")); - - PlayerDict.Add(player.id, playerObj); - players.Add(player); - playerGameObjects.Add(playerObj); - - playerJoined = true; - player.OnQuit(RemovePlayer); + Debug.Log("A"); } - /// - /// Remove player from the game, called when the player leaves / closes the game. - /// - [MonoPInvokeCallback(typeof(Action))] - private static void RemovePlayer(string playerID) + private void B(string data, string senderID) { - if (PlayerDict.TryGetValue(playerID, out var player)) - { - PlayerDict.Remove(playerID); - playerGameObjects.Remove(player); - Destroy(player); - } - else - { - Debug.LogWarning("Player is not in dictionary"); - } + Debug.Log("B"); } } \ No newline at end of file diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 0273124..323419e 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -11,7 +11,10 @@ EditorBuildSettings: - enabled: 0 path: Assets/PlayroomKit/Examples/discord-activity/discord-activity.unity guid: bb7ef8e4a67f3fb46b78e5d95a6858a7 - - enabled: 1 + - enabled: 0 path: Assets/PlayroomKit/Examples/package-showcase/showcase.unity guid: 85c9af77ae006408ab24500b953a9035 + - enabled: 1 + path: Assets/Scenes/TestScene.unity + guid: 490247da3cf48784ab657a183ba059d1 m_configObjects: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 2f81a5e..15a2960 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -668,7 +668,7 @@ PlayerSettings: blurSplashScreenBackground: 1 spritePackerPolicy: webGLMemorySize: 32 - webGLExceptionSupport: 1 + webGLExceptionSupport: 2 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 From 01a02d06f4d4568e1fec3c9e63712a7880b22c6e Mon Sep 17 00:00:00 2001 From: momintlh <77355191+momintlh@users.noreply.github.com> Date: Fri, 3 Jan 2025 10:44:12 +0500 Subject: [PATCH 3/5] fix: RPC fix --- .../InternalFunctions/InterlopWrapper.cs | 46 ++++++++++++------- Assets/PlayroomKit/modules/RPC/RPC.cs | 43 +++++++++++++++-- Assets/PlayroomKit/src/index.js | 20 +++++--- Assets/Scripts/GameManager.cs | 21 +++++---- 4 files changed, 93 insertions(+), 37 deletions(-) diff --git a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs index de8764f..120bf6c 100644 --- a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs +++ b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs @@ -137,7 +137,8 @@ public void StartMatchmakingWrapper(Action callback) StartMatchmakingInternal(callback); } - public void RpcRegisterWrapper(string name, Action rpcRegisterCallback, string onResponseReturn = null) + public void RpcRegisterWrapper(string name, Action rpcRegisterCallback, + string onResponseReturn = null) { RpcRegisterInternal(name, rpcRegisterCallback, onResponseReturn); } @@ -146,20 +147,24 @@ public void RpcCallWrapper(string name, string data, RpcMode mode, Action callba { RpcCallInternal(name, data, mode, callbackOnResponse); } - - + + //Internal Functions [DllImport("__Internal")] private static extern void RpcRegisterInternal(string name, Action rpcRegisterCallback, string onResponseReturn = null); - + + [DllImport("__Internal")] + public static extern void RpcRegisterInternal(string name, Action rpcRegisterCallback, + string onResponseReturn = null); + [DllImport("__Internal")] private extern static void RpcCallInternal(string name, string data, RpcMode mode, Action callbackOnResponse); - + // - - + + //Player // Wrapper for KickInternal public void KickPlayerWrapper(string playerID, Action onKickCallback = null) @@ -168,7 +173,8 @@ public void KickPlayerWrapper(string playerID, Action onKickCallback = null) } // Wrapper for WaitForPlayerStateInternal - public void WaitForPlayerStateWrapper(string playerID, string stateKey, Action onStateSetCallback = null) + public void WaitForPlayerStateWrapper(string playerID, string stateKey, + Action onStateSetCallback = null) { WaitForPlayerStateInternal(playerID, stateKey, onStateSetCallback); } @@ -192,7 +198,8 @@ public void SetPlayerStateBoolWrapper(string playerID, string key, bool value, b } // Wrapper for SetPlayerStateDictionary - public void SetPlayerStateDictionaryWrapper(string playerID, string key, string jsonValues, bool reliable = false) + public void SetPlayerStateDictionaryWrapper(string playerID, string key, string jsonValues, + bool reliable = false) { SetPlayerStateDictionary(playerID, key, jsonValues, reliable); } @@ -238,22 +245,28 @@ public string GetProfileWrapper(string playerID) private static extern void KickInternal(string playerID, Action onKickCallback = null); [DllImport("__Internal")] - private static extern void WaitForPlayerStateInternal(string playerID, string stateKey, Action onStateSetCallback = null); + private static extern void WaitForPlayerStateInternal(string playerID, string stateKey, + Action onStateSetCallback = null); [DllImport("__Internal")] - private static extern void SetPlayerStateByPlayerId(string playerID, string key, int value, bool reliable = false); + private static extern void SetPlayerStateByPlayerId(string playerID, string key, int value, + bool reliable = false); [DllImport("__Internal")] - private static extern void SetPlayerStateFloatByPlayerId(string playerID, string key, string value, bool reliable = false); + private static extern void SetPlayerStateFloatByPlayerId(string playerID, string key, string value, + bool reliable = false); [DllImport("__Internal")] - private static extern void SetPlayerStateByPlayerId(string playerID, string key, bool value, bool reliable = false); + private static extern void SetPlayerStateByPlayerId(string playerID, string key, bool value, + bool reliable = false); [DllImport("__Internal")] - private static extern void SetPlayerStateDictionary(string playerID, string key, string jsonValues, bool reliable = false); + private static extern void SetPlayerStateDictionary(string playerID, string key, string jsonValues, + bool reliable = false); [DllImport("__Internal")] - private static extern void SetPlayerStateStringById(string playerID, string key, string value, bool reliable = false); + private static extern void SetPlayerStateStringById(string playerID, string key, string value, + bool reliable = false); [DllImport("__Internal")] private static extern int GetPlayerStateIntById(string playerID, string key); @@ -269,7 +282,6 @@ public string GetProfileWrapper(string playerID) [DllImport("__Internal")] private static extern string GetProfileByPlayerId(string playerID); - } } -} +} \ No newline at end of file diff --git a/Assets/PlayroomKit/modules/RPC/RPC.cs b/Assets/PlayroomKit/modules/RPC/RPC.cs index 3a9923b..cf7c852 100644 --- a/Assets/PlayroomKit/modules/RPC/RPC.cs +++ b/Assets/PlayroomKit/modules/RPC/RPC.cs @@ -36,10 +36,21 @@ public RPC(PlayroomKit playroomKit, IInterop interop) public void RpcRegister(string name, Action rpcRegisterCallback, string onResponseReturn = null) { - CallbackManager.RegisterRpcCallback(rpcRegisterCallback, name); + CallbackManager.RegisterCallback(rpcRegisterCallback, name); _interop.RpcRegisterWrapper(name, InvokeRpcRegisterCallBack, onResponseReturn); } + public static void RpcRegister2(string name, Action rpcRegisterCallback, + string onResponseReturn = null) + { + // CallbackManager.RegisterRpcCallback(rpcRegisterCallback, name); + + CallbackManager.RegisterCallback(rpcRegisterCallback, name); + PlayroomKitInterop.RpcRegisterInternal(name, RpcRegisterCallBackHandler, onResponseReturn); + + // _interop.RpcRegisterWrapper(name, InvokeRpcRegisterCallBack, onResponseReturn); + } + public void RpcCall(string name, object data, RpcMode mode, Action callbackOnResponse = null) { string jsonData = ConvertToJson(data); @@ -66,9 +77,9 @@ public void RpcCall(string name, object data, RpcMode mode, Action callbackOnRes string jsonString = jsonArray.ToString(); /* - This is required to sync the rpc events between all players, without this players won't know which event has been called. - Update: This fix works fine for now, but there might be a better way. - this is a temporary fix, RPCs need to be handled within JSLIB for better control. + This is required to sync the rpc events between all players, without this players won't know which event has been called. + Update: This fix works fine for now, but there might be a better way. + this is a temporary fix, RPCs need to be handled within JSLIB for better control. */ _playroomKit.SetState("rpcCalledEventName", jsonString, reliable: true); _interop.RpcCallWrapper(name, jsonData, mode, InvokeOnResponseCallback); @@ -113,6 +124,28 @@ protected static void InvokeOnResponseCallback() } } + [MonoPInvokeCallback(typeof(Action))] + protected static void RpcRegisterCallBackHandler(string combinedData) + { + try + { + Debug.Log($"Data: {combinedData}"); + + JSONNode jsonNode = JSON.Parse(combinedData); + + string eventName = jsonNode["eventName"]; + string stringData = jsonNode["data"]; + string senderID = jsonNode["senderId"]; + + Debug.LogWarning($"RPC Register Callback: {eventName} - {stringData} - {senderID}"); + CallbackManager.InvokeCallback(eventName, stringData); + } + catch (Exception ex) + { + Debug.LogError("Error: " + ex.Message); + } + } + [MonoPInvokeCallback(typeof(Action))] protected static void InvokeRpcRegisterCallBack(string dataJson, string senderJson) { @@ -139,7 +172,7 @@ protected static void InvokeRpcRegisterCallBack(string dataJson, string senderJs string item = node.Value; updatedRpcCalledEvents.Add(item); } - + for (var i = 0; i < updatedRpcCalledEvents.Count; i++) { string name = updatedRpcCalledEvents[i]; diff --git a/Assets/PlayroomKit/src/index.js b/Assets/PlayroomKit/src/index.js index 821b592..53bb4db 100644 --- a/Assets/PlayroomKit/src/index.js +++ b/Assets/PlayroomKit/src/index.js @@ -843,17 +843,25 @@ mergeInto(LibraryManager.library, { return; } + + var n = UTF8ToString(name) + console.log(n) + onResponseReturn = UTF8ToString(onResponseReturn); + this.rpcEvents.push(name) function registerCallback(data, sender) { - var dataJson = JSON.stringify(data); + var combinedData = { + data: data, + senderId: sender.id, + // eventName : n + }; - var id = sender.id; - var bufferSize = lengthBytesUTF8(id) + 1; - var buffer = _malloc(bufferSize); - stringToUTF8(id, buffer, bufferSize); + var dataJson = JSON.stringify(combinedData); + + console.log(`[JS] dataJson: ${dataJson}`); - {{{ makeDynCall('vii', 'callback') }}}(stringToNewUTF8(dataJson), buffer) + {{{ makeDynCall('vi', 'callback') }}}(stringToNewUTF8(dataJson)); return onResponseReturn; } diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index f1ac85b..cad5e44 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -20,26 +20,29 @@ void Start() discord = true }, () => { - kit.RpcRegister("A", A); - kit.RpcRegister("B", B); + PlayroomKit.RPC.RpcRegister2("A", A); + PlayroomKit.RPC.RpcRegister2("B", B); }); } private void Update() { if (Input.GetMouseButtonDown(0)) - kit.RpcCall("A", "", PlayroomKit.RpcMode.ALL); - else if (Input.GetMouseButtonDown(1)) - kit.RpcCall("B", "", PlayroomKit.RpcMode.ALL); + kit.RpcCall("A", 1, PlayroomKit.RpcMode.ALL); + + if (Input.GetMouseButtonDown(1)) + kit.RpcCall("B", 2, PlayroomKit.RpcMode.ALL); + + } - private void A(string data, string senderID) + private void A(string data) { - Debug.Log("A"); + Debug.Log($"[Unity] A data: {data}"); } - private void B(string data, string senderID) + private void B(string data) { - Debug.Log("B"); + Debug.Log($"[Unity] B data: {data}"); } } \ No newline at end of file From 088fcf4e5d83a0cfa02c4006539d4b8c3972249f Mon Sep 17 00:00:00 2001 From: momintlh <77355191+momintlh@users.noreply.github.com> Date: Fri, 3 Jan 2025 13:52:26 +0500 Subject: [PATCH 4/5] feat: bindings for transferHost --- Assets/PlayroomKit/PlayroomKit.cs | 10 +++ Assets/PlayroomKit/modules/Headers.cs | 3 + .../InternalFunctions/IInternalFunctions.cs | 3 + .../InternalFunctions/InterlopWrapper.cs | 5 ++ .../modules/Interfaces/IPlayroomBase.cs | 2 + .../BrowserMode/BrowserMockService.cs | 5 ++ .../BrowserMode/PlayroomMockBrowserBridge.js | 8 +++ .../modules/MockMode/LocalPlayroomService.cs | 5 ++ Assets/PlayroomKit/modules/PlayroomService.cs | 5 ++ Assets/PlayroomKit/modules/RPC/RPC.cs | 70 ++----------------- Assets/PlayroomKit/package.json | 2 +- Assets/PlayroomKit/src/index.js | 35 +++++++--- Assets/Scenes/TestScene.unity | 8 +-- Assets/Scripts/GameManager.cs | 40 +++++------ 14 files changed, 101 insertions(+), 100 deletions(-) diff --git a/Assets/PlayroomKit/PlayroomKit.cs b/Assets/PlayroomKit/PlayroomKit.cs index 83324af..93b5045 100644 --- a/Assets/PlayroomKit/PlayroomKit.cs +++ b/Assets/PlayroomKit/PlayroomKit.cs @@ -73,6 +73,16 @@ public bool IsHost() return _playroomService.IsHost(); } + + public void TransferHost(string playerId) + { + if (!IsPlayRoomInitialized) + { + Debug.LogError("[Mock Mode] Playroom not initialized yet! Please call InsertCoin."); + } + + _playroomService.TransferHost(playerId); + } public void OnPlayerJoin(Action onPlayerJoinCallback) { diff --git a/Assets/PlayroomKit/modules/Headers.cs b/Assets/PlayroomKit/modules/Headers.cs index cc6e355..d04df2d 100644 --- a/Assets/PlayroomKit/modules/Headers.cs +++ b/Assets/PlayroomKit/modules/Headers.cs @@ -23,6 +23,9 @@ private static extern void InsertCoinInternal(string options, [DllImport("__Internal")] private static extern bool IsHostInternal(); + + [DllImport("__Internal")] + private static extern bool TransferHostInternal(string playerId); [DllImport("__Internal")] private static extern bool IsStreamScreenInternal(); diff --git a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs index 50fe7dd..9efd8fe 100644 --- a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs +++ b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs @@ -19,6 +19,8 @@ void InsertCoinWrapper(string options, void UnsubscribeOnPlayerJoinWrapper(string id); bool IsHostWrapper(); + + void TransferHostWrapper(string playerId); bool IsStreamScreenWrapper(); @@ -92,6 +94,7 @@ void RpcCallWrapper(string name, string data, RpcMode mode, string GetProfileWrapper(string playerID); // + } } } \ No newline at end of file diff --git a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs index 120bf6c..3725170 100644 --- a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs +++ b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs @@ -37,6 +37,11 @@ public bool IsHostWrapper() return IsHostInternal(); } + public void TransferHostWrapper(string playerId) + { + TransferHostInternal(playerId); + } + public bool IsStreamScreenWrapper() { return IsStreamScreenInternal(); diff --git a/Assets/PlayroomKit/modules/Interfaces/IPlayroomBase.cs b/Assets/PlayroomKit/modules/Interfaces/IPlayroomBase.cs index a3a7dfd..53b623f 100644 --- a/Assets/PlayroomKit/modules/Interfaces/IPlayroomBase.cs +++ b/Assets/PlayroomKit/modules/Interfaces/IPlayroomBase.cs @@ -22,6 +22,8 @@ public void InsertCoin(InitOptions options = null, Action onLaunchCallBack = nul public Player Me(); public bool IsHost(); + + public void TransferHost(string playerId); public string GetRoomCode(); diff --git a/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs b/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs index 2e5746d..2b4d00c 100644 --- a/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs +++ b/Assets/PlayroomKit/modules/MockMode/BrowserMode/BrowserMockService.cs @@ -97,6 +97,11 @@ public bool IsHost() return _ubb.CallJs("IsHost"); } + public void TransferHost(string playerId) + { + _ubb.CallJs("TransferHost", null, null, true, playerId); + } + public string GetRoomCode() { return _ubb.CallJs("GetRoomCode"); diff --git a/Assets/PlayroomKit/modules/MockMode/BrowserMode/PlayroomMockBrowserBridge.js b/Assets/PlayroomKit/modules/MockMode/BrowserMode/PlayroomMockBrowserBridge.js index 928ee45..52dd653 100644 --- a/Assets/PlayroomKit/modules/MockMode/BrowserMode/PlayroomMockBrowserBridge.js +++ b/Assets/PlayroomKit/modules/MockMode/BrowserMode/PlayroomMockBrowserBridge.js @@ -94,6 +94,14 @@ IsHost = function () { return Playroom.isHost(); }; +TransferHost = async function (playerId) { + try { + await transferHost(playerId); + } catch (error) { + console.error("Error transferring host:", error); + } +}; + IsStreamScreen = function () { return Playroom.isStreamScreen(); }; diff --git a/Assets/PlayroomKit/modules/MockMode/LocalPlayroomService.cs b/Assets/PlayroomKit/modules/MockMode/LocalPlayroomService.cs index 1404152..582207f 100644 --- a/Assets/PlayroomKit/modules/MockMode/LocalPlayroomService.cs +++ b/Assets/PlayroomKit/modules/MockMode/LocalPlayroomService.cs @@ -52,6 +52,11 @@ public bool IsHost() return true; } + public void TransferHost(string playerId) + { + Debug.Log("Host transfer doesn't work in local mock mode"); + } + public string GetRoomCode() { return "mock123"; diff --git a/Assets/PlayroomKit/modules/PlayroomService.cs b/Assets/PlayroomKit/modules/PlayroomService.cs index ea4416c..1f5af97 100644 --- a/Assets/PlayroomKit/modules/PlayroomService.cs +++ b/Assets/PlayroomKit/modules/PlayroomService.cs @@ -84,6 +84,11 @@ public bool IsHost() return _interop.IsHostWrapper(); } + public void TransferHost(string playerId) + { + _interop.TransferHostWrapper(playerId); + } + public string GetRoomCode() { diff --git a/Assets/PlayroomKit/modules/RPC/RPC.cs b/Assets/PlayroomKit/modules/RPC/RPC.cs index cf7c852..ff2bde3 100644 --- a/Assets/PlayroomKit/modules/RPC/RPC.cs +++ b/Assets/PlayroomKit/modules/RPC/RPC.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Reflection; using AOT; using SimpleJSON; using UnityEngine; @@ -36,19 +37,9 @@ public RPC(PlayroomKit playroomKit, IInterop interop) public void RpcRegister(string name, Action rpcRegisterCallback, string onResponseReturn = null) { - CallbackManager.RegisterCallback(rpcRegisterCallback, name); - _interop.RpcRegisterWrapper(name, InvokeRpcRegisterCallBack, onResponseReturn); - } - - public static void RpcRegister2(string name, Action rpcRegisterCallback, - string onResponseReturn = null) - { - // CallbackManager.RegisterRpcCallback(rpcRegisterCallback, name); - + Debug.Log(rpcRegisterCallback.GetMethodInfo().Name); CallbackManager.RegisterCallback(rpcRegisterCallback, name); PlayroomKitInterop.RpcRegisterInternal(name, RpcRegisterCallBackHandler, onResponseReturn); - - // _interop.RpcRegisterWrapper(name, InvokeRpcRegisterCallBack, onResponseReturn); } public void RpcCall(string name, object data, RpcMode mode, Action callbackOnResponse = null) @@ -68,20 +59,6 @@ public void RpcCall(string name, object data, RpcMode mode, Action callbackOnRes } } - JSONArray jsonArray = new JSONArray(); - foreach (string item in RpcCalledEvents) - { - jsonArray.Add(item); - } - - string jsonString = jsonArray.ToString(); - -/* - This is required to sync the rpc events between all players, without this players won't know which event has been called. - Update: This fix works fine for now, but there might be a better way. - this is a temporary fix, RPCs need to be handled within JSLIB for better control. -*/ - _playroomKit.SetState("rpcCalledEventName", jsonString, reliable: true); _interop.RpcCallWrapper(name, jsonData, mode, InvokeOnResponseCallback); } @@ -95,7 +72,7 @@ public void RpcCall(string name, object data, Action callbackOnResponse = null) [MonoPInvokeCallback(typeof(Action))] protected static void InvokeOnResponseCallback() { - var namesToRemove = new List(); + List namesToRemove = new List(); foreach (string name in RpcCalledEvents) { @@ -129,54 +106,17 @@ protected static void RpcRegisterCallBackHandler(string combinedData) { try { - Debug.Log($"Data: {combinedData}"); - JSONNode jsonNode = JSON.Parse(combinedData); string eventName = jsonNode["eventName"]; string stringData = jsonNode["data"]; string senderID = jsonNode["senderId"]; - - Debug.LogWarning($"RPC Register Callback: {eventName} - {stringData} - {senderID}"); - CallbackManager.InvokeCallback(eventName, stringData); - } - catch (Exception ex) - { - Debug.LogError("Error: " + ex.Message); - } - } - [MonoPInvokeCallback(typeof(Action))] - protected static void InvokeRpcRegisterCallBack(string dataJson, string senderJson) - { - try - { - if (!Players.ContainsKey(senderJson)) - { - var player = new Player(senderJson, new Player.PlayerService(senderJson)); - Players.Add(senderJson, player); - } + CallbackManager.InvokeCallback(eventName, stringData, senderID); } catch (Exception ex) { - Debug.LogError(ex.Message); - } - - List updatedRpcCalledEvents = new(); - // This state is required to update the called rpc events list, (Temp fix see RpcCall for more) - string nameJson = _playroomKit.GetState("rpcCalledEventName"); - - JSONArray jsonArray = JSON.Parse(nameJson).AsArray; - foreach (JSONNode node in jsonArray) - { - string item = node.Value; - updatedRpcCalledEvents.Add(item); - } - - for (var i = 0; i < updatedRpcCalledEvents.Count; i++) - { - string name = updatedRpcCalledEvents[i]; - CallbackManager.InvokeRpcRegisterCallBack(name, dataJson, senderJson); + Debug.LogError("Error: " + ex.Message); } } diff --git a/Assets/PlayroomKit/package.json b/Assets/PlayroomKit/package.json index e50b613..6223d1f 100644 --- a/Assets/PlayroomKit/package.json +++ b/Assets/PlayroomKit/package.json @@ -16,7 +16,7 @@ "author": "", "license": "ISC", "dependencies": { - "playroomkit": "0.0.83", + "playroomkit": "0.0.85", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/Assets/PlayroomKit/src/index.js b/Assets/PlayroomKit/src/index.js index 53bb4db..069b7d9 100644 --- a/Assets/PlayroomKit/src/index.js +++ b/Assets/PlayroomKit/src/index.js @@ -72,6 +72,30 @@ mergeInto(LibraryManager.library, { return Playroom.isHost(); }, + + /** + * @description Transfers the host to another player if they are in the room + * @param {string} playerId + */ + TransferHostInternal: function (playerId) { + if (!window.Playroom) { + console.error("Playroom library is not loaded. Please make sure to call InsertCoin first."); + return; + } + + try { + Playroom.transferHost(playerId) + .then(() => { + console.log("Host privileges successfully transferred."); + }) + .catch((error) => { + console.error("Failed to transfer host privileges: ", error); + }); + } catch (error) { + console.error("Error transferring host: ", error); + } + }, + /** * @description Checks whether the local game is running in stream mode. * @returns {boolean} True if the local game is running in stream mode, otherwise false. @@ -843,24 +867,18 @@ mergeInto(LibraryManager.library, { return; } - var n = UTF8ToString(name) - console.log(n) - onResponseReturn = UTF8ToString(onResponseReturn); - this.rpcEvents.push(name) function registerCallback(data, sender) { var combinedData = { data: data, senderId: sender.id, - // eventName : n + eventName : n }; var dataJson = JSON.stringify(combinedData); - console.log(`[JS] dataJson: ${dataJson}`); - {{{ makeDynCall('vi', 'callback') }}}(stringToNewUTF8(dataJson)); return onResponseReturn; @@ -883,9 +901,6 @@ mergeInto(LibraryManager.library, { try { data = JSON.parse(UTF8ToString(dataJson)); } catch (parseError) { - console.warn( - "Failed to parse dataJson as JSON. Treating it as a regular string." - ); data = UTF8ToString(dataJson); } } else { diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 4d0df78..2c8a406 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -152,10 +152,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: dc3a2b9cdc24aab40906ce4bcdee9943, type: 3} m_Name: m_EditorClassIdentifier: - playerPrefab: {fileID: 5691958192272525149, guid: 1983f481b86c250409a264643733c292, type: 3} - playerIDText: {fileID: 3918495209311863502} - score: {fileID: 2030615215} - playerID: --- !u!4 &1054460207 Transform: m_ObjectHideFlags: 0 @@ -287,6 +283,10 @@ PrefabInstance: propertyPath: webDriverDirectory value: Assets\ objectReference: {fileID: 0} + - target: {fileID: 8987662522597341863, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} + propertyPath: mockMode + value: 0 + objectReference: {fileID: 0} - target: {fileID: 8987662522597341863, guid: 1b30fa3a265114a45a7e23165a20aecc, type: 3} propertyPath: insertCoinCaller value: diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index cad5e44..c77d201 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -1,48 +1,48 @@ -using System; -using System.Collections.Generic; -using AOT; using Playroom; -using TMPro; using UnityEngine; -using Random = UnityEngine.Random; public class GameManager : MonoBehaviour { - private PlayroomKit kit; + private PlayroomKit _kit; - void Start() + private void Start() { - kit = new(); - kit.InsertCoin(new InitOptions() + _kit = new(); + + _kit.InsertCoin(new InitOptions() { gameId = "[my game id]", maxPlayersPerRoom = 8, discord = true }, () => { - PlayroomKit.RPC.RpcRegister2("A", A); - PlayroomKit.RPC.RpcRegister2("B", B); + _kit.RpcRegister("A", A); + _kit.RpcRegister("B", B); }); } private void Update() { if (Input.GetMouseButtonDown(0)) - kit.RpcCall("A", 1, PlayroomKit.RpcMode.ALL); - - if (Input.GetMouseButtonDown(1)) - kit.RpcCall("B", 2, PlayroomKit.RpcMode.ALL); - + _kit.RpcCall("A", 1, PlayroomKit.RpcMode.HOST); + if (Input.GetMouseButtonDown(1)) + Debug.LogWarning(_kit.IsHost()); } - private void A(string data) + private void A(string data, string sender) { - Debug.Log($"[Unity] A data: {data}"); + Debug.Log($"[Unity] A called only on HOST {data} and {sender}"); + + _kit.TransferHost(sender); + + _kit.RpcCall("B", 2, PlayroomKit.RpcMode.OTHERS); } - private void B(string data) + private void B(string data, string sender) { - Debug.Log($"[Unity] B data: {data}"); + Debug.Log($"[Unity] B called on ALL data: {data} and {sender}"); + + } } \ No newline at end of file From 76cd7b9786fde10b278672ce5ec446b9142ae977 Mon Sep 17 00:00:00 2001 From: momintlh <77355191+momintlh@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:58:49 +0500 Subject: [PATCH 5/5] fix: multiple callbacks for same rpc --- .../Tests/Editor/PlayroomKitTest.cs | 2 +- .../modules/Helpers/CallbackManager.cs | 16 ++++++--- .../InternalFunctions/IInternalFunctions.cs | 2 +- .../InternalFunctions/InterlopWrapper.cs | 4 +-- Assets/PlayroomKit/modules/Player/Player.cs | 2 +- Assets/PlayroomKit/modules/PlayroomService.cs | 3 -- Assets/PlayroomKit/modules/RPC/RPC.cs | 12 ++++--- Assets/Scripts/GameManager.cs | 33 +++++++++++-------- 8 files changed, 45 insertions(+), 29 deletions(-) diff --git a/Assets/PlayroomKit/Tests/Editor/PlayroomKitTest.cs b/Assets/PlayroomKit/Tests/Editor/PlayroomKitTest.cs index f2c58b6..1729af8 100644 --- a/Assets/PlayroomKit/Tests/Editor/PlayroomKitTest.cs +++ b/Assets/PlayroomKit/Tests/Editor/PlayroomKitTest.cs @@ -282,7 +282,7 @@ void HandleShoot(string data, string caller) } _playroomKit.RpcRegister("Shoot", HandleShoot, "You shot!"); - _interop.Received(1).RpcRegisterWrapper("Shoot", Arg.Any>(), "You shot!"); + _interop.Received(1).RpcRegisterWrapper("Shoot", Arg.Any>(), "You shot!"); } [Test] diff --git a/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs b/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs index 95cb985..16503bd 100644 --- a/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs +++ b/Assets/PlayroomKit/modules/Helpers/CallbackManager.cs @@ -8,10 +8,11 @@ namespace Playroom public static class CallbackManager { private static Dictionary callbacks = new(); + private static readonly HashSet RegisteredEvents = new(); private static Dictionary>> RpcCallBacks = new(); - public static string RegisterRpcCallback(Action callback, string key = null) + public static void RegisterRpcCallback(Action callback, string key = null) { if (string.IsNullOrEmpty(key)) key = GenerateKey(); @@ -24,8 +25,6 @@ public static string RegisterRpcCallback(Action callback, string { RpcCallBacks.Add(key, new List> { callback }); } - - return key; } public static void InvokeRpcRegisterCallBack(string name, string data, string sender) @@ -34,7 +33,7 @@ public static void InvokeRpcRegisterCallBack(string name, string data, string se { for (var i = 0; i < callbacks.Count; i++) { - var callback = callbacks[i]; + Action callback = callbacks[i]; callback?.Invoke(data, sender); } } @@ -45,6 +44,15 @@ public static void InvokeRpcRegisterCallBack(string name, string data, string se } } + public static bool IsEventRegistered(string eventName) + { + return RegisteredEvents.Contains(eventName); + } + + public static void MarkEventAsRegistered(string eventName) + { + RegisteredEvents.Add(eventName); + } public static string RegisterCallback(Delegate callback, string key = null) { diff --git a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs index 9efd8fe..84b169b 100644 --- a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs +++ b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/IInternalFunctions.cs @@ -64,7 +64,7 @@ void InsertCoinWrapper(string options, void StartMatchmakingWrapper(Action callback); - void RpcRegisterWrapper(string name, Action rpcRegisterCallback, + void RpcRegisterWrapper(string name, Action rpcRegisterCallback, string onResponseReturn = null); void RpcCallWrapper(string name, string data, RpcMode mode, diff --git a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs index 3725170..31a2373 100644 --- a/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs +++ b/Assets/PlayroomKit/modules/Helpers/InternalFunctions/InterlopWrapper.cs @@ -142,7 +142,7 @@ public void StartMatchmakingWrapper(Action callback) StartMatchmakingInternal(callback); } - public void RpcRegisterWrapper(string name, Action rpcRegisterCallback, + public void RpcRegisterWrapper(string name, Action rpcRegisterCallback, string onResponseReturn = null) { RpcRegisterInternal(name, rpcRegisterCallback, onResponseReturn); @@ -160,7 +160,7 @@ private static extern void RpcRegisterInternal(string name, Action rpcRegisterCallback, + private static extern void RpcRegisterInternal(string name, Action rpcRegisterCallback, string onResponseReturn = null); [DllImport("__Internal")] diff --git a/Assets/PlayroomKit/modules/Player/Player.cs b/Assets/PlayroomKit/modules/Player/Player.cs index 6f174dd..7b58f64 100644 --- a/Assets/PlayroomKit/modules/Player/Player.cs +++ b/Assets/PlayroomKit/modules/Player/Player.cs @@ -147,7 +147,7 @@ public void InvokePlayerOnQuitCallback() #endif #if UNITY_EDITOR - else if (_playerService is BrowserMockPlayerService playerService2) + if (_playerService is BrowserMockPlayerService playerService2) { playerService2.InvokePlayerOnQuitCallback(id); } diff --git a/Assets/PlayroomKit/modules/PlayroomService.cs b/Assets/PlayroomKit/modules/PlayroomService.cs index 1f5af97..c33b7d4 100644 --- a/Assets/PlayroomKit/modules/PlayroomService.cs +++ b/Assets/PlayroomKit/modules/PlayroomService.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; - namespace Playroom { public partial class PlayroomKit @@ -89,13 +88,11 @@ public void TransferHost(string playerId) _interop.TransferHostWrapper(playerId); } - public string GetRoomCode() { return _interop.GetRoomCodeWrapper(); } - public void StartMatchmaking(Action callback = null) { CallbackManager.RegisterCallback(callback, "matchMakingStarted"); diff --git a/Assets/PlayroomKit/modules/RPC/RPC.cs b/Assets/PlayroomKit/modules/RPC/RPC.cs index ff2bde3..ec87d6f 100644 --- a/Assets/PlayroomKit/modules/RPC/RPC.cs +++ b/Assets/PlayroomKit/modules/RPC/RPC.cs @@ -37,9 +37,13 @@ public RPC(PlayroomKit playroomKit, IInterop interop) public void RpcRegister(string name, Action rpcRegisterCallback, string onResponseReturn = null) { - Debug.Log(rpcRegisterCallback.GetMethodInfo().Name); - CallbackManager.RegisterCallback(rpcRegisterCallback, name); - PlayroomKitInterop.RpcRegisterInternal(name, RpcRegisterCallBackHandler, onResponseReturn); + CallbackManager.RegisterRpcCallback(rpcRegisterCallback, name); + + if (!CallbackManager.IsEventRegistered(name)) + { + _interop.RpcRegisterWrapper(name, RpcRegisterCallBackHandler, onResponseReturn); + CallbackManager.MarkEventAsRegistered(name); + } } public void RpcCall(string name, object data, RpcMode mode, Action callbackOnResponse = null) @@ -112,7 +116,7 @@ protected static void RpcRegisterCallBackHandler(string combinedData) string stringData = jsonNode["data"]; string senderID = jsonNode["senderId"]; - CallbackManager.InvokeCallback(eventName, stringData, senderID); + CallbackManager.InvokeRpcRegisterCallBack(eventName, stringData, senderID); } catch (Exception ex) { diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index c77d201..98850c1 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -8,7 +8,7 @@ public class GameManager : MonoBehaviour private void Start() { _kit = new(); - + _kit.InsertCoin(new InitOptions() { gameId = "[my game id]", @@ -16,8 +16,21 @@ private void Start() discord = true }, () => { + // same event multiple RPCs _kit.RpcRegister("A", A); - _kit.RpcRegister("B", B); + _kit.RpcRegister("A", A2); + + // RPC Call From Another RPC + _kit.RpcRegister("host", (data, sender) => + { + Debug.Log("Host RPC CALLED"); + _kit.RpcCall("client", 1, PlayroomKit.RpcMode.ALL); + } + ); + _kit.RpcRegister("client", (data, sender) => + { + Debug.Log("client rpc called"); + }); }); } @@ -25,24 +38,18 @@ private void Update() { if (Input.GetMouseButtonDown(0)) _kit.RpcCall("A", 1, PlayroomKit.RpcMode.HOST); - + if (Input.GetMouseButtonDown(1)) - Debug.LogWarning(_kit.IsHost()); + _kit.RpcCall("host", 1, PlayroomKit.RpcMode.HOST); } private void A(string data, string sender) { - Debug.Log($"[Unity] A called only on HOST {data} and {sender}"); - - _kit.TransferHost(sender); - - _kit.RpcCall("B", 2, PlayroomKit.RpcMode.OTHERS); + Debug.Log($"[Unity] A called"); } - private void B(string data, string sender) + private void A2(string data, string sender) { - Debug.Log($"[Unity] B called on ALL data: {data} and {sender}"); - - + Debug.LogWarning("[Unity] A2 data: " + data.ToString()); } } \ No newline at end of file