You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.7 KiB
C#
93 lines
3.7 KiB
C#
using System;
|
|
using Unity.BossRoom.ConnectionManagement;
|
|
using Unity.BossRoom.Gameplay.GameplayObjects.Character;
|
|
using Unity.BossRoom.Utils;
|
|
using Unity.Multiplayer.Samples.BossRoom;
|
|
using Unity.Netcode;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.BossRoom.Gameplay.GameplayObjects
|
|
{
|
|
/// <summary>
|
|
/// NetworkBehaviour that represents a player connection and is the "Default Player Prefab" inside Netcode for
|
|
/// GameObjects' (Netcode) NetworkManager. This NetworkBehaviour will contain several other NetworkBehaviours that
|
|
/// should persist throughout the duration of this connection, meaning it will persist between scenes.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// It is not necessary to explicitly mark this as a DontDestroyOnLoad object as Netcode will handle migrating this
|
|
/// Player object between scene loads.
|
|
/// </remarks>
|
|
[RequireComponent(typeof(NetworkObject))]
|
|
public class PersistentPlayer : NetworkBehaviour
|
|
{
|
|
[SerializeField]
|
|
PersistentPlayerRuntimeCollection m_PersistentPlayerRuntimeCollection;
|
|
|
|
[SerializeField]
|
|
NetworkNameState m_NetworkNameState;
|
|
|
|
[SerializeField]
|
|
NetworkAvatarGuidState m_NetworkAvatarGuidState;
|
|
|
|
public NetworkNameState NetworkNameState => m_NetworkNameState;
|
|
|
|
public NetworkAvatarGuidState NetworkAvatarGuidState => m_NetworkAvatarGuidState;
|
|
|
|
public override void OnNetworkSpawn()
|
|
{
|
|
gameObject.name = "PersistentPlayer" + OwnerClientId;
|
|
|
|
// Note that this is done here on OnNetworkSpawn in case this NetworkBehaviour's properties are accessed
|
|
// when this element is added to the runtime collection. If this was done in OnEnable() there is a chance
|
|
// that OwnerClientID could be its default value (0).
|
|
m_PersistentPlayerRuntimeCollection.Add(this);
|
|
if (IsServer)
|
|
{
|
|
var sessionPlayerData = SessionManager<SessionPlayerData>.Instance.GetPlayerData(OwnerClientId);
|
|
if (sessionPlayerData.HasValue)
|
|
{
|
|
var playerData = sessionPlayerData.Value;
|
|
m_NetworkNameState.Name.Value = playerData.PlayerName;
|
|
if (playerData.HasCharacterSpawned)
|
|
{
|
|
m_NetworkAvatarGuidState.AvatarGuid.Value = playerData.AvatarNetworkGuid;
|
|
}
|
|
else
|
|
{
|
|
m_NetworkAvatarGuidState.SetRandomAvatar();
|
|
playerData.AvatarNetworkGuid = m_NetworkAvatarGuidState.AvatarGuid.Value;
|
|
SessionManager<SessionPlayerData>.Instance.SetPlayerData(OwnerClientId, playerData);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void OnDestroy()
|
|
{
|
|
base.OnDestroy();
|
|
RemovePersistentPlayer();
|
|
}
|
|
|
|
public override void OnNetworkDespawn()
|
|
{
|
|
RemovePersistentPlayer();
|
|
}
|
|
|
|
void RemovePersistentPlayer()
|
|
{
|
|
m_PersistentPlayerRuntimeCollection.Remove(this);
|
|
if (IsServer)
|
|
{
|
|
var sessionPlayerData = SessionManager<SessionPlayerData>.Instance.GetPlayerData(OwnerClientId);
|
|
if (sessionPlayerData.HasValue)
|
|
{
|
|
var playerData = sessionPlayerData.Value;
|
|
playerData.PlayerName = m_NetworkNameState.Name.Value;
|
|
playerData.AvatarNetworkGuid = m_NetworkAvatarGuidState.AvatarGuid.Value;
|
|
SessionManager<SessionPlayerData>.Instance.SetPlayerData(OwnerClientId, playerData);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|