第0步环境准备新建Unity项目2019.4推荐2021.3 LTS1.准备好mirror1.打开Window → 资源商店→ 找到mirror导入你的资源中→打开包管理找到它整个导入等待安装完成菜单栏出现Mirror选项fizzysteamworks1.准备好steam第1步创建NetworkManager网络大脑目标让客户端能连接服务器操作在场景里右键 → 创建空物体命名为NetworkManager给它添加组件NetworkManager ,KcpTransport,Network Manager HUD【NetworkManager——网络管理器KcpTransport——Mirror自带的传输层类似快递公司的货车Network Manager HUD——网络管理器ui组件】MyScance配置到脱机和联机插槽中Mirror Steamworks.NET 原子级搭建指南完整版你导入的两个文件夹是**com.rlabrecque.steamworks.net/ **Steam官方API的C#封装让Unity能调用Steam功能**FizzySteamworks/ Mirror的 Steam传输层插件 **用SteamP2P网络代替传统服务器** 目标 用Steam的免费P2P中继服务实现联机 无需租服务器 **玩家通过Steam好友/大厅直连。** 第0步专有名词解释必看 **** 第1步安装必要插件严格按照顺序 **** 1.1 安装Mirror **Window → Package Manager左上角 → Add package by git URL输入https://github.com/MirrorNetworking/Mirror.git等待安装完成** 1.2 安装Steamworks.NET ****去Unity Asset Store **搜索Steamworks.NET点击 ** Add to My Assets ** → Open in UnityPackage Manager里切换到My Assets找到Steamworks.NET → Download → Import全选出现com.rlabrecque.steamworks.net文件夹即成功** 1.3 安装FizzySteamworks **浏览器打开https://github.com/FizzCube/FizzySteamworks/releases**下载最新版 .unitypackage **文件例如FizzySteamworks-v1.5.unitypackageUnity里Assets → Import Package → Custom Package选择下载的.unitypackage文件 → 全选 → Import出现FizzySteamworks文件夹即成功** 第2步配置Steamworks关键 **** 2.1 获取Steam AppID **** 测试阶段 用 480 **Steam官方测试ID所有开发者都能用正式发布去Steam开发者后台申请你的专属AppID** 2.2 创建SteamManager **在Assets/创建文件夹Scripts/Steam/右键 → Create → C# Script命名 SteamManager.cs双击打开粘贴以下代码csharp复制using UnityEngine;using Steamworks;public class SteamManager : MonoBehaviour{protected static bool s_EverInitialized;public static SteamManager Instance { get; private set; } void Awake() { if (Instance ! null) { Destroy(gameObject); return; } Instance this; DontDestroyOnLoad(gameObject); try { // 初始化Steam480是测试AppID if (SteamAPI.RestartAppIfNecessary((AppId_t)480)) { Application.Quit(); return; } if (!SteamAPI.Init()) { Debug.LogError(SteamAPI.Init() failed!); return; } } catch (System.DllNotFoundException e) { Debug.LogError(Steamworks.NET DLL未找到: e.Message); return; } s_EverInitialized true; Debug.Log(✅ Steam初始化成功); } void Update() { if (s_EverInitialized) SteamAPI.RunCallbacks(); // 保持Steam心跳 } void OnDestroy() { if (s_EverInitialized) { SteamAPI.Shutdown(); Debug.Log(Steam已关闭); } }}保存后在MenuScene里创建空物体命名 SteamManager把SteamManager.cs脚本拖到这个物体上** 2.3 配置Steam AppID文件 **在Assets/根目录右键 → Create → Steam → Steam Settings找到生成的steam_appid.txt文件双击打开确保里面只有一行480测试ID** 重要 **右键steam_appid.txt → Copy Path然后打开你的Unity项目文件夹D:\unity\word01在项目根目录和Assets同级粘贴这个文件最终路径应该是D:\unity\word01\steam_appid.txt** 第3步创建Steam版NetworkManager **** 3.1 创建自定义NetworkManager脚本 **Scripts/右键 → Create → C# Script命名 SteamNetworkManager.cs双击打开粘贴以下代码csharp复制using Mirror;using Mirror.FizzySteam; // 关键FizzySteamworks命名空间using UnityEngine;public class SteamNetworkManager : NetworkManager{[Header(“Steam Settings”)]public bool useSteamRelay true; // 使用Steam免费中继public override void Awake() { base.Awake(); // 自动添加FizzySteamworks传输层 if (transport null || !(transport is FizzySteamworks)) { var steamTransport gameObject.AddComponentFizzySteamworks(); transport steamTransport; Debug.Log(✅ 已自动添加FizzySteamworks传输层); } // 配置Steam传输层 var fizzy transport as FizzySteamworks; if (fizzy ! null) { fizzy.SteamUserID (ulong)Steamworks.SteamUser.GetSteamID(); // 当前登录的Steam用户 fizzy.UseNextGenSteamNetworking true; // 使用新一代Steam网络 fizzy.UseSteamRelay useSteamRelay; // 启用中继防NAT穿透失败 } } // 服务器启动时 public override void OnStartServer() { base.OnStartServer(); Debug.Log($✅ Steam服务器已启动服务器SteamID: {Steamworks.SteamUser.GetSteamID()}); } // 客户端连接成功 public override void OnClientConnect() { base.OnClientConnect(); Debug.Log($✅ 已通过Steam连接到服务器本地SteamID: {Steamworks.SteamUser.GetSteamID()}); }}** 3.2 在场景中配置NetworkManager **在MenuScene创建空物体命名 NetworkManager移除默认的NetworkManager组件齿轮图标 → Remove Component添加 SteamNetworkManager你刚才写的脚本自动添加以下组件如果没有手动添加FizzySteamworks传输层NetworkManagerHUD调试用UINetworkSceneManager场景切换配置参数Transport槽拖入FizzySteamworksPlayer Prefab暂时留空第5步完成后回来拖Offline SceneMenuSceneOnline SceneGameScene** 第4步配置双场景脱机/联机 **** 4.1 创建主菜单场景MenuScene **File → New Scene命名 MenuScene** 保存 **到Assets/Scenes/创建UI按钮“Start Host”创建房间、“Join Game”加入游戏创建InputField用于输入Steam好友的SteamID16位数字** 4.2 创建游戏场景GameScene **File → New Scene命名 GameScene** 保存 **到Assets/Scenes/添加地形、灯光、相机** 不要放Player **由NetworkManager自动生成** 4.3 写菜单脚本 **创建 Scripts/MenuManager.cscsharp复制using Mirror;using Mirror.FizzySteam;using UnityEngine;using UnityEngine.UI;public class MenuManager : MonoBehaviour{public InputField friendSteamIdInput; // 输入好友SteamIDpublic Button hostButton;public Button joinButton;void Start() { // 创建房间 hostButton.onClick.AddListener(() { NetworkManager.singleton.StartHost(); NetworkManager.singleton.ServerChangeScene(GameScene); }); // 加入好友房间 joinButton.onClick.AddListener(() { if (string.IsNullOrEmpty(friendSteamIdInput.text)) { Debug.LogError(请输入好友SteamID); return; } // 关键设置要连接的目标SteamID var transport NetworkManager.singleton.transport as FizzySteamworks; if (transport ! null) { transport.SteamUserID ulong.Parse(friendSteamIdInput.text); } NetworkManager.singleton.StartClient(); }); }}把MenuManager.cs挂到MenuScene的Canvas上把UI按钮和InputField拖到脚本对应槽位** 第5步创建玩家预制体3个核心组件 **** 5.1 创建玩家物体 **创建Capsule命名 Player** 添加组件 **NetworkIdentity勾选Client AuthorityNetworkTransform保持默认PlayerMovement.cs脚本见下一步** 5.2 创建移动脚本 **Scripts/PlayerMovement.cscsharp复制using Mirror;using UnityEngine;public class PlayerMovement : NetworkBehaviour{[SerializeField] float speed 5f;void Update() { // 只处理本地玩家输入 if (!isLocalPlayer) return; float h Input.GetAxis(Horizontal); float v Input.GetAxis(Vertical); // 发送移动命令到服务器 if (h ! 0 || v ! 0) CmdMove(h, v); } // 关键Command 客户端发送给服务器的命令 [Command] void CmdMove(float h, float v) { // 服务器权威计算位置防作弊 Vector3 move new Vector3(h, 0, v) * speed * Time.deltaTime; transform.Translate(move); // 服务器移动后NetworkTransform自动同步给所有客户端 }}** 5.3 制作成预制体 **拖到Assets/Prefabs/文件夹** 删除场景里的Player **回到NetworkManager物体把Player预制体拖到** Player Prefab槽位** 勾选Auto Create Player第6步配置Steam并测试** 6.1 确保Steam正在运行 **必须你的电脑要登录Steam客户端测试账号也行必须steam_appid.txt文件在项目根目录第2.3步** 6.2 构建并运行测试 **File → Build Settings**添加场景拖入MenuScene序号为0拖入GameScene序号为1** 点击 Build保存为MySteamGame.exe** 6.3 双开测试流程关键第一个窗口房主双击MySteamGame.exe点击 ** Start Host **查看Console找到日志Steam服务器已启动服务器SteamID: 7656119…第二个窗口加入者再双击一次MySteamGame.exe会再开一个进程在InputField输入第一个窗口的SteamID那串数字点击 ** Join Game **查看Console已通过Steam连接到服务器** 第7步发布给好友测试 **** 把游戏文件夹压缩发给你的朋友确保朋友也登录了Steam可以是测试账号确保项目根目录的steam_appid.txt一起发过去房主点击Start Host把SteamID发给朋友好友输入ID点击Join Game注意测试AppID(480)只能在同一局域网或好友列表内联机正式发布需申请自己的AppID。** 故障排查清单 **** 一句话总结 核心是 SteamManager初始化 → FizzySteamworks传输 → SteamID直连 **