5

Birden çok silahı kullanabilen bir oyuncu nesnesine sahibim. Bir silah donatıldığında, onun dönüşümü ebeveyninin eline ayarlanır. Bir süredir bununla uğraştım ve hem ev sahibi hem de müşteri için işe yaramayacağım. Şu anda silahı sunucuya takmaya çalışıyorum ve tüm müşterilere ebeveynlerinin dönüşümünü ayarlamasını söylüyorum.Unity 5.1 Ağ - Ana makine ve tüm istemciler için bir nesne olarak bir nesne oluştur

public NetworkInstanceId weaponNetId; 

    [Command] 
    void Cmd_EquipWeapon() 
    { 
     var weaponObject = Instantiate (Resources.Load ("Gun"), 
             hand.position, 
             Quaternion.Euler (0f, 0f, 0f)) as GameObject; 

     weaponObject.transform.parent = hand; 

     NetworkServer.Spawn (weaponObject); 

     //set equipped weapon 
     var weapon = weaponObject.GetComponent<Weapon>() as Weapon; 

     weaponNetId = weaponObject.GetComponent<NetworkIdentity>().netId; 
     Rpc_SetParentGameobject (weaponNetId); 
    } 

    [ClientRpc] 
    public void Rpc_SetParentGameobject(NetworkInstanceId netID) 
    { 
     weaponNetId = netId; 
    } 

Ve güncellemede ben silah bu sadece almaya çalışıyorum şu anda this..but yapmanın en iyi duruma yol değildir biliyorum

void Update() { 

    // set child weapon tranform on clients 
    if (!isServer) { 
     if (weaponNetId.Value != 0 && !armed) { 
      GameObject child = NetworkServer.FindLocalObject (weaponNetId); 


      if (child != null) { 
       child.transform.parent = hand; 
      } 
     } 
    } 

dönüşümü güncelleştiriyorum Bu, herhangi bir şekilde çalışmak ve daha sonra onu düzeltmek için çalışmak. Basit bir görev olmalı gibi görünüyor.

cevap

10

Çok oyunculu oyunumuzda da benzer bir şey yapıyoruz. Çalışmak için yapmanız gereken birkaç şey var. İlk olarak, aşağıdaki gibi:

Bulunduğunuz gibi ağdaki ana bilgisayarı sunucu üzerinde ayarlama önemsizdir. Basitçe, dönüşümün ebeveyni, normalde Unity'de yaptığınız gibi ayarlayın. Ancak, bu nesneyi sunucuda NetworkServer.Spawn ile ürettikten sonra, daha sonra sahnenin kökündeki istemcilerde ortaya çıkar (yumurtlanan prefabrikin dışındaki hiyerarşi senkronize edilmez).

Bu yüzden öneririm istemci üzerinde hiyerarşi ayarlamak için:

  • sunucu ile istemci arasındaki üst nesnenin NetID eşitlemek için bir SyncVar kullanın.
  • Nesne, istemci üzerinde oluşturulduğunda, senkronize edilmiş netifi kullanarak üst öğeyi bulun ve bunu dönüştürücünüzün üst öğesi olarak ayarlayın.

nedenle, böyle bir şey bakmak için kodunuzu ayarlamak olacaktır. Öncelikle, onu doğurmadan önce ana karası netId'yi ayarlayın. Bu, istemcilerde oluşturulduğunda netId'nin ayarlanmasını sağlayacaktır.

[Command] 
void Cmd_EquipWeapon() 
{ 
    var weaponObject = Instantiate (Resources.Load ("Gun"), 
            hand.position, 
            Quaternion.Euler (0f, 0f, 0f)) as GameObject; 
    weaponObject.parentNetId = hand.netId; // Set the parent network ID 
    weaponObject.transform.parent = hand; // Set the parent transform on the server 

    NetworkServer.Spawn (weaponObject); // Spawn the object 
} 

Ve sonra silah sınıfında

:
  • bir parentNetId özellik ekleyin.
  • Sunucu ve istemci kopyaları arasında eşitleme yapabilmesi için [SyncVar] olarak işaretleyin.
  • Bir istemcide oluşturulduğunda, netId öğesini kullanarak üst nesneyi bulun ve bunu dönüştürücümüzün ebeveyine ayarlayın.

Belki böyle bir şey:

[SyncVar] 
public NetworkInstanceId parentNetId; 

public override void OnStartClient() 
{ 
    // When we are spawned on the client, 
    // find the parent object using its ID, 
    // and set it to be our transform's parent. 
    GameObject parentObject = ClientScene.FindLocalObject(parentNetId); 
    transform.SetParent(parentObject.transform); 
} 
+0

Bu yöntemi kullanmaya çalışıyorum. netId’in değişmesinin bir nedeni var mı? Ben sadece 'OnStartClient' örneğinde olduğu gibi onu ayarlıyorum. –

+0

Bunun böyle yapılacağına inanamıyorum .. lanet olası! –

+0

Düzenlememi neden geri aldınız? Kodunuzun okunması için kodunuzu daha iyi hale getirdiğini vurguladım. – derHugo

4

Bu yazı gerçekten yararlı buldum ama küçük bir zeyilname var.

NetId, hiyerarşinin kökü üzerinde olacak ve bu nedenle, hiyerarşiyi transform.Find kullanarak hiyerarşiden geçebildiğinizi bilmek faydalı olacaktır.

Böyle bir şey ..

GameObject parentObject = ClientScene.FindLocalObject(parentNetId); 
    string pathToWeaponHolder = "Obj/targetObj"; 

    transform.SetParent(parentObject.transform.Find(pathToWeaponHolder)); 
0

Andy Barnard'ın çözümünü okuduktan sonra, bu biraz değiştirilmiş çözümle ortaya çıktım. SyncVar yerine, sunucu için bir istemci RPC'si var, NetworkIdentity ebeveynleri değiştirmeye ihtiyaç duyuyor. Bu, ebeveynin ayrıca bir NetworkIdentity (kayıtlı bir prefabrik olmasına gerek olmamasına rağmen) olmasını gerektirir.

public void Server_SetParent (NetworkIdentity parentNetworkIdentity) { 
    if (parentNetworkIdentity != null) { 
     // Set locally on server 
     transform.SetParent (parentNetworkIdentity.transform); 
     // Set remotely on clients 
     RpcClient_SetParent (parentNetworkIdentity.netId, resetTransform); 
    } 
    else { 
     // Set locally on server 
     transform.SetParent (null); 
     // Set remotely on clients 
     RpcClient_SetParent (NetworkInstanceId.Invalid, resetTransform); 
    } 
} 

[ClientRpc] 
void RpcClient_SetParent (NetworkInstanceId newParentNetId) { 
    Transform parentTransform = null; 
    if (newParentNetId != NetworkInstanceId.Invalid) { 
     // Find the parent by netid and set self as child 
     var parentGobj = ClientScene.FindLocalObject (newParentNetId); 
     if (parentGobj != null) { 
      parentTransform = parentGobj.transform; 
     } 
     else { 
      Debug.LogWarningFormat ("{0} Could not find NetworkIdentity '{1}'.", gameObject.name, newParentNetId.Value); 
     } 
    } 
    transform.SetParent (parentTransform); 
} 

Bu iki NetworkBehavior parçası, belli RequiresComponent(typeof(NetworkIdentity)) bulunmaktadır. İstemciden sunucuya bu davranışa gerçekten ihtiyacınız varsa, sunucunun genel yöntemini çağıran sunucuya NetworkIdentity'u ileten bir komut oluşturmanızı öneririm. Bir dizi ağ mesajı en iyiden fazla, ama meh.

İlgili konular