首页 > 解决方案 > 具有客户端权限的 UNET 对象池 (C#)

问题描述

我正在统一制作语音控制的多人 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 的新手,如果我做错了这一切,我不会感到惊讶。

标签: c#unity3d-unet

解决方案


推荐阅读