管理员入口可见方案
5 小时前综合
当前代码完全没有管理员逻辑——编辑器按钮对所有人无条件可见。让我基于案例经验设计方案。
当前状态 vs 目标
现状目标地图编辑器按钮所有人可见仅管理员可见NPC编辑器按钮所有人可见仅管理员可见进入塔防模式所有人可见不变管理员判定无基于 userId 白名单
核心难点:WASM 下如何拿到 userId案例已经验证过了:方式结果_lobby:GetMyUserId()分享链接下始终返回 0clientCloud.userId多人模式下 clientCloud = nilconnection.identity["user_id"]服务端可靠拿到,需回传给客户端你的 Server.lua 已经在 HandleClientReady 中读取了 connection.identity["user_id"],并存在 connectionUserIds_ 里。差的只是回传给客户端这一步。
设计方案数据流客户端启动 → 菜单渲染(无编辑器按钮)
│
├─ 非联网模式 → 视为开发者预览 → 直接显示按钮
│
└─ 联网模式 → 发送 CLIENT_READY
↓
服务端收到
读取 connection.identity["user_id"]
回传 → 新 RemoteEvent "SyncIdentity"
↓
客户端收到 userId
存入 NetClient.myUserId
检查白名单
├─ 是管理员 → 重建菜单,显示编辑器按钮
└─ 非管理员 → 无变化
涉及的改动(4 个文件)1. Settings.lua — 加一个 RemoteEvent 名 + 白名单EVENTS 新增: SYNC_IDENTITY = "SyncIdentity"
ADMIN_IDS = { [你的userId] = true }
只需加两行,白名单集中管理。2. Server.lua — HandleClientReady 中回传 userId现有代码已经读了 connection.identity["user_id"],只需在末尾加一步:通过 SYNC_IDENTITY RemoteEvent 把 userId 发回给该客户端。HandleClientReady 现有流程:
读 userId ✓
存 connectionUserIds_ ✓
DeliverPendingMessages ✓
→ 新增: 发 SYNC_IDENTITY { userId } 给该 connection
3. Client.lua — 接收并存储 userIdClient.myUserId = 0 -- 初始未知
Init() 中订阅 SYNC_IDENTITY:
收到 → Client.myUserId = data.userId
→ 触发回调通知 main.lua
4. MenuScreen.lua + main.lua — 条件显示编辑器按钮MenuScreen.lua:BuildModeCard 渲染 extraBtns 前检查传入的 isAdmin 标志:现有: if mode.extraBtns and isEnabled then -- 无条件渲染
改为: if mode.extraBtns and isEnabled and options.isAdmin then
main.lua:isAdmin() 函数:
非联网模式 → true(开发者本地预览)
联网模式 + NetClient.myUserId == 0 → false(还没收到身份)
联网模式 + userId 在白名单 → true
否则 → false
ShowMenu():
menuRoot_ = MenuScreen.Create(callbacks, { isAdmin = isAdmin() })
NetClient 的 onIdentity 回调:
if isAdmin() and 当前在主菜单 then
ShowMenu() -- 重建菜单,编辑器按钮出现
end
用户体验时序普通玩家(分享链接)0s 打开游戏 → 主菜单 → 只看到"进入塔防模式"
~3s 服务端回传 userId → 不在白名单 → 无变化
✅ 始终看不到编辑器按钮
管理员(分享链接)0s 打开游戏 → 主菜单 → 只看到"进入塔防模式"
~3s 服务端回传 userId → 在白名单 → 菜单重建
✅ 编辑器按钮出现
开发者(本地编辑器预览)0s 打开预览 → 非联网模式 → isAdmin() = true → 直接显示编辑器按钮
✅ 无需等待
和案例的对比维度案例(壁上题辞)你的项目userId 来源connection.identity["user_id"]相同回传方式SYNC_ALL 中附带 yourUserId独立 SYNC_IDENTITY 事件(更清晰)白名单位置main.lua 顶部常量Settings.lua 集中管理按钮控制主菜单重建MenuScreen 参数化控制兜底逻辑Web+未同步=false非联网=true, 联网+未同步=false案例踩过的坑(userId=0 时兜底返回 true 导致所有人看到按钮)在这个设计中已规避——联网模式下未同步一律 false。



