using Unity.Collections; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; public class Player : NetworkBehaviour { [Header("Components")] [SerializeField] private NetworkObject network; [SerializeField] private PlayerMovement movement; [SerializeField] private Animator animator; [SerializeField] private NavMeshAgent agent; [Header("Character")] [SerializeField, ReadOnly] private GameObject spawnedCharacter; [SerializeField, ReadOnly] private Character character; private NetworkVariable characterName = new("char_james", NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Owner); public PlayerMovement Movement => movement; public Animator Animator => animator; private void UpdateCharacter(string name) { Character character = GameManager.CharactersList.FindCharacter(name); this.character = character; if (character && IsOwner) { InstantiateCharacterServerRpc(OwnerClientId, character.IDName); } } [Rpc(SendTo.Server)] private void InstantiateCharacterServerRpc(ulong clientId, string characterID) { Debug.Log("[Rpc(SendTo.Server)]"); Character character = GameManager.CharactersList.FindCharacter(characterID); if (spawnedCharacter) Destroy(spawnedCharacter); spawnedCharacter = Instantiate(character.Prefab, transform); NetworkObject networkObject = spawnedCharacter.GetComponent(); if (networkObject != null) { networkObject.SpawnWithOwnership(clientId); spawnedCharacter.transform.parent = transform; } InstantiateCharacterEveryoneRpc(networkObject.NetworkObjectId); } [Rpc(SendTo.Everyone)] private void InstantiateCharacterEveryoneRpc(ulong networkObjectId) { Debug.Log("[Rpc(SendTo.Everyone)]"); NetworkObject networkObject = NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkObjectId]; spawnedCharacter = networkObject.gameObject; if (networkObject.OwnerClientId == OwnerClientId) { animator = spawnedCharacter.GetComponent(); animator.SetInteger("Gender", (int)character.Gender); } } public override void OnNetworkSpawn() { characterName.OnValueChanged += (FixedString32Bytes previousValue, FixedString32Bytes newValue) => { UpdateCharacter(newValue.ToString()); }; Debug.Log(characterName.Value.ToString()); UpdateCharacter(characterName.Value.ToString()); if (!IsOwner) { Destroy(movement); Destroy(agent); } else { GameManager.Instance.SetLocalPlayer(this); } } public void SetCharacter(Character character) { characterName.Value = character.IDName; } public void PlayAnimation(string anim) { if (!IsOwner) return; movement.StopMovement(); animator.Play(anim); } private void AnimatorSetTrigger(string name) { if (!IsOwner) return; movement.StopMovement(); animator.SetTrigger(name); } public void Sit() => AnimatorSetTrigger("Sit"); public void Lay() => AnimatorSetTrigger("Lay"); public void SpawnEmoji(int index) { SpawnEmojiEveryoneRpc(index); } [Rpc(SendTo.Everyone)] private void SpawnEmojiEveryoneRpc(int index) { EmojiPopup popup = Instantiate(GameManager.EmojiPopupData.Prefab, transform); popup.Initialize(index); } public void SetPosition(Vector3 position) { if (!IsOwner) return; movement.MoveTo(position); transform.position = position; } }