В настоящее время я изучаю, как все это работает в единстве. В моем коде я создаю космический корабль из нескольких сборных блоков.Unity Нерест ребенка с полномочиями клиента
Все начинается с одного Hardpoint
. A Hardpoint
может содержать один объект, который будет создан позже в цикле.
В 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
Неверный. Это была моя первая догадка, но первый компонент, который должен быть порожден, действительно порождается, другие - нет. Я выложу скриншот через минуту. –
, если вы нерестились отдельно, поэтому назначьте отдельно –
Извините, посмотрите на это неправильно. Обновлено, но, к сожалению, проблема сохраняется. –