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
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