2016-06-27 78 views
1

我試圖讓我的遊戲中的客戶購買物品並讓這些物品通過網絡產生。爲此,我使用兩個腳本,一個播放器上的腳本和一個購買項目按鈕上的腳本。我知道NetworkServer.Spawn()只能在服務器上調用,所以我在我的播放器腳本上創建了一個命令函數來產生我的項目,而不是在購買項目腳本上進行。但是,當使用此工作時,我得到一個NullReferenceException錯誤說我傳遞的參數爲null。爲什麼參數爲空?從客戶端發送到服務器時,參數變爲空

購買物品腳本代碼:

void BuyItemAndSubtractGold(){ 
    GameObject item = SearchForItem(); 
    int cost = item.GetComponent<ItemManager_ItemStats>().item.buyValue; 
    if (item.GetComponent<ItemManager_ItemStats>() != null && storeMaster.gold >= cost) { 
     GameObject newItem = (GameObject)Instantiate (item); 
     playerMaster.CmdSpawnOnServer (newItem); 
     newItem.transform.parent = playerInventory.transform; 
     newItem.SetActive (false); 
     Vector3 gunPosition = newItem.GetComponent<ItemManager_ItemPickup>().gunPositions [0]; 
     newItem.transform.localPosition = gunPosition; 
     newItem.transform.rotation = Quaternion.Euler(itemThrow.originalRotation); 
     storeMaster.gold -= cost; 
     audioSource.clip = boughtItem; 
     audioSource.Play(); 
     storeMaster.CallEventUpdateUI(); 
     sellInventory.LoadInventory(); 
     playerMaster.CmdCallEventInventoryChanged(); 
    } else { 
     noGold.SetActive (true); 
     StartCoroutine (wait5sec()); 
    } 
} 

播放器的腳本代碼:

[Command] 
public void CmdSpawnOnServer(GameObject item){ 
    print (item != null); 
    NetworkServer.Spawn (item); 
} 

錯誤 enter image description here

+1

您可能會注意到當系統進入尋找'NetworkIdentity'分量'NullReferenceException'發生。它看起來像你試圖繞過客戶機 - 服務器體系結構,但這可能不是一個好方法。建議檢查教程結束。 – rutter

+0

@rutter你能推薦我一個很好的教程嗎? –

回答

1

的圖片好像你正在試圖通過一個命令發送一個遊戲對象。能夠通過命令,clientrpc和syncvar發送的參數僅限於某些類型,並且gameobject似乎不是其中之一。這樣做的替代方法是使用受支持的類型(如int來指定項目標識)或創建用戶定義的值類型(結構)。傳遞變爲空的參數似乎是由於命令不支持將遊戲對象作爲參數的事實。因此,您應該通過支持的類型發送值以解決錯誤。例如,您可以創建一個包含項目gameobjects數組的類,然後使用指定所需遊戲對象索引的整數發送該命令;然後使用發送的整數值來檢索所需的物品gameobject。

上有效類型的更多信息,請訪問: http://answers.unity3d.com/questions/1001474/unet-parameter-restrictions-for-command-and-client.html

+0

難道我仍然不得不使用syncvars來確保我將使用整數檢索的gameobjects存在於客戶端和服務器中嗎? –

+0

在您向我提供的鏈接中使用該方法時,networkID已成功發送,但每次嘗試使用ClientScene.FindLocalObject(itemID)或NetworkServer.FindLocalObject(itemID)訪問遊戲對象時,都會收到空引用異常。 –

+0

迴應你的第一條評論 - 不,你不會。您可以保留一個腳本(在客戶端和服務器版本上),該腳本包含一個包含gameobject項目的數組。由於這將在服務器和客戶端版本上(它可能只是一個空白的遊戲對象,附帶了列表腳本),您不需要檢查客戶端和服務器上是否存在項目 - 唯一需要的時候,如果武器是通過遊戲玩法動態創建的(它們很可能不是 - 如果是這種情況,則可以發送更多數據或使用用戶定義的結構)。 – user3210251

相關問題