I am working on a little Networking Game with Unity and NetCode (mainly for learning purposes).
- I have a NetworkObject, with my NetworkPlayerControl-script attached. This one is set in the NetworkManager as 'Player Prefab'
- I have a NetworkObject, with my NetworkPlayableCharacterControl-script attached. This one is registered under all the network objects.
The problem is that it works on the server, but not on the client. ChatGPT proposed me a lot of solutions, but they were in vain. On the client I receive UnityEngine.Debug:LogError (object) Assets.Scripts.Network.NetworkPlayableCharacterControl:MoveCharacterServerRpc (UnityEngine.Vector3) (at Assets/Scripts/Network/NetworkPlayableCharacterControl.cs:21) Assets.Scripts.Network.NetworkPlayerControl:HandleMovement () (at Assets/Scripts/Network/NetworkPlayerControl.cs:33) Assets.Scripts.Network.NetworkPlayerControl:Update () (at Assets/Scripts/Network/NetworkPlayerControl.cs:25) as an error.
Can someone help me out?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity.Netcode;
using UnityEngine;
namespace Assets.Scripts.Network
{
public class NetworkPlayerControl : NetworkBehaviour
{
public NetworkPlayableCharacterControl PlayableCharacterTemplate;
public NetworkObject characterObject;
private void Start()
{
Debug.Log($"Is Owner? {IsOwner}");
Debug.Log(NetworkManager.LocalClientId);
if (!IsOwner) return;
SpawnPlayableCharacterServerRpc();
}
private void Update()
{
if (!IsOwner) return;
HandleMovement();
}
private void HandleMovement()
{
if (characterObject == null) return;
var moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
if (moveDir == new Vector3(0, 0, 0)) return;
if (characterObject.TryGetComponent<NetworkPlayableCharacterControl>(out var character))
character.MoveCharacterServerRpc(moveDir);
}
[ServerRpc(RequireOwnership = true)]
public void SpawnPlayableCharacterServerRpc()
{
GameObject go = Instantiate(PlayableCharacterTemplate.gameObject, Vector3.zero, Quaternion.identity);
characterObject = go.GetComponent<NetworkObject>();
characterObject.Spawn();
characterObject.ChangeOwnership(NetworkManager.LocalClientId);
AssignCharacterClientRpc(characterObject.NetworkObjectId);
}
[ClientRpc]
public void AssignCharacterClientRpc(ulong networkObjectId) => characterObject = NetworkManager.SpawnManager.SpawnedObjects[networkObjectId];
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Network
{
public class NetworkPlayableCharacterControl : NetworkBehaviour
{
[SerializeField] private float MoveSpeed = 3f;
[ServerRpc]
public void MoveCharacterServerRpc(Vector3 moveDir)
{
if (moveDir == Vector3.zero) return;
transform.position += Time.deltaTime * MoveSpeed * moveDir;
transform.LookAt(transform.position + 5 * moveDir);
}
}
}
I already tried to work with a ClientRpc on the NetworkPlayableCharacterControl, but to no avail