Unity: Not able to get control over an owned Network Object when connected as a client

425 views Asked by At

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

0

There are 0 answers