Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 产卵预制在命令中_Unity3d - Fatal编程技术网

Unity3d 产卵预制在命令中

Unity3d 产卵预制在命令中,unity3d,Unity3d,我对在unity中制作多人游戏很陌生。我试图在一个玩家身上产生一个子弹预置,我的问题是,我是否必须产生我的预置,即使它是服务器上使用命令的客户端子弹 [Command] void InstantiateHook() { bullet = Instantiate(bulletPrefab, this.transform.position, Quaternion.identity); NetworkServer.Spawn(bullet ); } 或 我可以用一个普通函数在播放器脚

我对在unity中制作多人游戏很陌生。我试图在一个玩家身上产生一个子弹预置,我的问题是,我是否必须产生我的预置,即使它是服务器上使用命令的客户端子弹

[Command]
void InstantiateHook()
{
    bullet = Instantiate(bulletPrefab, this.transform.position, Quaternion.identity);
    NetworkServer.Spawn(bullet );
}

我可以用一个普通函数在播放器脚本中生成它吗

void InstantiateHook()
{
    bullet = Instantiate(bulletPrefab, this.transform.position, Quaternion.identity);
    NetworkServer.Spawn(bullet );
}
权威 了解Unity多人游戏中的权威是很重要的。作为客户机,默认情况下,您唯一拥有权限的是您的本地播放机发送命令。必须通过服务器向客户端授予任何权限。服务器是上帝,默认情况下对一切都有权威

网络身份 理解服务器和客户机的通信方式也很重要。每个对象(联网)都有一个网络标识,标识网络中的一个对象。标识此对象的主要数字是一个称为netID的无符号整数。此netID是一个唯一标识符,在所有客户端中都是一致的。例如,如果我们有播放器A、播放器B和一个项目符号,那么播放器A的netID可能为0,并且该ID在包括服务器在内的每个客户端上都是一致的。这样,如果我从播放器a调用命令来更改播放器中的变量,它就会知道我这样做是因为netID

网络层次结构 现在我们了解了基本的网络同步和权限,我们就可以了解网络游戏的基本层次结构。每个联网的对象都由每个客户端和服务器共享(与前面所述的netID相同)。例如,如果我们想要生成一个项目符号,我们需要服务器为一个对象分配一个netID,并将该项目符号分发到所有客户端。现在我们有了一个具有一致netID的bullet游戏对象,它完全同步,因为这个对象是在服务器和客户端上实例化的

命令的工作原理 当我们在播放器对象上调用命令时,请记住该播放器对象位于每个客户端和服务器上。因此,当我们调用一个命令时,这个函数不再在客户端播放器对象上运行,而是在服务器播放器对象上运行。这是关键,因为这就是为什么我们拥有如此高的权威

NetworkServer.Spawn 因此,在您的情况下,我们需要首先调用一个命令,这将为我们提供访问服务器的权限。完成此操作后,我们需要调用一个函数来实例化一个项目符号,而UNet/Mirror应该通过NetworkServer.Spawn自动执行此操作

因此,您的代码应该类似于

//播放器脚本中的某个地方
公共游戏对象公告//在unity inspector中将其指定为子弹预制件
[命令]
私有void cmdbullet(){
GameObject myNewBullet=实例化(bulletPrefab);//在服务器上创建新的项目符号
//现在我们在服务器上有了一个项目符号,让我们也在要同步的客户端上生成它
NetworkServer.Spawn(myNewBullet);//第二个参数是可选的,这是要向其分配权限的网络连接。在这种情况下,服务器可能具有权限,因为如果客户端拥有对项目符号的权限,黑客攻击将非常容易。
}
私有void更新(){
如果(!isLocalPlayer)返回;//则不希望任何其他客户端为您的播放机运行此命令
if(Input.GetMouseButtonDown(0)){
cmdspawnbill();//单击主点火按钮时生成子弹
}
}
此脚本将在所有客户端上生成一个项目符号。这颗子弹当然不会起什么作用,但那是为了你自己的游戏欲望:)

还有一个我忘了加的便条。无法从没有权限的对象调用命令。例如,如果您是一名玩家,并且有一个服务器有权限的项目符号,那么您不能从该项目符号调用命令,因为您没有权限。除非在属性中添加requireAuthority=false标记