- Home /
How to spawn a multiplayer non-player prefab object and sync with all clients?
I'm trying to spawn an explosion prefab on all clients when a user's bullet hits any object.
I think this approach is close but I just can't seem to get the right mix:
Player creates bullet instance with NetworkServer.SpawnWithClientAuthority(bullet, connectionToClient);
Bullet collides with any object
On the Bullet collision, the Bullet object sends a [Command] to the server to spawn the explosion prefab( linked GameObject on each Bullet object), which then gets sent to all clients and runs in the [ClientRpc] function.
Use unspawnHandler to clean up the explosion prefab after the bullet hits and the explosion particle is done playing.
Here’s my setup:
I have registered the bullet prefab and explosion prefab in the NetworkManager Registered Spawnable Prefabs list.
I have added a NetworkIdentity (w/LocalPlayerAuthority)+NetworkTransform(Rigidbody3d) to the Bullet prefab.
I have added a NetworkIdentity(w/LocalPlayerAuthority)+NetworkTransform(transform) to the Explosion prefab.
What’s the best way to do this? Several Possibilities:
Register Explosion prefabs using ClientScene.RegisterPrefab (https://docs.unity3d.com/ScriptReference/Networking.ClientScene.RegisterPrefab.html)
Have the Bullet collision event call a regular function on the Player who then can send a [Command] to the server
Use AssignClientAuthority instead of SpawnWithClientAuthority
Use a CustomNetworkManager to send ClientRpc command to spawn explosion on each client
Use a SyncVar to sync the explosion transform info to each client and have each client spawn a new explosion with the syncvar info.
I have studied this diagram and still can’t figure out what I’m doing wrong: https://docs.unity3d.com/Manual/UNetActions.html
This seems like a regular scenario so I’m hoping it’s something others have experienced before. Any help would be awesome!
The bullet script looks like this:
// Bullet.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Bullet : NetworkBehaviour {
public GameObject explosionPrefab; // This is the prefab object so we can register as a network object
void OnCollisionEnter(Collision collision) {
GameObject hit = collision.gameObject;
// Play explosion at the point of the hit
CmdExplosion(hit);
}
[Command] // want to send a command, but the bullet is a non-player object, so we need to use ClientAuthority
public void CmdExplosion(GameObject hitLocation) {
GameObject explosion = (GameObject)Instantiate(explosionPrefab, hitLocation.transform.position, hitLocation.transform.rotation);
NetworkServer.SpawnWithClientAuthority(explosion, base.connectionToClient);
}
}