2016-06-27 83 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

相关问题