1

I am making a speech controlled multiplayer RTS in unity. I have managed to get the bases to spawn and behave correctly across the network. Now I am trying to get a method to spawn in the first unit I am working on, the soldier. To make it run faster I am trying to use object pooling, however the only time the soldiers spawn is when the host connects and they only exist for the host as well.

Here is my spawning code

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 appreciated! As I am still new to unet, I would not be surprised if I was going about this all wrong.

Laurel
  • 5,965
  • 14
  • 31
  • 57
Damien W
  • 101
  • 1
  • 4

0 Answers0