75 lines
2.2 KiB
C#
75 lines
2.2 KiB
C#
using Unity.Collections;
|
|
using Unity.Netcode;
|
|
using UnityEngine;
|
|
|
|
public sealed class PlayerIdentity : NetworkBehaviour, IPlayerSystem
|
|
{
|
|
private readonly NetworkVariable<FixedString64Bytes> displayName = new(
|
|
new FixedString64Bytes("Worker"),
|
|
NetworkVariableReadPermission.Everyone,
|
|
NetworkVariableWritePermission.Owner);
|
|
|
|
private TextMesh nameLabel;
|
|
private bool isInitialized;
|
|
|
|
public string DisplayName => displayName.Value.ToString();
|
|
|
|
public void Initialize(PlayerFacade facade)
|
|
{
|
|
isInitialized = true;
|
|
}
|
|
|
|
public override void OnNetworkSpawn()
|
|
{
|
|
displayName.OnValueChanged += HandleNameChanged;
|
|
CreateNameLabel();
|
|
HandleNameChanged(default, displayName.Value);
|
|
|
|
if (IsOwner)
|
|
{
|
|
string localName = NetworkSessionController.Instance != null
|
|
? NetworkSessionController.Instance.LocalPlayerName
|
|
: "Worker";
|
|
displayName.Value = new FixedString64Bytes(localName);
|
|
}
|
|
}
|
|
|
|
public override void OnNetworkDespawn()
|
|
{
|
|
displayName.OnValueChanged -= HandleNameChanged;
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (!isInitialized || nameLabel == null || Camera.main == null)
|
|
return;
|
|
|
|
Vector3 cameraPosition = Camera.main.transform.position;
|
|
nameLabel.transform.rotation = Quaternion.LookRotation(nameLabel.transform.position - cameraPosition);
|
|
}
|
|
|
|
private void CreateNameLabel()
|
|
{
|
|
if (nameLabel != null)
|
|
return;
|
|
|
|
var labelObject = new GameObject("PlayerNameLabel");
|
|
labelObject.transform.SetParent(transform, false);
|
|
labelObject.transform.localPosition = new Vector3(0f, 2.25f, 0f);
|
|
labelObject.transform.localScale = Vector3.one * 0.12f;
|
|
|
|
nameLabel = labelObject.AddComponent<TextMesh>();
|
|
nameLabel.anchor = TextAnchor.MiddleCenter;
|
|
nameLabel.alignment = TextAlignment.Center;
|
|
nameLabel.fontSize = 48;
|
|
nameLabel.characterSize = 0.1f;
|
|
nameLabel.color = Color.white;
|
|
}
|
|
|
|
private void HandleNameChanged(FixedString64Bytes previousValue, FixedString64Bytes newValue)
|
|
{
|
|
if (nameLabel != null)
|
|
nameLabel.text = newValue.ToString();
|
|
}
|
|
}
|