using System; using Fusion; using UnityEngine; // struct quản lý thông tin public struct _PlayerMetaData : INetworkStruct { public NetworkString<_16> Name; public _Role Role; public NetworkBool IsReady; } public class PlayerDataManager : NetworkBehaviour { public static PlayerDataManager Instance { get; private set; } [Networked] public NetworkDictionary Players => default; public event Action OnChatMessageReceived; public override void Spawned() { Instance = this; } public override void Despawned(NetworkRunner runner, bool hasState) { if (Instance == this) Instance = null; } [Rpc(RpcSources.All, RpcTargets.StateAuthority)] public void RPC_UpdatePlayerMetaData(PlayerRef playerRef, _PlayerMetaData metaData) { if (Object == null || !Object.IsValid) return; Players.Set(playerRef, metaData); } [Rpc(RpcSources.All, RpcTargets.StateAuthority)] public void RPC_SetReady(PlayerRef playerRef, bool ready) { if (Object == null || !Object.IsValid) return; if (Players.TryGet(playerRef, out var data)) { data.IsReady = ready; Players.Set(playerRef, data); } } [Rpc(RpcSources.All, RpcTargets.All)] public void RPC_SendChatMessage(PlayerRef sender, string message) { OnChatMessageReceived?.Invoke(sender, message); } public bool TryGetPlayerMetaData(PlayerRef playerRef, out _PlayerMetaData metaData) { metaData = default; // Kiểm tra xem object đã được Spawned chưa trước khi truy cập networked property if (Object == null || !Object.IsValid) return false; return Players.TryGet(playerRef, out metaData); } }