我有我的手预制连接到播放器预制作为一个孩子。我想在我的手预制(球员的孩子)产卵枪预制。这样我就可以从手的高度做这个了吗?
目前我正在从手中产生枪,但它只在单人身上起作用。当我和两个玩家一起玩的时候,在产生一把枪的时刻。客户端的游戏崩溃。这是我得到的错误:
NullReferenceException: Object reference not set to an instance of an object
UnityEngine.Networking.NetworkServer.SpawnWithClientAuthority (UnityEngine.GameObject obj, UnityEngine.Networking.NetworkConnection conn) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1565)
HandHolder.CmdGetGun () (at Assets/Scripts/HandHolder.cs:27)
HandHolder.Update () (at Assets/Scripts/HandHolder.cs:19)这就是我的手工代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class HandHolder : NetworkBehaviour {
[SerializeField] GameObject gun;
private GameObject playerGun;
// Update is called once per frame
void Update () {
if(GetComponentInParent<NetworkIdentity>().isLocalPlayer)
{
if (playerGun)
{
playerGun.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - 1);
playerGun.transform.rotation = transform.rotation;
}
else if (Input.GetKeyDown(KeyCode.I))
{enter code here
CmdGetGun();
}
}
}
// [Command]
public void CmdGetGun()
{
playerGun = Instantiate(gun, transform.position, transform.rotation) as GameObject;
NetworkServer.SpawnWithClientAuthority(playerGun, GetComponentInParent<NetworkIdentity>().connectionToClient);
}
}
当我在CmdGetGun()方法之前添加命令时,在产生枪的瞬间我得到了这个错误:
There is no NetworkIdentity on this object. Please add one.
UnityEngine.Networking.NetworkBehaviour:get_isServer()
HandHolder:CallCmdGetGun()
HandHolder:Update() (at Assets/Scripts/HandHolder.cs:19)但是当我将NetworkIdentity添加到我的孩子手预置中时,它告诉我hasAuthority,isLocalPlayer对于手和玩家都是假的。
我不知道我怎么才能在手中预制的枪。
以下是组件和树:

发布于 2018-10-18 09:23:18
你的网络对象是你的播放器,所以你需要通过你的播放器路由你的网络功能。
在player类中调用CmdGetGun()*,然后从那里调用它。
*CmdGetGun()不应为命令
或者,您可以将CmdGetGun作为命令调用,但这样您就不需要网络实例化,而只需要本地实例化(该命令将称为所有客户端,因此所有客户端都将在本地创建枪)。
编辑
CmdGetGun将在所有客户机上创建该对象,但它不会像您期望的那样将其设置为父对象。您可能应该尝试我提到的第二种方法(将其作为命令调用,但在本地实例化)
https://stackoverflow.com/questions/52865527
复制相似问题