diff --git a/cocoscreator_projects/YouleNexus/assets/framework/config/bootstrap.ts b/cocoscreator_projects/YouleNexus/assets/framework/config/bootstrap.ts index dd38506..7882db3 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/config/bootstrap.ts +++ b/cocoscreator_projects/YouleNexus/assets/framework/config/bootstrap.ts @@ -72,7 +72,9 @@ export async function resolveBootstrap(opts: BootstrapOptions): Promise; // 调试用渠道身份覆盖 account?: DebugAccount; // 调试用登录账号(仅 debug 模式生效) isDebugger?: boolean; // 收发包日志开关(替代旧 Game_Config.Debugger.isDebugger) @@ -30,9 +31,10 @@ export const PROFILES: Record = { staging: { name: 'staging', gameserver: STAGING_GAMESERVER, + serverOverride: 'ws://127.0.0.1:3088', // 走 staging 配置全链路,但游戏服连本地测试服 isDebugger: true, // 调试登录账号:联调前替换为真实测试账号(openid 必填)。仅 debug 模式生效。 - account: { openid: 'REPLACE_ME_test_openid', nickname: '测试号', avatar: '', sex: 0, province: '', city: '', unionid: '' }, + account: { openid: 'REPLACE_ME_test_openid', nickname: '测试号', avatar: 'https://gips3.baidu.com/it/u=4028841722,3177937756&fm=3074&app=3074&f=PNG?w=2048&h=2048', sex: 0, province: 'testprovince', city: 'testcity', unionid: 'test_unionid' }, }, local: { name: 'local', server: 'ws://127.0.0.1:3088', isDebugger: true }, }; diff --git a/cocoscreator_projects/framework-tests/config/bootstrap.test.ts b/cocoscreator_projects/framework-tests/config/bootstrap.test.ts index af7b1b7..6415e2c 100644 --- a/cocoscreator_projects/framework-tests/config/bootstrap.test.ts +++ b/cocoscreator_projects/framework-tests/config/bootstrap.test.ts @@ -89,6 +89,20 @@ test('release:原生身份仍生效(URL 的 999 无效)', async () => { assert.equal(r.identity.channelid, 'NC'); }); +test('debug + serverOverride:走远程全链路但连接地址覆盖为本地', async () => { + const fetcher = fetcherReturning(REMOTE); // REMOTE.player_server_tcp = 5.5.5.5:5000 + const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '?profile=staging', fetcher, isNative: false }); + assert.deepEqual(r.servers, [PROFILES.staging.serverOverride]); // 覆盖为 profile.serverOverride + assert.ok(r.rawConfig); // 远程配置仍抓取(全链路) + assert.equal(fetcher.calls.length, 1); +}); + +test('release:serverOverride 不生效(强制 prod,用远程解析地址)', async () => { + const fetcher = fetcherReturning(REMOTE); + const r = await resolveBootstrap({ mode: 'release', win: {}, search: '?profile=staging', fetcher, isNative: true }); + assert.deepEqual(r.servers, ['ws://5.5.5.5:5000']); // prod 无 override,用远程解析 +}); + test('debug:account 来自当前 profile', async () => { const fetcher = fetcherReturning(REMOTE); const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '?profile=staging', fetcher, isNative: false }); diff --git a/docs/guides/配置与调试指南.md b/docs/guides/配置与调试指南.md index 7c5b427..9cff823 100644 --- a/docs/guides/配置与调试指南.md +++ b/docs/guides/配置与调试指南.md @@ -164,8 +164,9 @@ Profiles 取代了旧工程的 `Game_Config.Debugger`(`serverType` / `gameserv ```ts interface DebugProfile { name: string; - server?: string; // 显式 ws 调试服地址;给定则跳过远程抓取 + server?: string; // 显式 ws 调试服地址;给定则跳过远程抓取(纯直连) gameserver?: string; // 远程配置 txt URL(不含防缓存串) + serverOverride?: string; // debug:抓远程配置走全链路后,把连接地址覆盖为此(联调本地游戏服) identity?: Partial; // 调试用渠道身份覆盖 account?: DebugAccount; // 调试用登录账号(openid 等),仅 debug 模式生效 isDebugger?: boolean; // 收发包日志开关 @@ -236,8 +237,9 @@ export const PROFILES: Record = { `resolveBootstrap` 决定 `servers`(一个 `ws://` 地址数组,交给 `NetClient` 轮询)的顺序: -1. **当前 profile 有 `server`** → 直接用它,**跳过远程配置抓取**(`local`/`lab` 这类直连档位走这条)。 +1. **当前 profile 有 `server`** → 直接用它,**跳过远程配置抓取**(`local`/`lab` 这类纯直连档位走这条)。 2. **否则**抓 profile 的 `gameserver` 远程配置文件,用 `getParam` 取出连接参数,`resolveServers` 组装候选列表。 + - **debug 且 profile 有 `serverOverride`**:仍抓远程配置走完整链路(`rawConfig` 照常返回),但最终连接地址**覆盖为 `serverOverride`**(联调时把游戏服连到本地测试服)。release 一律忽略 `serverOverride`,用远程解析结果。 3. **不兜底**(CLAUDE.md 第二准则):profile 既无 `server` 又无 `gameserver`、远程抓取失败、或解析不出任何地址——一律抛 `ConfigFetchError` **显式暴露**,不猜默认、不降级。重试/重连归 `NetClient`,不在本层造兜底轮子。 `resolveServers` 取的连接参数键(**逐字一致**原工程,按此优先级):