- 用户指南
- Components
- 寻路
- 动画组件
- 资源组件
- 音频组件(AudioComponent)
- 音频侦听器(AudioListener)
- 音频源(AudioSource)
- 音频过滤器(AudioFilter)(仅限专业版)
- 混响区域(ReverbZone)
- 麦克风(Microphone)
- 物理组件(PhysicsComponent)
- 箱体碰撞体(BoxCollider)
- 胶囊碰撞体(CapsuleCollider)
- 角色控制器(CharacterController)
- 角色关节(CharacterJoint)
- 可配置关节(ConfigurableJoint)
- 恒定力(ConstantForce)
- 固定关节(FixedJoint)
- 铰链关节(HingeJoint)
- 网格碰撞体(MeshCollider)
- 物理材质(PhysicsMaterial)
- 刚体(Rigidbody)
- (SphereCollider)
- 弹簧关节(SpringJoint)
- 交互布(InteractiveCloth)
- 蒙皮布(SkinnedCloth)
- 车轮碰撞体(WheelCollider)
- 游戏对象(GameObject)
- 图像效果(ImageEffectScripts)
- 高光溢出和镜头光晕(BloomandLensFlare)
- 模糊(Blur)
- 相机运动模糊(MotionBlur)
- 颜色修正曲线(ColorCorrectionCurve)
- 颜色修正(ColorCorrection)
- 颜色修正查找纹理(ColorCorrectionLookupTexture)
- 对比度增强(ContrastEnhance)
- 对比度拉伸(ContrastStretch)
- 起皱(Crease)
- 视野深度(DepthofField)3.4
- 视野深度(DepthofField)
- 边缘检测(EdgeDetection)
- 鱼眼(Fisheye)
- 全局雾(GlobalFog)
- 发光(Glow)
- 灰度(Grayscale)
- 运动模糊(MotionBlur)
- 噪波和颗粒(NoiseAndGrain)
- 噪波(Noise)
- 屏幕叠加(ScreenOverlay)
- 棕褐色调(SepiaTone)
- 边缘检测效应
- 阳光照射(SunShaft)
- 屏幕空间环境光遮蔽(SSAO)(ScreenSpaceAmbientOcclusion(SSAO))
- 倾斜位移(TiltShift)
- 色调映射(Tonemapping)
- 旋转(Twirl)
- 渐晕(Vignetting)(和色差(ChromaticAberration))
- 状态同步详细信息
- 旋涡
- 设置管理器(SettingsManager)
- 网格组件(MeshComponents)
- 网络组
- 效果
- 渲染组件
- 变换组件(TransformComponent)
- UnityGUI组
- 向导
- 地形引擎指南(TerrainEngineGuide)
- 树木创建器指南
- 动画视图指南
- GUI脚本指南
- 网络参考指南
- 移动设备上的网络连接
- 高级网络概念
- Unity中的网络元素
- RPC详细信息
- NetworkLevelLoading
- 主服务器
- 最小化网络带宽
- 社交API
- 内置着色器指南
- Unity的后台渲染
- 着色器参考
- ShaderLab语法:Shader
- ShaderLab语法:Properties
- ShaderLab语法:子着色器(SubShader)
- ShaderLab语法:Pass
- ShaderLabsyntax:Color,Material,Lighting
- ShaderLab语法:剔除和深度测试(Culling&DepthTesting)
- ShaderLab语法:纹理组合器(TextureCombiners)
- ShaderLab语法:雾(Fog)
- ShaderLab语法:Alpha测试(Alphatesting)
- ShaderLab语法:混合(Blending)
- ShaderLab语法:通道标记(PassTags)
- ShaderLab语法:名称(Name)
- ShaderLab语法:绑定通道(BindChannels)
- ShaderLab语法:使用通道(UsePass)
- ShaderLab语法:GrabPass
- ShaderLab语法:子着色器标记(SubShaderTags)
- ShaderLab语法:回退(Fallback)
- ShaderLab语法:自定义编辑器(CustomEditor)
- ShaderLab语法:其他命令
- ShaderLab语法:Pass
- 高级ShaderLab主题
- ShaderLab内置值
- 其他
- 网络视图
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Mecanim 动画系统
- 动画状态机
- 混合树 (Blend Tree)
- 在 Mecanim 中使用动画曲线 (Animation Curves)(仅限专业版 (Pro))
- 循环动画片段
- Animation State Machine Preview (solo and mute)
- 动画参数
- 旧动画系统
- 使用类人动画
- 动画层
- 资源导入与创建
- 音轨模块
- 减少文件大小
- 光照贴图 UV
- 资源准备和导入
- 如何安装或升级标准资源 (Standard Assets)?
- FBX 导出指南
- 从 Maya 中导入对象
- 从 Cinema 4D 中导入对象
- 从 3D Studio Max 中导入对象
- 从 Cheetah3D 中导入对象
- 从 Modo 中导入对象
- 从 Lightwave 中导入对象
- 从 Blender 中导入对象
- 为优化性能建模角色
- 如何使用法线贴图 (NormalMaps)?
- 如何修正已导入模型的旋转?
- 程序材质
- 如何使用水?
- 分析器(仅限专业版)
- 绘制调用批处理
- 遮挡剔除(仅限专业版)
- Unity 中的高动态范围 (High Dynamic Range) 渲染
- 在 Unity 4 中使用 DirectX 11
- 文本场景文件格式(仅限专业版)
- 使用网络播放器模版
- 平台依赖编译
- 日志文件
- 首选项
- 粒子系统曲线编辑器
- 渐变编辑器
- 怎样制作网格粒子发射器?(旧粒子系统)
- 深入了解光照贴图
- 光照贴图快速入门
- 着色器
- 动画脚本(旧版)
- 自定义
- 布局模式
- 扩展编辑器
- 网络实例化
- 材质和着色器
- 如何使用细节纹理?
- 着色器:顶点和片段程序
- Unity 中的阴影
主服务器
主服务器 (Master Server) 是将游戏实例与想与之相连接的玩家客户端联系起来的会聚位置。它还可以隐藏端口号和 IP 地址以及执行其他在建立网络连接时出现的技术任务,例如防火墙处理和 NAT 穿透 (punchthrough)。
每次单独的游戏实例运行都会给主服务器 (Master Server) 提供 一个游戏类型 (Game Type)。当玩家连接主服务器 (Master Server) 并查询与其匹配的游戏类型 (Game Type) 时,服务器会回复一个正在运行的游戏的列表、每个游戏中的玩家人数以及游戏是否需要密码等信息。用于交换该数据的两个函数为:用于服务器的 MasterServer.RegisterHost() 和用于玩家客户端的 MasterServer.RequestHostList()。
调用 RegisterHost 时,您需要传递正在注册的主机的三个参数 - gameTypeName(之前提到过的游戏类型 (Game Type))、gameName 和 comment。RequestHostList 将您有兴趣连接的主机的 gameTypeName o作为一个参数。所有已注册的该类型主机都将被返回到发出请求的客户端。这是一项异步操作,列表填满后,可用 PollHostList() 检索完整的列表。
主服务器 (Master Server) 的 NAT 穿透 (punchthrough) 职责实际上是由一个称为服务商 (Facilitator) 的单独过程负责的,但 Unity 的主服务器 (Master Server) 可并行地运行两种服务。
游戏类型 (Game Type) 是标识性的名称,对每个游戏都应该是唯一的(尽管 Unity 不提供 任何中央注册系统来对此进行保证)。选择一个其他人不太可能用到的、与众不同的名称是明智的。如果您的游戏有几个不同的版本,那么您可能会需要警告用户他们的客户端与运行的服务器版本不兼容。版本信息可以在注释字段(这实际上是二进制数据,因此版本信息可以以任何想要的形式进行传递)进行传递。游戏名称仅仅是建立该游戏者提供 的特定游戏实例的名称。
在对主服务器 (Master Server) 作适当修改的情况下可将注释字段用于更多高级的用途(有关如何执行此操作的更多信息,请参阅以下内容)。例如,您可以将注释字段的前十个字节保留为密码,然后在主服务器 (Master Server) 接收主机更新时在主服务器 (Master Server) 中提取出该密码。如果密码检查错误,它就会拒绝主机更新
注册一个游戏
注册一个游戏之前,请务必根据主机是否支持 NAT 功能来对其进行启用或禁用;您可以使用 Network.InitializeServer 的 useNat 参数来执行此操作。
可用与如下代码相似的代码启动服务器:-
function OnGUI() { if (GUILayout.Button ("Start Server")) { // 如果不存在公有 IP 地址,请使用 NAT 穿透 (punchthrough Network.InitializeServer(32, 25002, !Network.HavePublicAddress()); MasterServer.RegisterHost("MyUniqueGameType", "JohnDoes game", "l33t game for all"); } }
在这里我们只是通过检查机器是否有公有地址来确定是否需要 NAT 穿透 (punchthrough)。还有一个称为 Network.TestConnection 的更精密的函数能够告诉您主机是否能够执行 NAT。它也进行公有 IP 地址连通性测试,以查看防火墙是否阻塞游戏端口。拥有公有 IP 地址的机器总是能通过 NAT 测试,但如果测试失败,主机将不能连接到 NAT 客户端。在这种情况下,应通知用户必须启用端口转发 (port forwarding) 以确保游戏正常运行。家用的宽带连接通常有一个 NAT 地址,但不能建立端口转发 (port forwarding)(因为它们没有个人公有 IP 地址)。这种情况下,如果 NAT 测试失败,应通知用户由于只能连接同一本地网络上的客户端,因此不宜运行服务器。
如果主机在不需要的情况下启用了 NAT 功能,该功能仍然是可以访问的。但是,无法执行 NAT 穿透 (punchthrough) 的客户端可能会错误地认为它们无法连接服务器,因为服务器启用了 NAT。
连接到一个游戏
一个 HostData 对象在主机注册或查询期间被发送。它包含与主机有关的以下信息:-
boolean | useNat | 表明主机是否使用 NAT 穿透 (punchthrough)。 |
String | gameType | 主机的游戏类型。 |
String | gameName | 主机的游戏名称。 |
int | connectedPlayers | 当前已连接的玩家/客户端数量。 |
int | playerLimit | 允许同时连接的玩家/客户端的最大数量。 |
String[] | IP | 主机的内部 IP 地址。在有公有地址的服务器上,外部和内部地址是相同的。该字段被定义为一个数组,因为内部连接时与该机器的所有活动接口相关联的所有 IP 地址都需要被检查。 |
int | port | 主机的端口。 |
boolean | passwordProtected | 表明连接到该主机是否需要提供 密码。 |
String | comment | 在主机注册期间设置的任何注释。 |
String | guid | 主机的网络 GUID。需要使用 NAT 穿透 (punchthrough) 进行连接。 |
该信息可由客户端用来查看主机的连接能力。启用 NAT 后,您需要使用主机的 GUID 来进行连接。在您进行连接的过程中检索 HostData 后,将自动对此进行处理。连接程序大致如下所示:
function Awake() { MasterServer.RequestHostList("MadBubbleSmashGame"); } function OnGUI() { var data : HostData[] = MasterServer.PollHostList(); // 检查主机列表中的所有主机 for (var element in data) { GUILayout.BeginHorizontal(); var name = element.gameName + " " + element.connectedPlayers + " / " + element.playerLimit; GUILayout.Label(name); GUILayout.Space(5); var hostInfo; hostInfo = "["; for (var host in element.ip) hostInfo = hostInfo + host + ":" + element.port + " "; hostInfo = hostInfo + "]"; GUILayout.Label(hostInfo); GUILayout.Space(5); GUILayout.Label(element.comment); GUILayout.Space(5); GUILayout.FlexibleSpace(); if (GUILayout.Button("Connect")) { // /连接到 HostData 结构,内部使用正确的方法(使用 NAT 时使用 GUID)。 Network.Connect(element); } GUILayout.EndHorizontal(); } }
该示例打印出了主服务器 (Master Server) 返回的所有相关的主机信息。可将如 ping 信息或主机的地理位置等其他有用的数据添加到这里。
NAT 穿透 (punchthrough)
NAT 穿透 (punchthrough) 的可用性可决定某个特定计算机是否适合用作服务器。一些客户端可能能够连接任意的 NAT 服务器,而另一些客户端可能不行。
NAT 穿透 (punchthrough) 的可用性可决定某个特定计算机是否适合用作服务器。一些客户端可能能够连接任意的 NAT 服务器,而另一些客户端可能不行。 默认情况下,在主服务器 (Master Server) 的帮助下提供 NAT 穿透 (punchthrough),但并不需要这么做。服务商 (Facilitator) 是实际用于 NAT 穿透 (punchthrough) 服务的进程。如果两台机器都连接到服务商 (Facilitator),那么只要服务商使用了外部 IP 和端口,这两台机器看起来就好像可以相互连接。主服务器 (Master Server) 用于提供 此外部 IP 和端口信息,该信息用其他方法是很难确定的。这就是主服务器 (Master Server) 和服务商 (Facilitator) 如此紧密结合的原因。默认情况下,主服务器 (Master Server) 和服务商 (Facilitator) 具有相同的 IP 地址。要更改其中一个,请使用 MasterServer.ipAddress、MasterServer.port、Network.natFacilitatorIP 和 Network.natFacilitatorPort
高级
Unity Technologies 还有一台全面部署的主服务器 (Master Serve) 用于测试目的,实际上它也是会默认情况下使用的服务器。然而,源代码是开放给所有人使用的,并且服务器可在 Windows、Linux 和 Mac OS 上部署。除了简单地从源代码构建工程之外,您可能还会遇到要修改主服务器 (Master Server) 处理信息和通信方式的情况。例如,您可能能够优化主机数据的处理或限制主机列表上返回的客户端数量。这些更改将需要修改源代码;有关实现此操作的信息,请参阅主服务器构建页面.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论