游戏开发示例工程【免费下载链接】FPSSampleA first person multiplayer shooter example project in Unity项目地址https://gitcode.com/gh_mirrors/fp/FPSSample点击查看免费下载本篇技术指南以 FPSSample 官方 README 为主体结合仓库中的编辑器构建工具、控制台系统与网络层源码系统讲解如何从零获取并运行这个由 Unity Technologies 团队开发、源码与资源全量开放的第一人称多人射击示例项目。读完本文你将掌握通过 Git LFS 正确克隆项目、安装匹配的 Unity 2018.3.8f1 环境、首次导入后的必要修复步骤、使用 Project Tools 窗口构建 AssetBundle 与 Standalone 玩家端、通过 Quick Start 一键拉起 headless 服务器与客户端以及控制台命令与变量的完整玩法。项目概况与技术栈FPSSample 是一个功能完整的第一人称多人射击游戏示例由 Unity Technologies 的一个小型团队开发附带全部源代码与美术资源。项目的目标有三个测试并展示 Unity 的新特性、为其他团队提供可复用的引导起点bootstrap、以及作为学习与灵感来源。项目大量采用当时 Unity 的新技术HD Render PipelineHDRP全部内容均按 HDRP 标准制作相关实现与着色器资产可见于 Assets/ScriptableRenderPipeline 目录网络传输层multiplayer transport基于 Packages/com.unity.transport 与 Packages/com.unity.multiplayerEntity Component SystemECS项目主要采用 “ECS 模式” 的混合用法hybrid mode即以大量常规组件配合部分 ECS 实体与数据组件随着 Unity 逐步推出支持 ECS 的功能版本项目会随之迁移。项目状态说明README 明确指出该项目基于 Unity 2018.3已不再积极维护。官方建议将其作为学习资源或灵感来源若打算开启新项目应升级到最新版 Unity 与包。这决定了本文的所有版本与配置说明均以该仓库的实际内容为准。当前状态速览Unity version: 2018.3.8f1 Platforms : Windows (client and server) and Linux (server only)即客户端与服务器均支持 WindowsLinux 仅支持服务器headless。获取项目必须使用 Git LFS 克隆README 给出了一个极易踩坑的关键提示重要本项目使用 Git Large Files SupportLFS。使用 GitHub 上的绿色按钮下载 zip 压缩包无法正常工作你必须用带 LFS 支持的 git 版本克隆项目。具体注意点项目体积约为18GB仅 Assets 文件夹由于包含 git 状态信息克隆下来的仓库体积几乎是其两倍如果克隆下来的体积远小于预期很可能是因为克隆时没有启用 LFS此时资源文件会是损坏的指针文件而非真实内容安装 Git LFS 后使用常规方式克隆即可例如git clone https://gitcode.com/gh_mirrors/fp/FPSSample。安装正确的 Unity 版本与平台支持克隆完成后需要安装 README 前置条件中列出的 Unity 版本2018.3.8f1。安装时务必勾选以下模块支持Windows Standalone Support构建 Windows 客户端与服务器Linux Support如需构建 Linux headless 服务器则必须安装。由于项目所有内容均按 HDRP 制作还应在 ProjectSettings/GraphicsSettings.asset 等配置中确认 HDRP 渲染管线Assets/ScriptableRenderPipeline/HDRP_Assets已正确引用。首次打开项目第一次打开项目需要耐心——导入全部资源需要相当长的时间。导入完成后README 特别标注了 Unity 2018.3 的两个已知问题及对应修复步骤Firstperson_Projection 着色器重导入在 Project 搜索栏搜索Firstperson_Projection选中搜索出的 4 个着色器右键执行Reimport实体entities脚本编译错误如果出现与 entities 相关的编译错误需要移除并重新安装 entities 包见 Packages/manifest.json 中声明的包依赖。打开 Project Tools 窗口编辑器就绪后通过菜单FPS Sample Windows Project tools打开Project Tools 窗口。窗口界面如下建议将该窗口停靠dock在编辑器边缘后续会频繁使用。从这里可以打开关卡、构建 AssetBundle、构建 Standalone 玩家端。由于这是多人游戏你将会大量操作 Standalone 进程。窗口的源码实现位于 Assets/Scripts/EditorTools/Editor/BuildWindow.cs通过[MenuItem(FPS Sample/Windows/Project Tools)]注册菜单项并在OnGUI中依次绘制关卡选择DrawLevelSelect、构建工具DrawBuildTools与快速启动DrawQuickStart三个区域。尝试预览模式Preview Mode在 Project Tools 窗口中点击Level_00旁边的Open按钮。项目的关卡被拆分为多个场景但通过该按钮可以一次性打开组成一个关卡的所有场景源码中由 Assets/Scripts/EditorTools/Editor/EditorLevelManager.cs 负责解析分层关卡。打开后直接点击编辑器Play进入运行模式即可在关卡中自由跑动。这就是项目所称的 “预览模式preview mode”可用于测试关卡、玩家移动与武器。构建 AssetBundle 与 Standalone 玩家端退出 Play 模式回到 Project Tools 窗口确认Game区域标题下显示 Building for: StandaloneWindows64...。若不是请通过常规方式File Build Settings切换目标平台。第一步构建 AssetBundle在窗口的 bundles 区域按下All [force]。这会强制重建全部关卡与预制体的 AssetBundle。首次构建耗时较长因为所有着色器都需要编译。其底层逻辑在 Assets/Scripts/EditorTools/Editor/BuildTools.cs 中BuildBundles会先BuildLevelBundles遍历所有LevelInfo把主场景及其分层场景打包进以关卡名命名的 bundle再调用BundledResourceBuilder.BuildBundles打包预制体资源最终输出到SimpleBundleManager.assetBundleFolder指定的AssetBundles文件夹见 Assets/Scripts/Game/Core/SimpleBundleManager.cs。第二步构建 Standalone 玩家端Bundle 构建完成后点击 Game 区域的Build game。这会构建 Standalone 玩家端首次同样较慢。从源码可以看到 Standalone 玩家端只包含代码和一个极小的引导场景// Assets/Scripts/EditorTools/Editor/BuildTools.cs#L28-L32 var levels new string[] { Assets/Scenes/bootstrapper.unity, Assets/Scenes/empty.unity };即 Assets/Scenes/bootstrapper.unity 与 Assets/Scenes/empty.unity 两个场景被打进玩家端其余所有关卡与角色内容均从 AssetBundle 加载。注意由于 Unity 2018.3 的限制构建时可能出现形如Maximum number (256) of shader keywords exceeded, keyword KEYWORD_NAME will be ignored.的错误。遇到时可关闭并重新打开 Unity 再试一次构建。这类错误相对无害但可能导致部分着色器使用错误的关键字而出现图形瑕疵。第三步使用 Quick Start 启动器联机构建完成后找到窗口底部的Quick Start区域按下述参数填写Mode:MultiplayerLevel:Level_00Clients:1Headless:CheckedUse editor:Unused点击绿色的Start按钮会启动两个进程一个 Standalone 的 headless 服务器另一个尝试连接该服务器的客户端。启动器的参数组装逻辑在 Assets/Scripts/EditorTools/Editor/BuildWindow.cs 的QuickstartEntry.GetArguments中服务器模式生成serve levelname客户端模式生成client 127.0.0.1headless 时追加-batchmode -nographics。这些参数最终作为命令行参数传给 Standalone 玩家端。参数之所以能以前缀被识别为控制台命令是因为 Assets/Scripts/Console/Console.cs 的ProcessCommandLineArguments会遍历命令行参数将所有开头的参数转换为控制台命令入队执行。这也就是 README 中所说 “任何以前缀的命令行参数都会成为控制台命令” 的源码依据。游戏内容与玩法概览结合仓库中的 Documentation/GettingStarted.md可以更完整地了解这个示例游戏的内容游戏模式与角色FPSSample 是纯多人游戏——没有单机模式不连接服务器就无法游玩。游戏包含两名角色Terraformer与Robot各自拥有带主/副开火模式的武器。两种游戏模式团队死亡竞赛Team Deathmatch两队互相击杀得分时间结束时得分多者获胜突击模式Assault一方进攻、一方防守。进攻方在时间耗尽前占领全部 3 个基地即获胜防守方阻止其达成目标基地内有我方玩家即推进占领进度敌方玩家在场则可夺回进度。关卡Level_01主关卡为突击模式设计Level_00主要用于测试体量远小于前者。默认键位按键功能WASD玩家移动Shift冲刺鼠标视角左键主武器开火右键副武器开火Space跳跃V近战攻击H在已占领基地或出生点切换角色Enter打开聊天Tab查看计分板ESC菜单F1打开控制台AltEnter切换全屏理解工作流Standalone 与 AssetBundle在 Unity 中开发多人游戏意味着要频繁与 Standalone 玩家端打交道。要让客户端与服务器通过网络对话必须有两个独立进程。为使这一工作流尽可能顺畅项目用 AssetBundle 承载所有内容关卡、角色等Standalone 玩家端中只包含代码与一个极小的引导场景。因此只有修改了关卡或预制体才需要重建 AssetBundle且可在一定程度上选择性重建只改代码则只需重新 Build game。Project Tools 窗口中最常用的功能按钮及其对应源码位置按钮功能源码位置Open打开组成一个关卡的所有场景BuildWindow.csLevels [force]将所有关卡打进 BundleBuildTools.csAssets [force]将所有预制体玩家等打进 BundleBuildTools.csAll [force]同时构建关卡与预制体 Bundle同上二者同时置位Build game构建代码与引导场景BuildTools.csRun以boot mode启动游戏不加载关卡仅引导场景BuildWindow.csOpen build folder打开包含 Standalone 玩家端的目录BuildWindow.csUpdate Registry更新构建预制体 Bundle 时使用的注册表见 Assets/Scripts/Game/Core 下的 Registry 相关实现说明Update Registry 仅在向项目新增游戏元素如 Character、Replicated entity、Hero definition时才需要执行。从 boot mode 进入其他模式从 boot mode 启动的 Standalone 玩家端可以进入其他运行模式通过控制台输入以下命令preview level_01 # 进入 level_01 的预览模式等价于在编辑器中打开该关卡后按 Play connect 127.0.0.1 # 进入客户端模式并连接指定 IP serve level_00 # 启动服务器这些命令在 Assets/Scripts/Game/Main/Game.cs 中注册preview、serve、client、connect等命令分别请求创建对应的PreviewGameLoop、ServerGameLoop、ClientGameLoop详见下文源码结构一节。实际工作中更多时候使用 Project Tools 的Quick Start区域来启动不同的客户端/服务器组合——其本质就是把命令行参数传递给 Standalone 玩家端窗口最底部会实时显示最终拼装出的命令行参数这也是学习 Quick Start 工具运作方式的最佳入口。控制台、命令与变量游戏内任意时刻按F1打开控制台。控制台支持命令commands与变量vars并支持Tab 补全。控制台的实现位于 Assets/Scripts/Console其中 Console.cs 负责命令注册与执行、ConsoleGUI.cs 提供编辑器/客户端内的 GUI 界面headless 模式下则由 ConsoleTextLinux.cs 或 ConsoleTextWin.cs 提供文本界面。常用命令命令功能help列出所有命令serve levelname以指定关卡进入服务器模式connect host进入客户端模式并连接主机preview levelname进入预览模式测试关卡nextchar切换角色exec file执行文件中的命令如同在控制台逐条输入respawn强制重生thirdperson切换第三人称视角用于调试runatserver command在服务器的控制台执行命令vars显示所有变量除上述命令外控制台还内置了quit退出游戏、load、menu、screenshot、saveconfig/loadconfig保存/加载用户配置等命令均在 Game.cs 与 Console.cs 中注册。常用变量变量的数量远多于命令。README/GettingStarted 中列出的常用变量如下其中默认值结合仓库源码[ConfigVar]特性声明处进行了核对与补充变量功能默认值client.debug设为 1/2/3 可获得客户端网络相关的大量调试输出默认 0见 NetworkClient.csclient.matchmaker匹配服务器host:port端点默认0.0.0.0:80见 ClientGameLoop.csclient.playername玩家可见昵称默认Noname见 ClientGameLoop.csclient.updaterate客户端期望从服务器获得的最大速率单位字节/秒默认 30000见 ClientGameLoop.csclient.updatesendrate客户端期望从服务器获得的速率单位包/秒文档示例值 20config.fov视野角度默认 60见 Game.csconfig.mousesensitivity鼠标灵敏度默认 1.5见 Game.csconfig.inverty是否反转 Y 轴默认 0见 Game.csgame.assault.minplayers突击模式开赛所需最少玩家数默认 2见 GameModeAssault.csgame.assault.roundlength突击模式单局时长秒默认 420见 GameModeAssault.csgame.dm.minplayers死亡竞赛开赛所需最少玩家数默认 2见 GameModeDeathmatch.csgame.dm.roundlength死亡竞赛单局时长秒默认 420见 GameModeDeathmatch.csgame.modename游戏模式deathmatch或assault默认 assault见 GameModeSystemServer.csnet.stats设为 0 显示网络统计/图形默认 0见 NetworkCommon.csr.vsync每帧同步的垂直同步数0 表示不同步默认 1见 RenderSettings.csr.resolution当前分辨率如1920x1080见 RenderSettings.csserver.port服务器监听端口源码默认 7913见 NetworkCommon.csserver.quitwhenempty设为 1 时服务器在最后一名玩家离开后退出默认 0见 ServerGameLoop.csserver.recycleinterval若 0服务器在无玩家 N 秒后自动关闭默认 0见 ServerGameLoop.csserver.sqp_portServer Query Protocol 端口默认 0即使用server.port 1见 NetworkCommon.csserver.tickrate服务器与客户端的 tick 频率默认 60见 Game.csshow.compactstats设为 1 在左上角显示 FPS 与 RTT默认 1见 GameStatistics.csshow.fps设为 0 显示 FPS 统计默认 0见 GameStatistics.cssound.debug显示声音调试信息默认 0见 SoundSystem.cs注README/GettingStarted 中server.port的示例值为 7912而仓库源码 NetworkCommon.cs 中声明的默认值为 7913具体以你构建出的实际版本为准server.sqp_port默认 0 时按server.port 1计算。boot.cfg 与 user.cfg 的启动机制变量与命令的组合形成了项目的启动配置机制。在 Game.cs 中定义了两个配置文件static readonly string k_UserConfigFilename user.cfg; public static readonly string k_BootConfigFilename boot.cfg;Game.Awake的启动流程Game.cs启动时先执行exec -s user.cfg加载用户配置除非命令行包含-noboot否则继续执行exec -s boot.cfg——即游戏开箱即用的行为由 boot.cfg 驱动支持 Multiplay 标准的-port与-query_port参数会分别改写server.port与server.sqp_port。构建系统在生成构建产物时会自动写入这些配置文件。例如 Windows 构建后处理会生成server.bat内容为-nographics -batchmode -noboot serve level_01 game.modename assault、空的user.cfg以及含client/load level_menu的boot.cfg见 BuildTools.csLinux headless 构建则会生成含game.modename assault与serve level_01的boot.cfg见 BuildTools.cs。saveconfig命令通过ConfigVar.Save把带Save标志的变量持久化到user.cfg。制作正式构建BuildSystem 菜单要制作完整的游戏构建使用FPS Sample BuildSystem菜单项例如CreateBuildWindows64制作完整 Windows 构建Mono 后端CreateBuildWindows64-IL2CPP使用 IL2CPP 后端的 Windows 构建CreateBuildLinux64制作 Linux headless 服务器构建BuildOptions.EnableHeadlessMode。这些菜单项在 BuildTools.cs 中通过[MenuItem]注册且同时是可从 Unity 命令行直接调用的静态函数方便接入构建机build machine做自动化集成。一次完整构建会依次执行构建全部 AssetBundle强制→BuildPipeline.BuildPlayer构建玩家端 → 写入server.bat、user.cfg、boot.cfg等配置文件输出目录形如Builds/StandaloneWindows64/product_target_yyyyMMdd.buildNumber.changelist。源码结构概览README 指向 Documentation/SourceCode.md 获取更详细的源码导览这里摘录其核心脉络便于你在阅读代码时建立整体地图Game 类与 GameLoopGame.cs 是定义游戏主循环的 MonoBehavior几乎所有游戏代码都在Game.Update中运行少数例外。它是最早被实例化的类之一无论游戏处于何种状态始终存在并负责实例化 Audio、Input 等系统。游戏可以通过RequestGameLoop请求更新某个具体的GameLoop——GameLoop 实现游戏所处的各种模式负责所需系统的初始化/关闭以及按正确顺序更新系统运行时可切换。当前实现的 GameLoop 类型有ServerGameLoopServerGameLoop.cs处理与一批客户端的连接并更新所有服务器系统ClientGameLoopClientGameLoop.cs处理与服务器的单条连接并更新所有客户端系统PreviewGameLoopPreviewGameLoop.cs服务器与客户端 GameLoop 的混合体用于不构建 Bundle、不启服务器也能预览游戏——即编辑器内加载游戏场景后按 Play 时的模式。模块化组织部分游戏代码按**模块modules**组织位于 Assets/Scripts/Game/Modules。模块包含组件及更新这些组件的系统也可以包含由 GameLoop 实例化的特定类并可针对服务器/客户端/预览提供不同实现。主要模块包括ReplicatedEntity Module负责 GameObject 与 ECS 实体的网络复制带ReplicatedEntity组件的预制体需注册进ReplicatedEntityRegistry可序列化的复制组件需实现INetworkSerializable接口ECS 实体复制通过继承ReplicatedEntityFactory的 ScriptableObject 实现Player Module服务器为每个连接玩家创建Player实体并广播玩家信息每个客户端持有LocalPlayer实例承载相机控制、UI 等本地表现组件Character Module负责角色能力Abilities、动画与 UI角色由带Character/Character1P组件的预制体定义通过CharacterTypeDefinitionScriptableObject 配置所有行为由AbilityController驱动的 Ability 处理HeroTypeAsset定义英雄属性与武器/能力Item / Effect / Grenade / HitCollision / Projectile / Ragdoll / SpectatorCam Module分别处理道具与特效触发、客户端火忘式fire-and-forget特效、手雷服务器端模拟与客户端插值、带服务器端回滚lag compensation的命中碰撞、弹道与预测、布娃娃物理、以及观战相机等。ECS 混合模式几乎全部游戏代码都用 ECS 系统实现但处于所谓的mixed-mode由于部分依赖功能尚未在 ECS 中实现代码仍以 GameObject 与 MonoBehavior 为基础辅以部分实体与数据组件同时项目选择手动更新所有系统以完全掌控更新顺序——这在需要每帧多次更新系统如客户端预测时是必需的。更多资料与许可README 指向 Documentation 目录获取更多信息尤其推荐从 GettingStarted.md 开始。仓库内还包含 SourceCode.md、Animation.md、Characters.md、SmallEditorTools.md 等专题文档以及记录演进要点的 CHANGELOG.md 与贡献指南 CONTRIBUTING.md。许可方面项目的意图是让使用者可以把其中任何内容作为自己 Unity 游戏的起点或部件来使用法律条文见 LICENSE.md。常见问题与注意事项汇总最后将 README 及源码中提到的坑点汇总供排查时快速对照现象原因与对策克隆后仓库体积远小于预期克隆时未启用 Git LFS必须使用带 LFS 的 git 重新克隆初次导入后画面/着色器异常搜索Firstperson_Projection对 4 个着色器右键 Reimportentities 脚本编译错误移除并重新安装 entities 包构建时出现 shader keywords exceeded 错误Unity 2018.3 限制关闭并重开 Unity 后重试错误相对无害但可能产生图形瑕疵局域网玩家无法连接在connect IP创建游戏后需确认防火墙允许相应端口server.port通信按照本文流程走完克隆、环境安装、Bundle 构建与 Quick Start 启动你就能在本地拉起一局由 headless 服务器 客户端组成的完整多人对战并在此基础上继续探索 FPSSample 的源码与架构。赞分享游戏开发示例工程【免费下载链接】FPSSampleA first person multiplayer shooter example project in Unity项目地址https://gitcode.com/gh_mirrors/fp/FPSSample点击查看免费下载相关推荐Unity第一人称射击游戏架构解析FPSSample模块化设计实践指南Unity第一人称射击游戏架构解析FPSSample模块化设计实践指南 想要构建一个专业的Unity第一人称射击游戏吗FPSSample项目为你提供了一个完游戏开发示例工程终极Unity多人在线FPS游戏开发指南从零构建你的第一人称射击游戏终极Unity多人在线FPS游戏开发指南从零构建你的第一人称射击游戏 想要学习如何在Unity中制作专业的 多人在线第一人称射击游戏 这个教程项目是你的完美Unity FPS游戏开发终极指南从零构建沉浸式第一人称射击场景Unity FPS游戏开发终极指南从零构建沉浸式第一人称射击场景 FPSSample是一个功能完整的Unity第一人称多人射击游戏示例项目为游戏开发者提供了游戏开发示例工程上一篇如何解决 Photographer.io 开源摄影社区常见问题完整指南下一篇CTF-Wiki 格式化字符串漏洞原理详解printf 参数解析、栈内存布局与利用基础创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考