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