- Home /
Question by
DAMO238 · Apr 30, 2018 at 07:55 AM ·
networkingobject pool
UNET object pooling with client authority
I am creating a voice controlled RTS in unity. The bases spawn fine (using them in as the player prefab in the network manager), but now I try to spawn in the soldiers using object pooling and they only appear on the host only if the host is the one to spawn in. Here is my code (Pool just has string key, GameObject prefab, and int size, all public):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
[RequireComponent(typeof(WatsonOutputInterpreter))]
public class SoldierSpawnerController : NetworkBehaviour {
/* [SerializeField]
private GameObject prefab;*/
private WatsonOutputInterpreter output;
[SerializeField]
private List<Pool> pools = new List<Pool> ();
private Dictionary<string, Queue<GameObject>> poolDictionary = new Dictionary<string, Queue<GameObject>> ();
void Start ()
{
Setup ();
}
void Setup ()
{
if (!isLocalPlayer)
return;
output = GetComponent<WatsonOutputInterpreter> ();
foreach (Pool pool in pools)
{
CmdSpawnObj (pool.prefab, pool.size, pool.key);
}
}
#region debug
void Update ()
{
if (Input.GetKeyDown (KeyCode.B) )
{
Debug.Log (poolDictionary.Count + " in the dictionary of pools");
}
}
#endregion
[Command]
void CmdSpawnObj (GameObject prefab, int size, string key)
{
GameObject[] objectPool = new GameObject[size];
for (int i = 0; i < size; i++)
{
GameObject obj = (GameObject)Instantiate (prefab);
obj.SetActive (false);
NetworkServer.Spawn (obj);
objectPool[i] = obj;
}
TargetSpawnObj (connectionToClient, objectPool, key);
}
[TargetRpc]
void TargetSpawnObj (NetworkConnection target, GameObject[] poolArray, string key)
{
Queue<GameObject> objectPool = new Queue<GameObject> ();
foreach (GameObject go in poolArray)
{
objectPool.Enqueue (go);
}
poolDictionary.Add (key, objectPool);
}
public void SpawnFromPool (string key, Vector3 pos, Quaternion rot)
{
if (!isLocalPlayer)
return;
if (!poolDictionary.ContainsKey (key) )
{
Debug.LogWarningFormat ("No pool with key: {0} found in dictionary of pools", key);
return;
}
GameObject objectSpawn = poolDictionary [key].Dequeue ();
CmdSpawnFromPool (objectSpawn, pos, rot);
poolDictionary [key].Enqueue (objectSpawn);
output.AddSoldierMover (objectSpawn.GetComponent<SoldierMover> ());
}
[Command]
void CmdSpawnFromPool (GameObject objectSpawn, Vector3 pos, Quaternion rot)
{
RpcSpawnFromPool (objectSpawn, pos, rot);
}
[ClientRpc]
void RpcSpawnFromPool (GameObject objectSpawn, Vector3 pos, Quaternion rot)
{
objectSpawn.SetActive (true);
objectSpawn.transform.position = pos;
objectSpawn.transform.rotation = rot;
}
}
Any help would be greatly appreciated!
Comment
Your answer
Follow this Question
Related Questions
Unity networking tutorial? 6 Answers
How to abort UnityWebRequest when exiting play mode? 0 Answers
Text object can't be searched for with GameObject.Find 3 Answers
Sending image data through SyncVar doesn't work (Mirror Networking) 0 Answers
[UNet] Best practice to cache components in NetworkBehaviour 0 Answers