c# - 具有客户端权限的 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# - 网络上的 C# 列表与字节数组效率
- javascript - 是否可以创建数百个 p5 画布?
- swift - 如何获取包含对 Swift 5 中另一个文档的引用的 Firestore 文档?
- spring - 如何使用spring boot有效地处理来自api调用的http响应
- mysql - 整列Mysql的位置
- python - 当小数点分隔符不是“。”时,读取 CSV 时不会引发错误
- javascript - GoogleAds 转化 - 多个网络请求 - 有什么用?
- c# - 通过查询参数处理 .NET Core 3.1 Web API 中的多个端点
- html - 如何从中心而不是左上角展开 div
- c++ - 无法启动 QTcp 服务器