我目前正在学习整个网络是如何统一工作的。在我的代码中,我正在创建一个由多个预制件制成的宇宙飞船。
这一切都始于一个Hardpoint
. AHardpoint
可以保存单个对象,稍后将在循环中实例化该对象。
在PlayerController
(起点)我有这个代码来产生第一个对象,驾驶舱:
[Command]
void CmdOnConnect() {
string json = GameObject.Find("TestPlayer").GetComponent<ComponentObject>().ToJSON();
CompressedComponent compressedComponent = JsonUtility.FromJson<CompressedComponent>(json);
gameObject.GetComponent<Hardpoint>().Hold(GameObject.Find("Component Repository").GetComponent<ComponentRepository>().cockpit[compressedComponent.componentNumber]);
gameObject.GetComponent<Hardpoint>().SpawnComponent();
gameObject.GetComponent<Hardpoint>().RollThroughDecompression(compressedComponent);
Camera.main.GetComponent<PlayerCamera>().player = gameObject;
}
接下来是SpawnComponent()
位于Hardpoint
脚本中的代码:
public void SpawnComponent() {
Clear();
CmdSpawn();
}
CmdSpawn,也位于Hardpoint
:
[Command]
public void CmdSpawn()
{
Debug.Log("[COMMAND] Spawning " + holds.name);
heldInstance = Instantiate(holds, transform.position, transform.rotation) as GameObject;
heldInstance.transform.SetParent(transform);
NetworkServer.SpawnWithClientAuthority(heldInstance, transform.root.gameObject);
}
最后RollThroughDecompression
,它只是调用Decompress()
函数:
public void RollThroughDecompression(CompressedComponent c) {
heldInstance.GetComponent<ComponentObject>().Decompress(c);
}
只是为了不遗漏任何信息,Decompress()
:
public void Decompress(CompressedComponent c) {
componentType = (Type)Enum.Parse(typeof(Type), c.componentType);
componentNumber = c.componentNumber;
UpdateHardPoints();
GameObject[] typeRepository = GetRepository(componentType);
//update children
int point = 0;
foreach (Transform child in transform)
{
Hardpoint hardpoint = child.GetComponent<Hardpoint>();
if (hardpoint != null) {
if (c.hardpoints[point] != null) {
//get the hardpoint's repository
GameObject[] hardpointRepo = GetRepository((Type)Enum.Parse(typeof(Type), c.hardpoints[point].componentType));
//set the hardpoint to hold this object
hardpoint.Hold(hardpointRepo[c.hardpoints[point].componentNumber]);
hardpoint.SpawnComponent();
hardpoint.RollThroughDecompression(c.hardpoints[point]);
point++;
}
}
}
}
抱歉,代码有点混乱/令人困惑,但我一直在努力弄清楚为什么新生成的对象client authority
除了生成的第一个对象之外没有(可能是因为它是从 调用的PlayerController
)。我已经被这个问题困扰了好几天了。新生成的对象被设置为本地玩家对象的子对象,甚至NetworkServer.SpawnWithClientAuthority
在测试时生成:
Trying to send command for object without authority.
打电话时CmdSpawn()
。
我得到的结果:
如您所见,驾驶舱(第一部分)按预期生成。但安装在上面的零件Hardpoints
没有。澄清一下EmptyHardpoint
,就是这样。一个没有子节点的硬点,只是一个带有hardpoint
脚本playercontroller
并附加到它的空游戏对象。img
驾驶舱预制件还包括hardpoints