RuntimeMapMaker3D-Pro
英文原文:
https://mirror-networking.gitbook.io/docs/components/networkbehaviour
NetworkBehaviour 脚本适用于具有网络身份组件的游戏对象。这些脚本可以执行高级 API 功能,例如 Commands、ClientRpc 和 SyncVars。
不要在 Awake 中放入 DontDestroyOnLoad (DDOL) 。
您可以改为在 Start 中执行此操作。
使用 Mirror 的服务器权威系统,服务器必须使用 NetworkServer.Spawn 函数来生成具有网络身份组件的游戏对象。以这种方式生成它们会为它们分配一个 netId 并在连接到服务器的客户端上创建它们。
注意:这不是您可以直接添加到游戏对象的组件。相反,您必须创建一个继承自 NetworkBehaviour(而不是默认的 MonoBehaviour)的脚本,然后您可以将您的脚本作为组件添加到游戏对象中。
isServer
如果此游戏对象已生成,则在服务器上下文中返回 true。
isClient
如果此游戏对象已由服务器生成,则在客户端上下文中返回 true。
isLocalPlayer
如果此游戏对象代表为此客户端创建的玩家,则在客户端上返回 true。
hasAuthority
如果此客户端对此游戏对象具有权限,则在客户端上返回 true。它在服务器上下文中毫无意义。
netId
此游戏对象的唯一网络 ID。服务器在运行时分配它。它对于网络上的所有游戏对象都是唯一的。
netIdentity
返回此对象的网络标识
connectionToServer
与附加到此游戏对象的网络身份组件关联的网络连接。这仅对客户端上的本地player对象有效,对于客户端上可能存在的其他player对象为空。
connectionToClient
与附加到此游戏对象的网络身份组件关联的网络连接。这对于服务器上已分配给特定客户端的游戏对象有效,例如玩家对象、宠物、追随者或单个客户“拥有”的其他对象。
Network Behaviour 脚本具有以下功能:
有内置的回调函数,可在Network Behaviour 脚本上针对各种网络事件调用。这些是基类上的虚函数,因此您可以在自己的代码中覆盖它们,如下所示:
public class SpaceShip : NetworkBehaviour
{
public override void OnStartServer()
{
// disable client stuff
}
public override void OnStartClient()
{
// register client events, enable effects
}
}
内置回调是:
OnStartServer
当一个游戏对象在服务器上产生时,或者当服务器为场景中的游戏对象启动时,在服务器上调用。
OnStopServer
当服务器上的游戏对象被销毁时,或服务器因场景中的游戏对象而停止时在服务器上调用
OnStartClient
当游戏对象在客户端生成时或客户端连接到服务器以获取场景中的游戏对象时在客户端上调用
OnStopClient
当服务器销毁游戏对象时在客户端调用
OnStartLocalPlayer
在 OnStartClient 之后为本地客户端上的玩家游戏对象调用客户端
OnStopLocalPlayer
在 OnStopClient 之前为本地客户端上的玩家游戏对象调用客户端
OnStartAuthority
当服务器分配权限时在所有者客户端上调用。对于客户端上下文中的此类对象,hasAuthority 将为 true。
OnStopAuthority
当服务器删除权限时在所有者客户端上调用。
请注意,在对等托管设置中,当其中一个客户端同时充当主机和客户端时,OnStartServer 和 OnStartClient 都会在同一个游戏对象上调用。这两个函数对于特定于客户端或服务器的操作都很有用,例如抑制对服务器的影响或设置客户端事件。
您可以使用自定义属性标记 Monobehaviour 和 Network Behavior 脚本中的方法,以将它们指定为仅服务器或仅客户端功能。如果客户端不活动,[Server] 和 [ServerCallback] 立即返回。同样,如果服务器不活动,[Client] 和 [ClientCallback] 会立即返回。
[Server] 和 [Client] 属性不会生成编译时错误,但如果在错误的上下文中调用它们会发出警告日志消息。
ServerCallback 和 ClientCallback 属性的作用与上述相同,但不会导致生成警告。
要在服务器上执行代码,您必须使用命令。高级 API 是服务器权威系统,因此命令是客户端触发服务器上某些代码的唯一方式。
通常只有玩家对象可以具有命令,但是它们也可能存在于其他联网对象上,并且可以由具有分配给该对象的权限的客户端调用,或者由任何已明确指示绕过权限的客户端调用。
当客户端玩家游戏对象发送命令时,该命令会在服务器上相应的玩家游戏对象上运行。这种路由是自动发生的,因此客户端不可能为不同的玩家发送命令。
要在代码中定义命令,您必须使用 [Command] 属性装饰方法。虽然不是必需的,但强烈建议使用 Cmd 为方法名称添加前缀,以便在调用代码中更容易识别将发生的情况。
仅通过在客户端上正常调用方法来调用命令。它不是在客户端上运行的方法,而是在服务器上相应的玩家游戏对象上自动调用。
命令是类型安全的,具有内置的安全性和到player的路由,并为参数使用有效的序列化机制以快速调用它们。
客户端 RPC 调用是服务器游戏对象在客户端游戏对象上进行操作的一种方式。
客户端 RPC 调用不限于玩家游戏对象,并且可以在任何具有网络身份组件的游戏对象上调用。
要在您的代码中定义客户端 RPC 调用,您必须使用 [ClientRpc] 装饰该方法。虽然不是必需的,但强烈建议在方法名称前加上 Rpc,以便在调用代码中更容易识别将发生的情况。
重要 SyncEvents 已在版本 18.0.0 中删除,请参阅此问题了解更多信息
网络事件类似于客户端 RPC 调用,但不是调用游戏对象上的函数,而是触发事件。
这允许您编写可以在触发事件时注册回调的脚本。
要在您的代码中定义网络事件,您必须编写一个函数:
您可以使用事件来构建强大的网络游戏系统,这些系统可以通过其他脚本进行扩展。此示例显示客户端上的效果脚本如何响应服务器上的战斗脚本生成的事件。
SyncEvent 是派生命令和 ClientRpc 调用的基类。您可以在自己的函数上使用 SyncEvent 属性来制作自己的事件驱动网络游戏代码。使用 SyncEvent,您可以扩展 Mirror 的多人游戏功能,以更好地适应您自己的编程模式。