Prefab Move on the Host Side but Not On the Client (Unity Netcode)

unity version : 2023.2.3f1
netcode version : 1.7.1

prefab on the Scriptable Object has a Network object,network transfom and rigidbody

the client can spawn the prefab but the prefab can’t move.
but on the host he can spawn the prefab and the prefab can move
and the movement btw it synced.

I tried to write the movement of the prefab on the prefab it self OnNetworkSpawn() method but the same thing happened .

I have another script responsible of interacting with object and grabbing them and it’s working fine on both sides.

using System.Collections.Generic;
using UnityEngine;
using System;
using Unity.Netcode;
public class ShootingSystem : NetworkBehaviour
{
    [SerializeField] private Transform startPointTransform;
    [SerializeField] private List<Weapon_SO> weapon_SOs = new List<Weapon_SO>();
    [SerializeField] private float rangeModefier = 10;
    
    private int weaponIndex = 0;
    [Range(0f,1f)]
    private float holdTime = 0;
    
    private void Update()
    {
        if (!IsOwner) return;
        if (InputsData.IsShootingStarted())
        {
            //start counting the holding time
            if (holdTime <= 1)
                holdTime += Time.deltaTime;

        }else if (InputsData.IsShootingReleased())
        {
            //shoot
            SpawnAndMovePrefabOnServerRpc(startPointTransform.position, Quaternion.identity);

            holdTime = 0;
        }
    }
    [ServerRpc]
    private void SpawnAndMovePrefabOnServerRpc(Vector3 pos, Quaternion rot)
    {
        GameObject InstantiatedObject = Instantiate(weapon_SOs[weaponIndex].projectilePrefab, pos, rot);
        NetworkObject networkObject = InstantiatedObject.GetComponent<NetworkObject>();
        networkObject?.Spawn();

        Move(networkObject.NetworkObjectId);
        Destroy(InstantiatedObject, 3f);
    }
    void Move(ulong id)
    {

        Transform cameraPosition = GetComponentInChildren<Camera>().transform;
        Vector3 moveDirection = (cameraPosition.up * weapon_SOs[weaponIndex].upModefier + cameraPosition.forward * weapon_SOs[weaponIndex].forwadModefier)
            * weapon_SOs[weaponIndex].range * rangeModefier * holdTime;

        GetNetworkObject(id)?.GetComponent<Rigidbody>().AddForce(moveDirection);
    }
}



I Solved this By making the mvt exacted on the ball when instantiated by a script that is attached to the ball prefab :
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
public class PrefabsMoving : NetworkBehaviour
{
[SerializeField] private float rangeModefier = 100;
[SerializeField] private List<Weapon_SO> weapon_SOs = new List<Weapon_SO>();

public override void OnNetworkSpawn()
{
    Vector3 moveDirection = (transform.up * weapon_SOs[ShootingSystem.weaponIndex].upModefier + transform.forward * weapon_SOs[ShootingSystem.weaponIndex].forwadModefier)
        * weapon_SOs[ShootingSystem.weaponIndex].range * rangeModefier;

    GetComponent<Rigidbody>().AddForce(moveDirection);
}

}