Search code examples
unity-game-enginemultiplayer

How do you spawn a gameobject in netcode?


So I'm trying to implement shooting in a multiplayer game. I want to spawn a bullet out of a weapon. On the server side it works, but as I shoot as a client it says [Netcode] Behaviour index was out of bounds. Did you mess up the order of your NetworkBehaviours?.

The bullet is a prefab which I included in NetworPrefabs. The prefab also has a Network Object component.

This is where I call shoot()

if(shot == false && transform.GetChild(0).GetComponent<Weapon>().bulletInMag > 0 && reloading == false)
        {
            shot = true;
            StartCoroutine(shoot());
        }

This is what shoot() does

IEnumerator shoot()
{
    firePoint = transform.GetChild(0).GetChild(0).transform;
    weapon = transform.GetChild(0).gameObject.GetComponent<Weapon>();
    if (weapon.threeShot)
    {
        for(int i=0; i<3; i++)
        {
           if(NetworkManager.Singleton.IsServer)
            {
                spawnBullet();
            } else
            {
                spawnBulletServerRpc();
            }
            weapon.bulletInMag -= 1;
            SharedFunctions.Instance.updateAmmoCount();
            yield return new WaitForSeconds(0.2f);
        }
        yield return new WaitForSeconds(weapon.shootingIntervall);
        shot = false;
    }
    else
    {
        if (NetworkManager.Singleton.IsServer)
        {
            spawnBullet();
        }
        else
        {
            spawnBulletServerRpc();
        }
        weapon.bulletInMag -= 1;
        SharedFunctions.Instance.updateAmmoCount();
        yield return new WaitForSeconds(weapon.shootingIntervall);
        shot = false;
    }
}

void spawnBullet()
{
    GameObject bullet = Instantiate(prefabBullet, firePoint.position, transform.rotation);
    bullet.GetComponent<Rigidbody2D>().AddForce(firePoint.up * weapon.bulletSpeed, ForceMode2D.Impulse);
    bullet.GetComponent<NetworkObject>().Spawn();
}

[ServerRpc]
void spawnBulletServerRpc()
{
    spawnBullet();
}

I'm thankful for any help.


Solution

  • I finally fixed the issue. The error [Netcode] Behaviour index was out of bounds. Did you mess up the order of your NetworkBehaviours? basically means that there is a mismatch between server and client representation of a network object.

    At the beginning of my Player script I wrote:

    public override void OnNetworkSpawn()
        {
            if (!IsOwner) Destroy(this);
        }
    

    which deletes the component if your not the owner. So when I joined I had the script on client side but it wasn't there on server side. So when I tried to make an ServerRpc it didn't know where to send it. The same goes for ClientRpc. A very helpful source was the Unity Mulitplayer Networking Discord: https://discord.gg/buMxnnPvTb