You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.6 KiB
126 lines
3.6 KiB
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Unity.Collections;
|
|
using Unity.Collections.LowLevel.Unsafe;
|
|
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<FixedString32Bytes> 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);
|
|
}
|
|
}
|
|
|
|
[Rpc(SendTo.Server)]
|
|
private void InstantiateCharacterServerRpc(ulong clientId)
|
|
{
|
|
Debug.Log("[Rpc(SendTo.Server)]");
|
|
|
|
if (spawnedCharacter) Destroy(spawnedCharacter);
|
|
|
|
spawnedCharacter = Instantiate(character.Prefab, transform);
|
|
NetworkObject networkObject = spawnedCharacter.GetComponent<NetworkObject>();
|
|
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>();
|
|
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
|
|
{
|
|
InteractionManager.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);
|
|
}
|
|
}
|
|
|