- 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);
  }
 }
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                