2016-05-22 12 views
1

Итак, я создаю игроков, а не оружие, которое у них есть, на хосте он отлично работает, но на клиентских пушках не становится экземпляром объекта. Вот кодКлиент Unity Multiplayer неправильно устанавливает родителя для порожденного объекта

[Command] 
void CmdSpawn() { 
    gun = (GameObject)Instantiate(gunToEquip, weaponPosition.position, weaponPosition.rotation); 

    NetworkServer.SpawnWithClientAuthority(gun, connectionToClient); 
    gun.transform.parent = weaponPosition; 
} 

ответ

1

Прежде всего, вы не устанавливаете родителя на клиенте. Только на сервере. Хост - это сервер и клиент одновременно, поэтому он работает. Во-вторых - вы перетащили пистолет в слот для нерегулярных сборщиков сетевых менеджеров?

Кроме того, я полагаю, вы не должны делать это так:

gun.transform.parent = weaponPosition; 

использовать вместо:

gun.transform.SetParent(weaponPosition); 

Попробуйте это:

[Command] 
void CmdSpawn() 
{ 
    gun=(GameObject)Instantiate(gunToEquip,weaponPosition.position,weaponPosition.rotation); 
    gun.transform.SetParent(weaponPosition); 
    RpcSpawn(); 
} 

[ClientRpc] 
void RpcSpawn() 
{ 
    if(NetworkServer.active) return; 
    gun = (GameObject)Instantiate(gunToEquip, weaponPosition.position, weaponPosition.rotation); 
    gun.transform.SetParent(weaponPosition); 
} 
+0

Да я вытащил пистолет сборного в spawnable префабы сетевого менеджера, так как сделать это икру на клиенте тоже? – user2088880

+0

О, это вообще нерест? Попробуйте NetworkServer.Spawn (gun); –

+0

Прошу прощения, это было глупо, как заставить его появляться на клиенте как дочерний элемент weaponPosition, потому что он появляется, но просто остается в середине карты для игрока на клиенте, а хост делает это правильно – user2088880

1

Это, кажется, дубликат от Unity 5.1 Networking - Spawn an object as a child for the host and all clients

Обсуждаемая идея заключается в синхронизации идентификатора сети родительского объекта, например. на стороне сервера, а нерест:

var gun = Instantiate (...); 
gun.parentNetId = this.netId; 
NetworkServer.Spawn (gun); 

И позже на клиентах:

// GunController.cs 
[SyncVar] 
public NetworkInstanceId parentNetId; 

public override void OnStartClient() 
{ 
    GameObject parentObject = ClientScene.FindLocalObject(parentNetId); 
    transform.SetParent(parentObject.transform); 
}