From c0d06092c1dc68abbf6d66195ec615eddf85f744 Mon Sep 17 00:00:00 2001 From: Dapper Dino Date: Thu, 25 Sep 2025 14:05:16 +0100 Subject: [PATCH 01/11] Refactor UnityNakamaFriends --- .../Editor/AccountSwitcher.cs | 63 ++++-- .../Scripts/Editor/ReadmeEditor.cs | 2 +- .../Editor/TutorialInfo/Scripts/Readme.cs | 2 +- .../HeroicUI/CustomComponents/ErrorPopup.uxml | 2 +- .../CustomComponents/ListControls.uxml | 2 +- .../HeroicUI/CustomComponents/ListHead.uxml | 2 +- .../HeroicUI/USS/HeroicUSSGlobal.uss | 4 +- .../UnityNakamaFriends/Scenes/Main.unity | 49 +++++ .../Scripts/FriendsRecordView.cs | 33 +-- .../Scripts/NakamaFriendsController.cs | 206 +++++++----------- .../Scripts/NakamaSingleton.cs | 123 +++++++++++ .../Scripts/NakamaSingleton.cs.meta | 2 + .../Third-Party Notices.txt.meta | 7 + .../Packages/packages-lock.json | 15 -- 14 files changed, 314 insertions(+), 198 deletions(-) create mode 100644 UnityNakamaFriends/Assets/UnityNakamaFriends/Scripts/NakamaSingleton.cs create mode 100644 UnityNakamaFriends/Assets/UnityNakamaFriends/Scripts/NakamaSingleton.cs.meta create mode 100644 UnityNakamaFriends/Assets/UnityNakamaFriends/Third-Party Notices.txt.meta diff --git a/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/AccountSwitcher.cs b/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/AccountSwitcher.cs index 639f18c..59b82c8 100644 --- a/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/AccountSwitcher.cs +++ b/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/AccountSwitcher.cs @@ -1,26 +1,39 @@ +// Copyright 2025 The Nakama Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + using System; using System.Collections.Generic; -using System.Net.WebSockets; using System.Text; -using System.Threading.Tasks; using Nakama; using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UIElements; -namespace SampleProjects.NakamaFriends.Editor +namespace UnityNakamaFriends.Editor { public class AccountSwitcherEditor : EditorWindow { - [SerializeField] private VisualTreeAsset tree; + [SerializeField] + private VisualTreeAsset tree; private DropdownField accountDropdown; private Label usernamesLabel; private readonly SortedDictionary accountUsernames = new(); - private const string ACCOUNT_USERNAMES_KEY = "AccountSwitcher_Usernames"; + private const string AccountUsernamesKey = "AccountSwitcher_Usernames"; [MenuItem("Tools/Nakama/Account Switcher")] public static void ShowWindow() @@ -30,11 +43,11 @@ public static void ShowWindow() window.Focus(); } - + [MenuItem("Tools/Nakama/Clear Test Accounts")] public static void ClearSavedAccounts() { - EditorPrefs.DeleteKey(ACCOUNT_USERNAMES_KEY); + EditorPrefs.DeleteKey(AccountUsernamesKey); Debug.Log("Cleared all saved account usernames"); // Refresh any open Account Switcher windows @@ -66,9 +79,10 @@ private void CreateGUI() { if (!rootGameObject.TryGetComponent(out var friendsController)) continue; - if (friendsController.Session != null) + var session = NakamaSingleton.Instance.Session; + if (session != null) { - OnControllerInitialized(friendsController.Session); + OnControllerInitialized(session); } else { @@ -90,7 +104,7 @@ private void OnControllerInitialized(ISession session, NakamaFriendsController c private void LoadAccountUsernames() { - var savedUsernames = EditorPrefs.GetString(ACCOUNT_USERNAMES_KEY, ""); + var savedUsernames = EditorPrefs.GetString(AccountUsernamesKey, ""); if (string.IsNullOrEmpty(savedUsernames)) return; try @@ -120,7 +134,7 @@ private void SaveAccountUsernames() } var json = JsonUtility.ToJson(usernameData); - EditorPrefs.SetString(ACCOUNT_USERNAMES_KEY, json); + EditorPrefs.SetString(AccountUsernamesKey, json); } catch (Exception ex) { @@ -140,6 +154,7 @@ private async void SwitchAccount(ChangeEvent changeEvt) { deviceId = Guid.NewGuid().ToString(); } + PlayerPrefs.SetString("deviceId", deviceId); var rootGameObjects = SceneManager.GetActiveScene().GetRootGameObjects(); @@ -148,32 +163,34 @@ private async void SwitchAccount(ChangeEvent changeEvt) if (!rootGameObject.TryGetComponent(out var friendsController)) continue; // Save username before switching - if (!string.IsNullOrEmpty(previousValue) && friendsController.Session != null) + var session = NakamaSingleton.Instance.Session; + if (!string.IsNullOrEmpty(previousValue) && session != null) { - accountUsernames[previousValue] = friendsController.Session.Username; + accountUsernames[previousValue] = session.Username; } - await friendsController.MainSocket.CloseAsync(); + await NakamaSingleton.Instance.Socket.CloseAsync(); - if (friendsController.Session != null) + if (session != null) { - await friendsController.Client.SessionLogoutAsync(friendsController.Session); + await NakamaSingleton.Instance.Client.SessionLogoutAsync(session); } try { - var newSession = await friendsController.Client.AuthenticateDeviceAsync($"{deviceId}_{accountDropdown.index}"); + var newSession = + await NakamaSingleton.Instance.Client.AuthenticateDeviceAsync($"{deviceId}_{accountDropdown.index}"); accountUsernames[newValue] = newSession.Username; - await friendsController.MainSocket.ConnectAsync(newSession, true); + await NakamaSingleton.Instance.Socket.ConnectAsync(newSession, true); friendsController.SwitchComplete(newSession); - + // Save usernames after successful authentication SaveAccountUsernames(); break; } - catch (ApiResponseException ex) + catch (ApiResponseException e) { - Debug.LogWarning($"Error authenticating with Device ID: {ex.Message}"); + Debug.LogWarning($"Error authenticating with Device ID: {e.Message}"); return; } } @@ -185,7 +202,7 @@ private void UpdateUsernameLabels() { var sb = new StringBuilder(); var index = 1; - + foreach (var kvp in accountUsernames) { sb.Append(index); @@ -211,4 +228,4 @@ private class SerializableKeyValuePair public string value; } } -} \ No newline at end of file +} diff --git a/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Editor/ReadmeEditor.cs b/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Editor/ReadmeEditor.cs index fd8f4e7..baf9254 100644 --- a/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Editor/ReadmeEditor.cs +++ b/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Editor/ReadmeEditor.cs @@ -3,7 +3,7 @@ using System.IO; using System.Reflection; -namespace SampleProjects.NakamaFriends.Editor +namespace UnityNakamaFriends.Editor { [CustomEditor(typeof(Readme))] [InitializeOnLoad] diff --git a/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Readme.cs b/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Readme.cs index 7fa1cf2..16f305e 100644 --- a/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Readme.cs +++ b/UnityNakamaFriends/Assets/UnityNakamaFriends/Editor/TutorialInfo/Scripts/Readme.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace SampleProjects.NakamaFriends.Editor +namespace UnityNakamaFriends.Editor { public class Readme : ScriptableObject { diff --git a/UnityNakamaFriends/Assets/UnityNakamaFriends/HeroicUI/CustomComponents/ErrorPopup.uxml b/UnityNakamaFriends/Assets/UnityNakamaFriends/HeroicUI/CustomComponents/ErrorPopup.uxml index 49e08fd..7c472b8 100644 --- a/UnityNakamaFriends/Assets/UnityNakamaFriends/HeroicUI/CustomComponents/ErrorPopup.uxml +++ b/UnityNakamaFriends/Assets/UnityNakamaFriends/HeroicUI/CustomComponents/ErrorPopup.uxml @@ -1,5 +1,5 @@ -