具有客户端权限的UNET对象池(C#)

时间:2018-04-24 13:47:56

标签: c# unity3d-unet

我正在制作一个语音控制的多人RTS。我已经设法通过网络获得产生和正确行为的基础。现在我正在尝试在我正在工作的第一个单元,士兵中生成一种方法。为了让它运行得更快我试图使用对象池,但是士兵产生的唯一时间是主机连接时它们也只存在于主机中。

这是我的产卵代码

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;
    }

}

任何帮助将不胜感激!因为我还是Unet的新手,如果我这么做的话,我不会感到惊讶。

0 个答案:

没有答案