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.
 
 
 
 

134 lines
3.7 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);
}
public void SetPosition(Vector3 position)
{
if (!IsOwner) return;
movement.MoveTo(position);
transform.position = position;
}
}