From 5ccf39e838a8a42060a9eba53c65d8a9a1cde2c6 Mon Sep 17 00:00:00 2001 From: Darren Perry Date: Sun, 18 Sep 2022 14:41:15 +0100 Subject: [PATCH 1/3] - move prefabs to resources --- .vsconfig | 6 ++++++ Assets/Resources.meta | 8 ++++++++ Assets/{ => Resources}/Prefabs.meta | 0 Assets/{ => Resources}/Prefabs/PlayerAvatar-1.prefab | 0 Assets/{ => Resources}/Prefabs/PlayerAvatar-1.prefab.meta | 0 Assets/{ => Resources}/Prefabs/PlayerAvatar-2.prefab | 0 Assets/{ => Resources}/Prefabs/PlayerAvatar-2.prefab.meta | 0 7 files changed, 14 insertions(+) create mode 100644 .vsconfig create mode 100644 Assets/Resources.meta rename Assets/{ => Resources}/Prefabs.meta (100%) rename Assets/{ => Resources}/Prefabs/PlayerAvatar-1.prefab (100%) rename Assets/{ => Resources}/Prefabs/PlayerAvatar-1.prefab.meta (100%) rename Assets/{ => Resources}/Prefabs/PlayerAvatar-2.prefab (100%) rename Assets/{ => Resources}/Prefabs/PlayerAvatar-2.prefab.meta (100%) diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..d70cd98 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/Resources.meta b/Assets/Resources.meta new file mode 100644 index 0000000..ccdf533 --- /dev/null +++ b/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 997c101472d7dff44b198580664e29c0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs.meta b/Assets/Resources/Prefabs.meta similarity index 100% rename from Assets/Prefabs.meta rename to Assets/Resources/Prefabs.meta diff --git a/Assets/Prefabs/PlayerAvatar-1.prefab b/Assets/Resources/Prefabs/PlayerAvatar-1.prefab similarity index 100% rename from Assets/Prefabs/PlayerAvatar-1.prefab rename to Assets/Resources/Prefabs/PlayerAvatar-1.prefab diff --git a/Assets/Prefabs/PlayerAvatar-1.prefab.meta b/Assets/Resources/Prefabs/PlayerAvatar-1.prefab.meta similarity index 100% rename from Assets/Prefabs/PlayerAvatar-1.prefab.meta rename to Assets/Resources/Prefabs/PlayerAvatar-1.prefab.meta diff --git a/Assets/Prefabs/PlayerAvatar-2.prefab b/Assets/Resources/Prefabs/PlayerAvatar-2.prefab similarity index 100% rename from Assets/Prefabs/PlayerAvatar-2.prefab rename to Assets/Resources/Prefabs/PlayerAvatar-2.prefab diff --git a/Assets/Prefabs/PlayerAvatar-2.prefab.meta b/Assets/Resources/Prefabs/PlayerAvatar-2.prefab.meta similarity index 100% rename from Assets/Prefabs/PlayerAvatar-2.prefab.meta rename to Assets/Resources/Prefabs/PlayerAvatar-2.prefab.meta From fa4a423cc58918208941b7f9570075c30c83acf4 Mon Sep 17 00:00:00 2001 From: Darren Perry Date: Sun, 18 Sep 2022 14:44:37 +0100 Subject: [PATCH 2/3] - Add functionality to receive updates to player data - Add functionality to receive updates to player data - Update the player name in the UI - Update the player avatar in the scene --- Assets/Scripts/Network/IPlayerInfoProvider.cs | 12 ++++++ .../Network/IPlayerInfoProvider.cs.meta | 11 +++++ Assets/Scripts/Network/Messages/UpdateData.cs | 9 ++++ Assets/Scripts/Network/PlayerData.cs | 42 +++++++++++++++++++ Assets/Scripts/Network/PlayerData.cs.meta | 11 +++++ Assets/Scripts/Network/Session.cs | 9 +++- Assets/Scripts/Network/SessionTester.cs | 2 + Assets/Scripts/Players/Player.cs | 37 +++++++++++++++- Assets/Scripts/Players/PlayerNameView.cs | 20 ++++++++- Assets/Scripts/Runtime/App.cs | 7 +++- 10 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 Assets/Scripts/Network/IPlayerInfoProvider.cs create mode 100644 Assets/Scripts/Network/IPlayerInfoProvider.cs.meta create mode 100644 Assets/Scripts/Network/PlayerData.cs create mode 100644 Assets/Scripts/Network/PlayerData.cs.meta diff --git a/Assets/Scripts/Network/IPlayerInfoProvider.cs b/Assets/Scripts/Network/IPlayerInfoProvider.cs new file mode 100644 index 0000000..205459c --- /dev/null +++ b/Assets/Scripts/Network/IPlayerInfoProvider.cs @@ -0,0 +1,12 @@ +using System; + +namespace Born.InterviewTest.Network +{ + public interface IPlayerInfoProvider + { + string PlayerName { get; } + int AvatarId { get; } + event Action OnUpdateName; + event Action OnUpdateAvatar; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Network/IPlayerInfoProvider.cs.meta b/Assets/Scripts/Network/IPlayerInfoProvider.cs.meta new file mode 100644 index 0000000..d5650ba --- /dev/null +++ b/Assets/Scripts/Network/IPlayerInfoProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 704895888375b8b4ba31ad09bd4107b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Network/Messages/UpdateData.cs b/Assets/Scripts/Network/Messages/UpdateData.cs index fee74bc..add9e37 100644 --- a/Assets/Scripts/Network/Messages/UpdateData.cs +++ b/Assets/Scripts/Network/Messages/UpdateData.cs @@ -2,5 +2,14 @@ { public class UpdateData : Message { + public readonly string PlayerName; + + public readonly int AvatarId; + + public UpdateData(string playerName = null, int avatarId = -1) + { + PlayerName = playerName; + AvatarId = avatarId; + } } } \ No newline at end of file diff --git a/Assets/Scripts/Network/PlayerData.cs b/Assets/Scripts/Network/PlayerData.cs new file mode 100644 index 0000000..f772ba7 --- /dev/null +++ b/Assets/Scripts/Network/PlayerData.cs @@ -0,0 +1,42 @@ +using System; + +namespace Born.InterviewTest.Network +{ + /// + /// Represents the player data. + /// + public class PlayerData : IPlayerInfoProvider + { + public string PlayerName { get; private set; } + + public int AvatarId { get; private set; } + + public event Action OnUpdateName; + + public event Action OnUpdateAvatar; + + /// + /// Update the player name. This invokes the OnUpdateName event. + /// + public void UpdatePlayerName(string playerName) + { + if (playerName != null) + { + PlayerName = playerName; + OnUpdateName?.Invoke(); + } + } + + /// + /// Update the player avatar ID. This invokes the OnUpdateAvatar event. + /// + public void UpdateAvatarId(int avatarId) + { + if (avatarId >= 0 && avatarId != AvatarId) + { + AvatarId = avatarId; + OnUpdateAvatar?.Invoke(); + } + } + } +} diff --git a/Assets/Scripts/Network/PlayerData.cs.meta b/Assets/Scripts/Network/PlayerData.cs.meta new file mode 100644 index 0000000..dd49097 --- /dev/null +++ b/Assets/Scripts/Network/PlayerData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 25bd1dc1b72ffa546a78a190f4b364d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Network/Session.cs b/Assets/Scripts/Network/Session.cs index b3733ca..efb101f 100644 --- a/Assets/Scripts/Network/Session.cs +++ b/Assets/Scripts/Network/Session.cs @@ -14,13 +14,16 @@ public class Session : ISessionInfoProvider, ITestMessageReceiver private const string Password = "Not-A-Secret"; private readonly Connection connection; - - public Session() + private readonly PlayerData playerData; + + public Session(PlayerData playerData) { connection = new Connection(); connection.MessageReceived += OnMessageReceived; connection.Opened += OnConnectionOpened; connection.Open(); + + this.playerData = playerData; } public bool HasJoinedSession { get; private set; } @@ -45,6 +48,8 @@ private void OnMessageReceived(Message message) case UpdateData updateData: // Process message to update the local data elements that are being updated by the message. + playerData.UpdatePlayerName(updateData.PlayerName); + playerData.UpdateAvatarId(updateData.AvatarId); break; } } diff --git a/Assets/Scripts/Network/SessionTester.cs b/Assets/Scripts/Network/SessionTester.cs index f48aabf..1e100ac 100644 --- a/Assets/Scripts/Network/SessionTester.cs +++ b/Assets/Scripts/Network/SessionTester.cs @@ -44,10 +44,12 @@ private void Update() if (updatePlayerName) { // Add player name update to UpdateData message. + updateData = new(playerName:playerName); } if (updateAvatarId) { // Add avatar id update to UpdateData message. + updateData = new(playerName: updateData.PlayerName, avatarId:avatarId); } testMessageReceiver.ReceiveTestMessage(updateData); diff --git a/Assets/Scripts/Players/Player.cs b/Assets/Scripts/Players/Player.cs index 80d754b..4563b3f 100644 --- a/Assets/Scripts/Players/Player.cs +++ b/Assets/Scripts/Players/Player.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using Born.InterviewTest.Network; +using UnityEngine; namespace Born.InterviewTest.Players { @@ -8,5 +9,39 @@ namespace Born.InterviewTest.Players public class Player : MonoBehaviour { [SerializeField] private Transform avatarRoot; + private Object[] avatarPrefabs; + private IPlayerInfoProvider playerInfoProvider; + private GameObject avatarInstance; + + private void Awake() + { + playerInfoProvider = Runtime.App.Instance.PlayerInfoProvider; + playerInfoProvider.OnUpdateAvatar += UpdateAvatar; + + avatarPrefabs = Resources.LoadAll("Prefabs", typeof(GameObject)); + } + + private void UpdateAvatar() + { + GameObject newAatarPrefab = null; + foreach(GameObject avatarPrefab in avatarPrefabs) + { + if(avatarPrefab.name.EndsWith(playerInfoProvider.AvatarId.ToString())) + { + newAatarPrefab = avatarPrefab; + break; + } + } + if (newAatarPrefab != null) + { + if (avatarInstance != null) Destroy(avatarInstance); + avatarInstance = Instantiate(newAatarPrefab, avatarRoot); + } + } + + private void OnDestroy() + { + playerInfoProvider.OnUpdateAvatar -= UpdateAvatar; + } } } \ No newline at end of file diff --git a/Assets/Scripts/Players/PlayerNameView.cs b/Assets/Scripts/Players/PlayerNameView.cs index 71b85b5..876f9a5 100644 --- a/Assets/Scripts/Players/PlayerNameView.cs +++ b/Assets/Scripts/Players/PlayerNameView.cs @@ -1,17 +1,35 @@ -using UnityEngine; +using Born.InterviewTest.Network; +using UnityEngine; using UnityEngine.UI; namespace Born.InterviewTest.Players { + /// + /// Represents the player name in the scene. Responsible for displaying the player name on the UI canvas. + /// [RequireComponent(typeof(Text))] public class PlayerNameView : MonoBehaviour { + private IPlayerInfoProvider playerInfoProvider; private Text nameText; private void Awake() { + playerInfoProvider = Runtime.App.Instance.PlayerInfoProvider; nameText = GetComponent(); nameText.text = ""; + + playerInfoProvider.OnUpdateName += UpdateName; + } + + private void UpdateName() + { + nameText.text = playerInfoProvider.PlayerName ?? ""; + } + + private void OnDestroy() + { + playerInfoProvider.OnUpdateName -= UpdateName; } } } \ No newline at end of file diff --git a/Assets/Scripts/Runtime/App.cs b/Assets/Scripts/Runtime/App.cs index f025bc4..40337c3 100644 --- a/Assets/Scripts/Runtime/App.cs +++ b/Assets/Scripts/Runtime/App.cs @@ -11,15 +11,20 @@ public class App public static App Instance { get; private set; } public ISessionInfoProvider SessionInfoProvider { get; } + public IPlayerInfoProvider PlayerInfoProvider { get; } public ITestMessageReceiver TestMessageReceiver { get; } public App() { Instance = this; - Session session = new(); + PlayerData playerData = new(); + PlayerInfoProvider = playerData; + + Session session = new(playerData); SessionInfoProvider = session; TestMessageReceiver = session; + } } } \ No newline at end of file From 9aec90c46538a6ab2b45f072a24d82e74fd79f65 Mon Sep 17 00:00:00 2001 From: Darren Perry Date: Sun, 18 Sep 2022 14:57:59 +0100 Subject: [PATCH 3/3] Delete .vsconfig --- .vsconfig | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .vsconfig diff --git a/.vsconfig b/.vsconfig deleted file mode 100644 index d70cd98..0000000 --- a/.vsconfig +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0", - "components": [ - "Microsoft.VisualStudio.Workload.ManagedGame" - ] -}