Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Assets/Resources.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

File renamed without changes.
12 changes: 12 additions & 0 deletions Assets/Scripts/Network/IPlayerInfoProvider.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
11 changes: 11 additions & 0 deletions Assets/Scripts/Network/IPlayerInfoProvider.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions Assets/Scripts/Network/Messages/UpdateData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
42 changes: 42 additions & 0 deletions Assets/Scripts/Network/PlayerData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;

namespace Born.InterviewTest.Network
{
/// <summary>
/// Represents the player data.
/// </summary>
public class PlayerData : IPlayerInfoProvider
{
public string PlayerName { get; private set; }

public int AvatarId { get; private set; }

public event Action OnUpdateName;

public event Action OnUpdateAvatar;

/// <summary>
/// Update the player name. This invokes the OnUpdateName event.
/// </summary>
public void UpdatePlayerName(string playerName)
{
if (playerName != null)
{
PlayerName = playerName;
OnUpdateName?.Invoke();
}
}

/// <summary>
/// Update the player avatar ID. This invokes the OnUpdateAvatar event.
/// </summary>
public void UpdateAvatarId(int avatarId)
{
if (avatarId >= 0 && avatarId != AvatarId)
{
AvatarId = avatarId;
OnUpdateAvatar?.Invoke();
}
}
}
}
11 changes: 11 additions & 0 deletions Assets/Scripts/Network/PlayerData.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 7 additions & 2 deletions Assets/Scripts/Network/Session.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand All @@ -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;
}
}
Expand Down
2 changes: 2 additions & 0 deletions Assets/Scripts/Network/SessionTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
37 changes: 36 additions & 1 deletion Assets/Scripts/Players/Player.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using UnityEngine;
using Born.InterviewTest.Network;
using UnityEngine;

namespace Born.InterviewTest.Players
{
Expand All @@ -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;
}
}
}
20 changes: 19 additions & 1 deletion Assets/Scripts/Players/PlayerNameView.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
using UnityEngine;
using Born.InterviewTest.Network;
using UnityEngine;
using UnityEngine.UI;

namespace Born.InterviewTest.Players
{
/// <summary>
/// Represents the player name in the scene. Responsible for displaying the player name on the UI canvas.
/// </summary>
[RequireComponent(typeof(Text))]
public class PlayerNameView : MonoBehaviour
{
private IPlayerInfoProvider playerInfoProvider;
private Text nameText;

private void Awake()
{
playerInfoProvider = Runtime.App.Instance.PlayerInfoProvider;
nameText = GetComponent<Text>();
nameText.text = "";

playerInfoProvider.OnUpdateName += UpdateName;
}

private void UpdateName()
{
nameText.text = playerInfoProvider.PlayerName ?? "";
}

private void OnDestroy()
{
playerInfoProvider.OnUpdateName -= UpdateName;
}
}
}
7 changes: 6 additions & 1 deletion Assets/Scripts/Runtime/App.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

}
}
}