From 8f9c5f209a058240ebfab56c40eec003240101a6 Mon Sep 17 00:00:00 2001 From: chen wei bo <1025839511@qq.com> Date: Mon, 18 Aug 2025 15:22:54 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/Scripts/Sub/UI/PreloadUI.ts | 24 ++++++++++--- .../chat18x/network/services/AuthService.ts | 4 +-- .../network/services/PlayerDataService.ts | 35 +++++++++++++++++++ .../services/PlayerDataService.ts.meta | 9 +++++ 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 assets/Scripts/chat18x/network/services/PlayerDataService.ts create mode 100644 assets/Scripts/chat18x/network/services/PlayerDataService.ts.meta diff --git a/assets/Scripts/Sub/UI/PreloadUI.ts b/assets/Scripts/Sub/UI/PreloadUI.ts index e9bdf0d4..89df1c77 100644 --- a/assets/Scripts/Sub/UI/PreloadUI.ts +++ b/assets/Scripts/Sub/UI/PreloadUI.ts @@ -33,11 +33,10 @@ import { NetTimeData } from "../../chat18x/data/NetTimeData"; import ConfigManager from "../../chat18x/manager/ConfigManager"; import { AppConfig } from "db://assets/Scripts/chat18x/config/env/appConfig"; import DeviceIdService from "db://assets/Scripts/chat18x/foundation/identity/DeviceIdService"; -import { AuthService } from "db://assets/Scripts/chat18x/network/services/AuthService"; -import { ApiCode } from "db://assets/Scripts/chat18x/network/client/types"; - import MachineInfoService from "db://assets/Scripts/chat18x/foundation/identity/MachineInfoService"; - +import { AuthService } from "db://assets/Scripts/chat18x/network/services/AuthService"; +import { PlayerDataService } from "db://assets/Scripts/chat18x/network/services/PlayerDataService"; +import { ApiCode } from "db://assets/Scripts/chat18x/network/client/types"; const { ccclass, property } = _decorator; @@ -295,9 +294,26 @@ export class PreloadUI extends Component { netTimeData.timezoneOffset = resData.TimezoneOffset; this.loginFinish = true; + + // this.reqPlayerData(); }; } + // 请求玩家数据 + private async reqPlayerData() { + const reqData = { + GameName: ConfigManager.tables.TbGlobalConfig.GameName, + IsAll: true, + DataFlagList: [], + }; + console.log("玩家数据请求数据:", reqData); + let res = await PlayerDataService.I.reqQueryPlayerData(reqData); + console.log("玩家数据响应数据:", res); + if (res && res.code === ApiCode.OK) { + + } + } + enterGame() { //let islogin = HttpUnit.IsLogin(); //console.log("进入游戏,登录状态:", islogin); diff --git a/assets/Scripts/chat18x/network/services/AuthService.ts b/assets/Scripts/chat18x/network/services/AuthService.ts index 1dd53c02..be8fcdd8 100644 --- a/assets/Scripts/chat18x/network/services/AuthService.ts +++ b/assets/Scripts/chat18x/network/services/AuthService.ts @@ -13,12 +13,12 @@ export class AuthService { // 登录 public async login(req: proto.ProtoMsg.ILoginReq): Promise> { - let EP_LOGIN: Endpoint = { + let epData: Endpoint = { path: "login", method: "POST", codec: "json", needsAuth: false }; - return this.api.call(EP_LOGIN, req); + return this.api.call(epData, req); } } diff --git a/assets/Scripts/chat18x/network/services/PlayerDataService.ts b/assets/Scripts/chat18x/network/services/PlayerDataService.ts new file mode 100644 index 00000000..1a901b3f --- /dev/null +++ b/assets/Scripts/chat18x/network/services/PlayerDataService.ts @@ -0,0 +1,35 @@ +import { ApiClient } from "../client/ApiClient"; +import type { Endpoint } from "../client/endpoints"; +import type { ApiResponse } from "../client/types"; +import proto from 'db://assets/Scripts/proto/proto.pb.js'; + +export class PlayerDataService { + private static _I: PlayerDataService | null = null; + public static get I(): PlayerDataService { + if (!PlayerDataService._I) PlayerDataService._I = new PlayerDataService(); + return PlayerDataService._I; + } + private constructor(private api = ApiClient.I) {} + + // 拉取玩家数据 + public async reqQueryPlayerData(req: proto.ProtoMsg.IQueryPlayerDataReq): Promise> { + let epData: Endpoint = { + path: "playerdata/query_player_data", + method: "POST", + codec: "json", + needsAuth: true + }; + return this.api.call(epData, req); + } + + // 保存玩家数据 + public async reqSavePlayerData(req: proto.ProtoMsg.ISavePlayerDataReq): Promise> { + let epData: Endpoint = { + path: "playerdata/save_player_data", + method: "POST", + codec: "json", + needsAuth: true + }; + return this.api.call(epData, req); + } +} diff --git a/assets/Scripts/chat18x/network/services/PlayerDataService.ts.meta b/assets/Scripts/chat18x/network/services/PlayerDataService.ts.meta new file mode 100644 index 00000000..57653c97 --- /dev/null +++ b/assets/Scripts/chat18x/network/services/PlayerDataService.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "e651acda-1f16-4ceb-88e4-be892c13a248", + "files": [], + "subMetas": {}, + "userData": {} +} From 6219a1048b64142d300873deb3fbe51eb73db9f8 Mon Sep 17 00:00:00 2001 From: chen wei bo <1025839511@qq.com> Date: Tue, 19 Aug 2025 18:32:09 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat18x/network/services/AuthService.ts | 2 +- .../network/services/PlayerDataService.ts | 4 +- assets/Scripts/chat18x/payment.meta | 9 ++ assets/Scripts/chat18x/payment/PaymentApi.ts | 48 +++++++ .../chat18x/payment/PaymentApi.ts.meta | 9 ++ .../Scripts/chat18x/payment/PaymentOpener.ts | 54 ++++++++ .../chat18x/payment/PaymentOpener.ts.meta | 9 ++ .../Scripts/chat18x/payment/PaymentPoller.ts | 57 +++++++++ .../chat18x/payment/PaymentPoller.ts.meta | 9 ++ .../Scripts/chat18x/payment/PaymentService.ts | 117 ++++++++++++++++++ .../chat18x/payment/PaymentService.ts.meta | 9 ++ .../chat18x/payment/PendingOrderRepo.ts | 57 +++++++++ .../chat18x/payment/PendingOrderRepo.ts.meta | 9 ++ assets/Scripts/chat18x/payment/types.ts | 51 ++++++++ assets/Scripts/chat18x/payment/types.ts.meta | 9 ++ 15 files changed, 450 insertions(+), 3 deletions(-) create mode 100644 assets/Scripts/chat18x/payment.meta create mode 100644 assets/Scripts/chat18x/payment/PaymentApi.ts create mode 100644 assets/Scripts/chat18x/payment/PaymentApi.ts.meta create mode 100644 assets/Scripts/chat18x/payment/PaymentOpener.ts create mode 100644 assets/Scripts/chat18x/payment/PaymentOpener.ts.meta create mode 100644 assets/Scripts/chat18x/payment/PaymentPoller.ts create mode 100644 assets/Scripts/chat18x/payment/PaymentPoller.ts.meta create mode 100644 assets/Scripts/chat18x/payment/PaymentService.ts create mode 100644 assets/Scripts/chat18x/payment/PaymentService.ts.meta create mode 100644 assets/Scripts/chat18x/payment/PendingOrderRepo.ts create mode 100644 assets/Scripts/chat18x/payment/PendingOrderRepo.ts.meta create mode 100644 assets/Scripts/chat18x/payment/types.ts create mode 100644 assets/Scripts/chat18x/payment/types.ts.meta diff --git a/assets/Scripts/chat18x/network/services/AuthService.ts b/assets/Scripts/chat18x/network/services/AuthService.ts index be8fcdd8..bfd677da 100644 --- a/assets/Scripts/chat18x/network/services/AuthService.ts +++ b/assets/Scripts/chat18x/network/services/AuthService.ts @@ -18,7 +18,7 @@ export class AuthService { method: "POST", codec: "json", needsAuth: false - }; + }; return this.api.call(epData, req); } } diff --git a/assets/Scripts/chat18x/network/services/PlayerDataService.ts b/assets/Scripts/chat18x/network/services/PlayerDataService.ts index 1a901b3f..dae6c6b7 100644 --- a/assets/Scripts/chat18x/network/services/PlayerDataService.ts +++ b/assets/Scripts/chat18x/network/services/PlayerDataService.ts @@ -18,7 +18,7 @@ export class PlayerDataService { method: "POST", codec: "json", needsAuth: true - }; + }; return this.api.call(epData, req); } @@ -29,7 +29,7 @@ export class PlayerDataService { method: "POST", codec: "json", needsAuth: true - }; + }; return this.api.call(epData, req); } } diff --git a/assets/Scripts/chat18x/payment.meta b/assets/Scripts/chat18x/payment.meta new file mode 100644 index 00000000..3f475b42 --- /dev/null +++ b/assets/Scripts/chat18x/payment.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "3da5f7b4-77ad-4f88-959b-624499248ae0", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/payment/PaymentApi.ts b/assets/Scripts/chat18x/payment/PaymentApi.ts new file mode 100644 index 00000000..5a3b9fdb --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentApi.ts @@ -0,0 +1,48 @@ +/** + * 和服务器交互的API接口 + * + */ +import { ApiClient } from "../network/client/ApiClient"; +import type { Endpoint } from "../network/client/endpoints"; +import type { ApiResponse } from "../network/client/types"; +import { OrderStatus, CreateOrderReq, CreateOrderData, QueryOrderData } from "./types"; +import proto from 'db://assets/Scripts/proto/proto.pb.js'; + +export class PaymentApi { + private static _I: PaymentApi | null = null; + static get I() { return this._I ?? (this._I = new PaymentApi()); } + private constructor(private api = ApiClient.I) {} + + // 下单 + createOrder(req: CreateOrderReq): Promise> { + let epData: Endpoint = { + path: "pay/create", + method: "POST", + codec: "json", + needsAuth: true, + }; + return this.api.call(epData, req); + } + + // 查询订单 + queryOrder(orderId: string): Promise> { + let epData: Endpoint<{ orderId: string }, { orderId: string; status: OrderStatus; paidAt?: number; failureReason?: string; }> = { + path: "pay/query", + method: "POST", + codec: "json", + needsAuth: true, + }; + return this.api.call(epData, { orderId }); + } + + // 取消订单 + cancelOrder(orderId: string): Promise> { + let epData: Endpoint<{ orderId: string }, { ok: boolean; }> = { + path: "pay/cancel", + method: "POST", + codec: "json", + needsAuth: true, + }; + return this.api.call(epData, { orderId }); + } +} diff --git a/assets/Scripts/chat18x/payment/PaymentApi.ts.meta b/assets/Scripts/chat18x/payment/PaymentApi.ts.meta new file mode 100644 index 00000000..99f6c15d --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentApi.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "c4e3bad2-2588-427a-ba4f-9d839205c37d", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/payment/PaymentOpener.ts b/assets/Scripts/chat18x/payment/PaymentOpener.ts new file mode 100644 index 00000000..efa8adf7 --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentOpener.ts @@ -0,0 +1,54 @@ +/** + * 打开支付URL(系统浏览器 / 内嵌 WebView / 小游戏 API),可插拔 + * + */ + +import { sys } from "cc"; + +export type OpenStrategy = "system" | "inapp" | "minigame"; + +export interface IPaymentOpener { + open(url: string): Promise; + canReturnSignal(): boolean; // 是否能“自动感知回到App”(inapp/minigame一般可以) +} + +/** 系统浏览器:使用 sys.openURL。无法自动知道用户何时完成,靠“回到前台”事件触发轮询 */ +class SystemBrowserOpener implements IPaymentOpener { + async open(url: string) { sys.openURL(url); } + canReturnSignal() { return false; } +} + +// 如需内嵌 WebView,可封装一个组件并在 open 里显示;此处给空壳 +class InAppWebViewOpener implements IPaymentOpener { + async open(url: string) { + // TODO: 实现你的 WebView 弹窗并加载 url;可拦截 redirect_uri 关闭弹窗 + sys.openURL(url); // 临时:用系统浏览器兜底 + } + canReturnSignal() { return true; } // 拦截回跳时可立即开始轮询 +} + +// 小游戏:使用平台API打开/内嵌webview,回跳后触发事件 +class MiniGameOpener implements IPaymentOpener { + async open(url: string) { + const g: any = globalThis as any; + if (g.tt?.openAwemeUserProfile) { + // 示例:按实际平台API替换 + g.tt.openSchema({ schema: url }); + } else if (g.wx?.openUrl) { + g.wx.openUrl({ url }); + } else { + sys.openURL(url); + } + } + canReturnSignal() { return true; } +} + +export class PaymentOpenerFactory { + static create(strategy: OpenStrategy): IPaymentOpener { + switch (strategy) { + case "inapp": return new InAppWebViewOpener(); + case "minigame": return new MiniGameOpener(); + default: return new SystemBrowserOpener(); + } + } +} diff --git a/assets/Scripts/chat18x/payment/PaymentOpener.ts.meta b/assets/Scripts/chat18x/payment/PaymentOpener.ts.meta new file mode 100644 index 00000000..bc6e0c2c --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentOpener.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "d1bfe39e-0c3f-4c88-ac5d-510ee01c9121", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/payment/PaymentPoller.ts b/assets/Scripts/chat18x/payment/PaymentPoller.ts new file mode 100644 index 00000000..1da29a15 --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentPoller.ts @@ -0,0 +1,57 @@ +/** + * 轮询器(指数退避+超时+可取消) + * + */ + +import { PaymentApi } from "./PaymentApi"; +import type { QueryOrderData } from "./types"; +import { ApiCode } from "../network/client/types"; + +export interface PollOptions { + maxDurationMs: number; // 轮询总时长(例如 2分钟) + startIntervalMs: number; // 初始间隔(例如 2s) + maxIntervalMs: number; // 最大间隔(例如 10s) + jitter?: boolean; // 抖动 +} + +export class PaymentPoller { + private cancelled = false; + + // 取消轮询 + cancel() { this.cancelled = true; } + + // 轮询订单 + async poll(orderId: string, opt: PollOptions, onTick?: (d: QueryOrderData) => void): Promise { + const t0 = Date.now(); + let interval = opt.startIntervalMs; + while (!this.cancelled) { + // 查询 + const r = await PaymentApi.I.queryOrder(orderId); + if (r.code === ApiCode.OK && r.data) { + // 回调 + onTick?.(r.data); + if (["SUCCESS", "FAILED", "CANCELED", "EXPIRED"].indexOf(r.data.status) !== -1) { + return r.data; + } + } + // 退出条件 + if (Date.now() - t0 > opt.maxDurationMs) return null; + // 等待 + await this.sleep(this.jitter(interval, opt)); + // 每次轮询后,interval 会按照 1.5 倍增长,直到达到最大间隔 maxIntervalMs,避免在短时间内重复请求 + interval = Math.min(interval * 1.5, opt.maxIntervalMs); + } + return null; + } + + // 用来暂停一定的时间(ms 毫秒),并让轮询进入等待状态 + private sleep(ms: number) { return new Promise(res => setTimeout(res, ms)); } + + // 用于实现抖动(随机化轮询间隔) + private jitter(base: number, opt: PollOptions) { + if (!opt.jitter) return base; + const delta = Math.min(500, Math.max(100, base * 0.1)); + return base + (Math.random() * 2 - 1) * delta; + } +} +export default PaymentPoller; diff --git a/assets/Scripts/chat18x/payment/PaymentPoller.ts.meta b/assets/Scripts/chat18x/payment/PaymentPoller.ts.meta new file mode 100644 index 00000000..c902d7dd --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentPoller.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "a5127d19-3cee-4a5f-9ff9-d602dbb48f09", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/payment/PaymentService.ts b/assets/Scripts/chat18x/payment/PaymentService.ts new file mode 100644 index 00000000..00f4898d --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentService.ts @@ -0,0 +1,117 @@ +/** + * 支付对外的相关接口 + * + */ +import { EventTarget } from "cc"; +import { PaymentApi } from "./PaymentApi"; +import { PaymentOpenerFactory, type OpenStrategy } from "./PaymentOpener"; +import { PendingOrderRepo } from "./PendingOrderRepo"; +import PaymentPoller from "./PaymentPoller"; +import type { CreateOrderReq, PaymentResult, PendingOrder, OrderStatus } from "./types"; +import { ApiCode } from "../network/client/types"; + +export const PaymentEvents = { + Started: "pay-started", // { orderId } + UrlOpened: "pay-url-opened", + PollTick: "pay-poll-tick", // { orderId, status } + Finished: "pay-finished", // PaymentResult +}; + +export class PaymentService { + private static _I: PaymentService | null = null; + static get I() { return this._I ?? (this._I = new PaymentService()); } + private constructor() {} + + private bus = new EventTarget(); + + on(event: string, cb: (...args: any[]) => void, target?: any) { + this.bus.on(event, cb, target); + } + off(event: string, cb: (...args: any[]) => void, target?: any) { + this.bus.off(event, cb, target); + } + + /** 发起支付:创建订单→打开URL→回到App后开始轮询 */ + async startPayment(req: CreateOrderReq, open: OpenStrategy = "system"): Promise { + // 下单 + const create = await PaymentApi.I.createOrder(req); + if (create.code !== ApiCode.OK || !create.data) { + return { orderId: "", status: "FAILED", message: create.msg || "create order failed" }; + } + const { orderId, payUrl, expireAt } = create.data; + this.bus.emit(PaymentEvents.Started, { orderId }); + + // 存为未决订单(用于异常恢复) + PendingOrderRepo.instance.add({ orderId, channel: req.channel, createdAt: Date.now(), expireAt, productId: req.productId }); + + // 打开支付页 + await PaymentOpenerFactory.create(open).open(payUrl); + this.bus.emit(PaymentEvents.UrlOpened, { orderId }); + + // 等待回到前台(系统浏览器策略下) + // - 如果是 inapp/minigame,可在 WebView/回跳时立即开始轮询; + // - 这里给一个通用的“等待前台”方法(可用 Cocos 的 onShow/onHide 自行接入) + await this.waitAppResumeIfNeeded(open); + + // 轮询 + const poller = new PaymentPoller(); + const data = await poller.poll(orderId, { + maxDurationMs: 2 * 60 * 1000, + startIntervalMs: 2000, + maxIntervalMs: 10000, + jitter: true, + }, (d) => this.bus.emit(PaymentEvents.PollTick, { orderId, status: d.status })); + + // 产出结果 + let res: PaymentResult; + if (!data) { + res = { orderId, status: "EXPIRED", message: "poll timeout" }; + } else if (data.status === "SUCCESS") { + res = { orderId, status: "SUCCESS" }; + } else { + res = { orderId, status: data.status as OrderStatus, message: data.failureReason }; + } + + PendingOrderRepo.instance.remove(orderId); + this.bus.emit(PaymentEvents.Finished, res); + return res; + } + + /** App 回到前台后恢复未完成订单的轮询(在 onShow 时调用) */ + async resumePending(): Promise { + const all = PendingOrderRepo.instance.all(); + for (const o of all) { + // 可以做去重/只处理未过期的 + const r = await this.startPollingOnly(o.orderId); + if (r && r.status !== "PENDING" && r.status !== "CREATED") { + PendingOrderRepo.instance.remove(o.orderId); + this.bus.emit(PaymentEvents.Finished, { + orderId: o.orderId, + status: r.status as OrderStatus, + message: r.failureReason + } as PaymentResult); + } + } + } + + /** 仅轮询(用于 resumePending 或手动刷新) */ + private async startPollingOnly(orderId: string) { + const poller = new PaymentPoller(); + return poller.poll(orderId, { + maxDurationMs: 2 * 60 * 1000, + startIntervalMs: 2000, + maxIntervalMs: 8000, + jitter: true, + }); + } + + /** 等待“回到前台”的占位实现:实际请在 App 生命周期里调用 resumePending() */ + private async waitAppResumeIfNeeded(open: OpenStrategy) { + // 如果是系统浏览器,我们通常等“App 回到前台”再开始轮询; + // 这里简单 sleep 1s,实际项目请监听 Cocos 的 onShow/onHide 或平台回调。 + if (open === "system") { + await new Promise(res => setTimeout(res, 1000)); + } + } +} +export default PaymentService; diff --git a/assets/Scripts/chat18x/payment/PaymentService.ts.meta b/assets/Scripts/chat18x/payment/PaymentService.ts.meta new file mode 100644 index 00000000..5644cd5e --- /dev/null +++ b/assets/Scripts/chat18x/payment/PaymentService.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "4474d3e2-964e-49b9-9793-7edab2f9d007", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/payment/PendingOrderRepo.ts b/assets/Scripts/chat18x/payment/PendingOrderRepo.ts new file mode 100644 index 00000000..bb946447 --- /dev/null +++ b/assets/Scripts/chat18x/payment/PendingOrderRepo.ts @@ -0,0 +1,57 @@ +/** + * 本地持久化未决订单,断线/重启后可恢复 + * + */ + +import { sys } from "cc"; +import type { PendingOrder } from "./types"; + +export class PendingOrderRepo { + private static _instance: PendingOrderRepo | null = null; // 私有静态实例 + private static KEY = "pay:pending_orders"; // 本地存储的 key + private cache: PendingOrder[] | null = null; // 本地缓存 + + // 私有构造函数,禁止外部直接实例化 + private constructor() {} + + // 获取唯一实例 + public static get instance(): PendingOrderRepo { + if (!PendingOrderRepo._instance) { + PendingOrderRepo._instance = new PendingOrderRepo(); + } + return PendingOrderRepo._instance; + } + + // 加载数据 + private load(): PendingOrder[] { + if (this.cache) return this.cache; // 如果有缓存,直接返回 + const raw = sys.localStorage.getItem(PendingOrderRepo.KEY); // 从 localStorage 获取数据 + if (!raw) return (this.cache = []); // 如果没有数据,返回空数组 + try { return (this.cache = JSON.parse(raw) || []); } catch { return (this.cache = []); } // 解析失败时返回空数组 + } + + // 保存数据 + private save(list: PendingOrder[]) { + this.cache = list; // 更新缓存 + sys.localStorage.setItem(PendingOrderRepo.KEY, JSON.stringify(list)); // 存储到 localStorage + } + + // 添加未决订单 + add(o: PendingOrder) { + const list = this.load(); + list.unshift(o); // 将新订单添加到数组前面 + this.save(list.slice(0, 10)); // 保存最多 10 条订单 + } + + // 删除指定订单 + remove(orderId: string) { + const list = this.load().filter(x => x.orderId !== orderId); // 过滤掉指定订单 + this.save(list); // 更新数据 + } + + // 获取所有未决订单 + all(): PendingOrder[] { + return this.load(); // 返回加载的数据 + } +} + diff --git a/assets/Scripts/chat18x/payment/PendingOrderRepo.ts.meta b/assets/Scripts/chat18x/payment/PendingOrderRepo.ts.meta new file mode 100644 index 00000000..8f4deb0f --- /dev/null +++ b/assets/Scripts/chat18x/payment/PendingOrderRepo.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "5165ac21-6ad4-444b-8575-47a851305a31", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/Scripts/chat18x/payment/types.ts b/assets/Scripts/chat18x/payment/types.ts new file mode 100644 index 00000000..3d190b8f --- /dev/null +++ b/assets/Scripts/chat18x/payment/types.ts @@ -0,0 +1,51 @@ +/** + * 支付相关的类型定义 + * + */ + +export type PaymentChannel = "alipay" | "wxpay" | "stripe" | "paypal" | "url"; + +export type OrderStatus = + | "CREATED" // 已创建,待支付 + | "PENDING" // 服务器处理中 + | "SUCCESS" + | "FAILED" + | "CANCELED" + | "EXPIRED"; + +// 下单的请求数据 +export interface CreateOrderReq { + productId: string; + amount: number; // 分/元按后端定义 + currency: string; // "CNY" / "USD" ... + channel: PaymentChannel; // “alipay/wxpay/stripe/url”等 + extra?: Record; // 透传(区服、活动、角色信息等) +} + +export interface CreateOrderData { + orderId: string; + payUrl: string; // 这次集成的核心 + expireAt?: number; // ms +} + +// 查询订单的响应数据 +export interface QueryOrderData { + orderId: string; + status: OrderStatus; + paidAt?: number; // ms + failureReason?: string; +} + +export interface PaymentResult { + orderId: string; + status: OrderStatus; // SUCCESS / FAILED / CANCELED / EXPIRED + message?: string; // 失败原因/提示 +} + +export interface PendingOrder { + orderId: string; + channel: PaymentChannel; + createdAt: number; + expireAt?: number; + productId?: string; +} diff --git a/assets/Scripts/chat18x/payment/types.ts.meta b/assets/Scripts/chat18x/payment/types.ts.meta new file mode 100644 index 00000000..5c53f7e7 --- /dev/null +++ b/assets/Scripts/chat18x/payment/types.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "5d3e814f-7ee9-463f-a568-c5f721f73498", + "files": [], + "subMetas": {}, + "userData": {} +} From 5526a48cb94d8da39bc68b01db9e7bd62f9a8fdf Mon Sep 17 00:00:00 2001 From: chen wei bo <1025839511@qq.com> Date: Wed, 20 Aug 2025 10:41:58 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/chat18x/payment/PaymentService.ts | 70 ++++++++++++++++--- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/assets/Scripts/chat18x/payment/PaymentService.ts b/assets/Scripts/chat18x/payment/PaymentService.ts index 00f4898d..58c185a3 100644 --- a/assets/Scripts/chat18x/payment/PaymentService.ts +++ b/assets/Scripts/chat18x/payment/PaymentService.ts @@ -2,7 +2,7 @@ * 支付对外的相关接口 * */ -import { EventTarget } from "cc"; +import { EventTarget, game, Game } from "cc"; import { PaymentApi } from "./PaymentApi"; import { PaymentOpenerFactory, type OpenStrategy } from "./PaymentOpener"; import { PendingOrderRepo } from "./PendingOrderRepo"; @@ -79,21 +79,49 @@ export class PaymentService { /** App 回到前台后恢复未完成订单的轮询(在 onShow 时调用) */ async resumePending(): Promise { - const all = PendingOrderRepo.instance.all(); - for (const o of all) { - // 可以做去重/只处理未过期的 + const now = Date.now(); + const list = PendingOrderRepo.instance.all(); + + // 去重:同 orderId 只保留 createdAt 最新的一条 + const uniq = new Map(); + for (const o of list) { + const ex = uniq.get(o.orderId); + if (!ex || (o.createdAt ?? 0) > (ex.createdAt ?? 0)) { + uniq.set(o.orderId, o); + } + } + + for (const o of uniq.values()) { + // 只处理未过期 + if (this.isOrderExpired(o, now)) { + PendingOrderRepo.instance.remove(o.orderId); + this.bus.emit(PaymentEvents.Finished, { + orderId: o.orderId, + status: "EXPIRED" as OrderStatus, + message: "order expired", + } as PaymentResult); + continue; + } + + // 轮询最新且未过期的订单 const r = await this.startPollingOnly(o.orderId); if (r && r.status !== "PENDING" && r.status !== "CREATED") { PendingOrderRepo.instance.remove(o.orderId); this.bus.emit(PaymentEvents.Finished, { orderId: o.orderId, status: r.status as OrderStatus, - message: r.failureReason + message: r.failureReason, } as PaymentResult); } + // r === null(轮询超时)时保留在仓库,等待下一次 resume 再查 } } + /** 判断订单是否过期:有 expireAt 且 now >= expireAt 才认为过期 */ + private isOrderExpired(o: PendingOrder, now = Date.now()): boolean { + return typeof o.expireAt === "number" && now >= o.expireAt; + } + /** 仅轮询(用于 resumePending 或手动刷新) */ private async startPollingOnly(orderId: string) { const poller = new PaymentPoller(); @@ -106,12 +134,34 @@ export class PaymentService { } /** 等待“回到前台”的占位实现:实际请在 App 生命周期里调用 resumePending() */ - private async waitAppResumeIfNeeded(open: OpenStrategy) { - // 如果是系统浏览器,我们通常等“App 回到前台”再开始轮询; - // 这里简单 sleep 1s,实际项目请监听 Cocos 的 onShow/onHide 或平台回调。 - if (open === "system") { - await new Promise(res => setTimeout(res, 1000)); + private waitAppResumeIfNeeded(open: OpenStrategy): Promise { + if (open !== "system") { + // 内嵌 WebView / 小游戏平台通常可以在回调里直接开始轮询 + return Promise.resolve(); } + + return new Promise((resolve) => { + let finished = false; + const finish = () => { + if (finished) return; + finished = true; + // 安全移除监听 + game.off(Game.EVENT_SHOW, onShow, this); + resolve(); + }; + + const onShow = () => { + // 应用回到前台 + finish(); + }; + + // 监听一次“回到前台” + game.on(Game.EVENT_SHOW, onShow, this); + + // 兜底:某些环境(桌面浏览器)可能不会触发隐藏/显示事件,避免一直卡住 + const FALLBACK_MS = 15000; // 按需调整 + setTimeout(finish, FALLBACK_MS); + }); } } export default PaymentService; From 61b6f7e70b9f06527fdd55565da360614d49f345 Mon Sep 17 00:00:00 2001 From: zcl <25492220@QQ.COM> Date: Wed, 20 Aug 2025 13:49:49 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=B0=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/bundles/Chat18x/ThemePanel.prefab | 950 ++++++++++++++++------- 1 file changed, 665 insertions(+), 285 deletions(-) diff --git a/assets/bundles/Chat18x/ThemePanel.prefab b/assets/bundles/Chat18x/ThemePanel.prefab index 6ac8ca7e..3176249c 100644 --- a/assets/bundles/Chat18x/ThemePanel.prefab +++ b/assets/bundles/Chat18x/ThemePanel.prefab @@ -25,17 +25,17 @@ "_active": true, "_components": [ { - "__id__": 250 + "__id__": 266 }, { - "__id__": 252 + "__id__": 268 }, { - "__id__": 254 + "__id__": 270 } ], "_prefab": { - "__id__": 256 + "__id__": 272 }, "_lpos": { "__type__": "cc.Vec3", @@ -79,23 +79,23 @@ "__id__": 3 }, { - "__id__": 85 + "__id__": 101 } ], "_active": true, "_components": [ { - "__id__": 243 + "__id__": 259 }, { - "__id__": 245 + "__id__": 261 }, { - "__id__": 247 + "__id__": 263 } ], "_prefab": { - "__id__": 249 + "__id__": 265 }, "_lpos": { "__type__": "cc.Vec3", @@ -152,22 +152,25 @@ }, { "__id__": 74 + }, + { + "__id__": 78 } ], "_active": true, "_components": [ { - "__id__": 78 + "__id__": 94 }, { - "__id__": 80 + "__id__": 96 }, { - "__id__": 82 + "__id__": 98 } ], "_prefab": { - "__id__": 84 + "__id__": 100 }, "_lpos": { "__type__": "cc.Vec3", @@ -228,7 +231,7 @@ "_lpos": { "__type__": "cc.Vec3", "x": -355, - "y": 5.685999999999922, + "y": 31.785999999999923, "z": 0 }, "_lrot": { @@ -240,8 +243,8 @@ }, "_lscale": { "__type__": "cc.Vec3", - "x": 1, - "y": 1, + "x": 0.7, + "y": 0.7, "z": 1 }, "_mobility": 0, @@ -975,7 +978,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 59.08800000000008, + "x": 40.884000000000015, "y": 24.5, "z": 0 }, @@ -1016,7 +1019,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 92.5048828125, + "width": 104.00390625, "height": 50.4 }, "_anchorPoint": { @@ -1052,7 +1055,7 @@ "b": 255, "a": 255 }, - "_string": "99999", + "_string": "$9999", "_horizontalAlign": 0, "_verticalAlign": 1, "_actualFontSize": 30, @@ -1112,7 +1115,7 @@ }, "_alignFlags": 10, "_target": null, - "_left": 59.08800000000008, + "_left": 40.884000000000015, "_right": -120.41744140624996, "_top": 0, "_bottom": 0, @@ -1183,7 +1186,7 @@ "node": { "__id__": 34 }, - "_enabled": true, + "_enabled": false, "__prefab": { "__id__": 46 }, @@ -1935,6 +1938,383 @@ "targetOverrides": null, "nestedPrefabInstanceRoots": null }, + { + "__type__": "cc.Node", + "_name": "User", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 3 + }, + "_children": [ + { + "__id__": 79 + } + ], + "_active": true, + "_components": [ + { + "__id__": 87 + }, + { + "__id__": 89 + }, + { + "__id__": 91 + } + ], + "_prefab": { + "__id__": 93 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": -360.445, + "y": -57.613000000000056, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "coinNum", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 78 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 80 + }, + { + "__id__": 82 + }, + { + "__id__": 84 + } + ], + "_prefab": { + "__id__": 86 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 9.916999999999994, + "y": 24.5, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 79 + }, + "_enabled": true, + "__prefab": { + "__id__": 81 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 245.68359375, + "height": 50.4 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "fet6qzaQRKHr3gLdrlEbRe" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 79 + }, + "_enabled": true, + "__prefab": { + "__id__": 83 + }, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_string": "Uid:1234567890", + "_horizontalAlign": 0, + "_verticalAlign": 1, + "_actualFontSize": 30, + "_fontSize": 30, + "_fontFamily": "NotoSans-Regular", + "_lineHeight": 40, + "_overflow": 0, + "_enableWrapText": true, + "_font": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_isItalic": false, + "_isBold": true, + "_isUnderline": false, + "_underlineHeight": 2, + "_cacheMode": 0, + "_enableOutline": false, + "_outlineColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_outlineWidth": 2, + "_enableShadow": false, + "_shadowColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_shadowOffset": { + "__type__": "cc.Vec2", + "x": 2, + "y": 2 + }, + "_shadowBlur": 2, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "ediKjY2wxKnquQLPwkQ0da" + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 79 + }, + "_enabled": true, + "__prefab": { + "__id__": 85 + }, + "_alignFlags": 10, + "_target": null, + "_left": 9.916999999999994, + "_right": -120.41744140624996, + "_top": 0, + "_bottom": 0, + "_horizontalCenter": 0, + "_verticalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 92.5048828125, + "_originalHeight": 0, + "_alignMode": 2, + "_lockFlags": 0, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "c003ADQrhJ0L1CUnWcHh37" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "82q7320FJMi6ZfPDhbDdL/", + "instance": null, + "targetOverrides": null, + "nestedPrefabInstanceRoots": null + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 78 + }, + "_enabled": true, + "__prefab": { + "__id__": 88 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 50, + "height": 49 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "60LHQPH21AF6LRba6FBqjU" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 78 + }, + "_enabled": false, + "__prefab": { + "__id__": 90 + }, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_spriteFrame": { + "__uuid__": "9a65d1d8-eb95-4884-90af-92c758ccac4b@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 0, + "_fillType": 0, + "_sizeMode": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "0bMB0eH2BC3rQGxG9/7zNY" + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 78 + }, + "_enabled": true, + "__prefab": { + "__id__": 92 + }, + "_alignFlags": 36, + "_target": null, + "_left": 194.1, + "_right": 685.4449999999999, + "_top": 0, + "_bottom": 53.386999999999944, + "_horizontalCenter": 0, + "_verticalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 0, + "_originalHeight": 0, + "_alignMode": 2, + "_lockFlags": 8, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "d3J+FDYWJDRrZ/UuvC/G5o" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5dLLI5Fe5DEKyPgivwprFP", + "instance": null, + "targetOverrides": null, + "nestedPrefabInstanceRoots": null + }, { "__type__": "cc.UITransform", "_name": "", @@ -1945,7 +2325,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 79 + "__id__": 95 }, "_contentSize": { "__type__": "cc.Size", @@ -1973,7 +2353,7 @@ }, "_enabled": false, "__prefab": { - "__id__": 81 + "__id__": 97 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -2018,7 +2398,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 83 + "__id__": 99 }, "_alignFlags": 41, "_target": null, @@ -2067,29 +2447,29 @@ }, "_children": [ { - "__id__": 86 + "__id__": 102 }, { - "__id__": 156 + "__id__": 172 }, { - "__id__": 210 + "__id__": 226 } ], "_active": true, "_components": [ { - "__id__": 236 + "__id__": 252 }, { - "__id__": 238 + "__id__": 254 }, { - "__id__": 240 + "__id__": 256 } ], "_prefab": { - "__id__": 242 + "__id__": 258 }, "_lpos": { "__type__": "cc.Vec3", @@ -2126,30 +2506,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 85 + "__id__": 101 }, "_children": [ { - "__id__": 87 + "__id__": 103 }, { - "__id__": 95 + "__id__": 111 }, { - "__id__": 143 + "__id__": 159 } ], "_active": true, "_components": [ { - "__id__": 151 + "__id__": 167 }, { - "__id__": 153 + "__id__": 169 } ], "_prefab": { - "__id__": 155 + "__id__": 171 }, "_lpos": { "__type__": "cc.Vec3", @@ -2186,23 +2566,23 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 86 + "__id__": 102 }, "_children": [], "_active": true, "_components": [ { - "__id__": 88 + "__id__": 104 }, { - "__id__": 90 + "__id__": 106 }, { - "__id__": 92 + "__id__": 108 } ], "_prefab": { - "__id__": 94 + "__id__": 110 }, "_lpos": { "__type__": "cc.Vec3", @@ -2239,11 +2619,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 87 + "__id__": 103 }, "_enabled": true, "__prefab": { - "__id__": 89 + "__id__": 105 }, "_contentSize": { "__type__": "cc.Size", @@ -2267,11 +2647,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 87 + "__id__": 103 }, "_enabled": true, "__prefab": { - "__id__": 91 + "__id__": 107 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -2312,11 +2692,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 87 + "__id__": 103 }, "_enabled": true, "__prefab": { - "__id__": 93 + "__id__": 109 }, "_alignFlags": 45, "_target": null, @@ -2361,33 +2741,33 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 86 + "__id__": 102 }, "_children": [ - { - "__id__": 96 - }, { "__id__": 112 }, { - "__id__": 120 + "__id__": 128 }, { - "__id__": 128 + "__id__": 136 + }, + { + "__id__": 144 } ], "_active": true, "_components": [ { - "__id__": 138 + "__id__": 154 }, { - "__id__": 140 + "__id__": 156 } ], "_prefab": { - "__id__": 142 + "__id__": 158 }, "_lpos": { "__type__": "cc.Vec3", @@ -2424,30 +2804,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 95 + "__id__": 111 }, "_children": [ { - "__id__": 97 + "__id__": 113 } ], "_active": true, "_components": [ { - "__id__": 103 + "__id__": 119 }, { - "__id__": 105 + "__id__": 121 }, { - "__id__": 107 + "__id__": 123 }, { - "__id__": 109 + "__id__": 125 } ], "_prefab": { - "__id__": 111 + "__id__": 127 }, "_lpos": { "__type__": "cc.Vec3", @@ -2484,20 +2864,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 96 + "__id__": 112 }, "_children": [], "_active": true, "_components": [ { - "__id__": 98 + "__id__": 114 }, { - "__id__": 100 + "__id__": 116 } ], "_prefab": { - "__id__": 102 + "__id__": 118 }, "_lpos": { "__type__": "cc.Vec3", @@ -2534,11 +2914,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 97 + "__id__": 113 }, "_enabled": true, "__prefab": { - "__id__": 99 + "__id__": 115 }, "_contentSize": { "__type__": "cc.Size", @@ -2562,11 +2942,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 97 + "__id__": 113 }, "_enabled": true, "__prefab": { - "__id__": 101 + "__id__": 117 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -2620,11 +3000,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 96 + "__id__": 112 }, "_enabled": true, "__prefab": { - "__id__": 104 + "__id__": 120 }, "_contentSize": { "__type__": "cc.Size", @@ -2648,11 +3028,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 96 + "__id__": 112 }, "_enabled": true, "__prefab": { - "__id__": 106 + "__id__": 122 }, "_type": 3, "_inverted": false, @@ -2670,11 +3050,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 96 + "__id__": 112 }, "_enabled": true, "__prefab": { - "__id__": 108 + "__id__": 124 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -2715,11 +3095,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 96 + "__id__": 112 }, "_enabled": true, "__prefab": { - "__id__": 110 + "__id__": 126 }, "_alignFlags": 10, "_target": null, @@ -2764,23 +3144,23 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 95 + "__id__": 111 }, "_children": [], "_active": true, "_components": [ { - "__id__": 113 + "__id__": 129 }, { - "__id__": 115 + "__id__": 131 }, { - "__id__": 117 + "__id__": 133 } ], "_prefab": { - "__id__": 119 + "__id__": 135 }, "_lpos": { "__type__": "cc.Vec3", @@ -2817,11 +3197,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 112 + "__id__": 128 }, "_enabled": true, "__prefab": { - "__id__": 114 + "__id__": 130 }, "_contentSize": { "__type__": "cc.Size", @@ -2845,11 +3225,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 112 + "__id__": 128 }, "_enabled": true, "__prefab": { - "__id__": 116 + "__id__": 132 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -2913,11 +3293,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 112 + "__id__": 128 }, "_enabled": true, "__prefab": { - "__id__": 118 + "__id__": 134 }, "languageKey": "themepanel.recomandtext", "defaultText": "", @@ -2947,23 +3327,23 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 95 + "__id__": 111 }, "_children": [], "_active": true, "_components": [ { - "__id__": 121 + "__id__": 137 }, { - "__id__": 123 + "__id__": 139 }, { - "__id__": 125 + "__id__": 141 } ], "_prefab": { - "__id__": 127 + "__id__": 143 }, "_lpos": { "__type__": "cc.Vec3", @@ -3000,11 +3380,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 120 + "__id__": 136 }, "_enabled": true, "__prefab": { - "__id__": 122 + "__id__": 138 }, "_contentSize": { "__type__": "cc.Size", @@ -3028,11 +3408,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 120 + "__id__": 136 }, "_enabled": true, "__prefab": { - "__id__": 124 + "__id__": 140 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -3096,11 +3476,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 120 + "__id__": 136 }, "_enabled": true, "__prefab": { - "__id__": 126 + "__id__": 142 }, "languageKey": "girl_10001_name", "defaultText": "", @@ -3130,26 +3510,26 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 95 + "__id__": 111 }, "_children": [], "_active": true, "_components": [ { - "__id__": 129 + "__id__": 145 }, { - "__id__": 131 + "__id__": 147 }, { - "__id__": 133 + "__id__": 149 }, { - "__id__": 135 + "__id__": 151 } ], "_prefab": { - "__id__": 137 + "__id__": 153 }, "_lpos": { "__type__": "cc.Vec3", @@ -3186,11 +3566,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 128 + "__id__": 144 }, "_enabled": true, "__prefab": { - "__id__": 130 + "__id__": 146 }, "_contentSize": { "__type__": "cc.Size", @@ -3214,11 +3594,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 128 + "__id__": 144 }, "_enabled": true, "__prefab": { - "__id__": 132 + "__id__": 148 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -3259,11 +3639,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 128 + "__id__": 144 }, "_enabled": true, "__prefab": { - "__id__": 134 + "__id__": 150 }, "_alignFlags": 34, "_target": null, @@ -3295,11 +3675,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 128 + "__id__": 144 }, "_enabled": true, "__prefab": { - "__id__": 136 + "__id__": 152 }, "clickEvents": [], "_interactable": true, @@ -3364,11 +3744,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 95 + "__id__": 111 }, "_enabled": true, "__prefab": { - "__id__": 139 + "__id__": 155 }, "_contentSize": { "__type__": "cc.Size", @@ -3392,11 +3772,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 95 + "__id__": 111 }, "_enabled": true, "__prefab": { - "__id__": 141 + "__id__": 157 }, "_alignFlags": 45, "_target": null, @@ -3441,23 +3821,23 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 86 + "__id__": 102 }, "_children": [], "_active": true, "_components": [ { - "__id__": 144 + "__id__": 160 }, { - "__id__": 146 + "__id__": 162 }, { - "__id__": 148 + "__id__": 164 } ], "_prefab": { - "__id__": 150 + "__id__": 166 }, "_lpos": { "__type__": "cc.Vec3", @@ -3494,11 +3874,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 143 + "__id__": 159 }, "_enabled": true, "__prefab": { - "__id__": 145 + "__id__": 161 }, "_contentSize": { "__type__": "cc.Size", @@ -3522,11 +3902,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 143 + "__id__": 159 }, "_enabled": true, "__prefab": { - "__id__": 147 + "__id__": 163 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -3567,11 +3947,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 143 + "__id__": 159 }, "_enabled": true, "__prefab": { - "__id__": 149 + "__id__": 165 }, "_alignFlags": 45, "_target": null, @@ -3616,11 +3996,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 86 + "__id__": 102 }, "_enabled": true, "__prefab": { - "__id__": 152 + "__id__": 168 }, "_contentSize": { "__type__": "cc.Size", @@ -3644,11 +4024,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 86 + "__id__": 102 }, "_enabled": true, "__prefab": { - "__id__": 154 + "__id__": 170 }, "_alignFlags": 41, "_target": null, @@ -3693,39 +4073,39 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 85 + "__id__": 101 }, "_children": [ - { - "__id__": 157 - }, { "__id__": 173 }, - { - "__id__": 181 - }, { "__id__": 189 }, { - "__id__": 195 - } - ], - "_active": true, - "_components": [ - { - "__id__": 203 + "__id__": 197 }, { "__id__": 205 }, { - "__id__": 207 + "__id__": 211 + } + ], + "_active": true, + "_components": [ + { + "__id__": 219 + }, + { + "__id__": 221 + }, + { + "__id__": 223 } ], "_prefab": { - "__id__": 209 + "__id__": 225 }, "_lpos": { "__type__": "cc.Vec3", @@ -3762,30 +4142,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 156 + "__id__": 172 }, "_children": [ { - "__id__": 158 + "__id__": 174 } ], "_active": true, "_components": [ { - "__id__": 164 + "__id__": 180 }, { - "__id__": 166 + "__id__": 182 }, { - "__id__": 168 + "__id__": 184 }, { - "__id__": 170 + "__id__": 186 } ], "_prefab": { - "__id__": 172 + "__id__": 188 }, "_lpos": { "__type__": "cc.Vec3", @@ -3822,20 +4202,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 157 + "__id__": 173 }, "_children": [], "_active": true, "_components": [ { - "__id__": 159 + "__id__": 175 }, { - "__id__": 161 + "__id__": 177 } ], "_prefab": { - "__id__": 163 + "__id__": 179 }, "_lpos": { "__type__": "cc.Vec3", @@ -3872,11 +4252,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 158 + "__id__": 174 }, "_enabled": true, "__prefab": { - "__id__": 160 + "__id__": 176 }, "_contentSize": { "__type__": "cc.Size", @@ -3900,11 +4280,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 158 + "__id__": 174 }, "_enabled": true, "__prefab": { - "__id__": 162 + "__id__": 178 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -3958,11 +4338,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 157 + "__id__": 173 }, "_enabled": true, "__prefab": { - "__id__": 165 + "__id__": 181 }, "_contentSize": { "__type__": "cc.Size", @@ -3986,11 +4366,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 157 + "__id__": 173 }, "_enabled": true, "__prefab": { - "__id__": 167 + "__id__": 183 }, "_alignFlags": 45, "_target": null, @@ -4022,11 +4402,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 157 + "__id__": 173 }, "_enabled": true, "__prefab": { - "__id__": 169 + "__id__": 185 }, "_type": 3, "_inverted": false, @@ -4044,11 +4424,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 157 + "__id__": 173 }, "_enabled": true, "__prefab": { - "__id__": 171 + "__id__": 187 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -4102,23 +4482,23 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 156 + "__id__": 172 }, "_children": [], "_active": true, "_components": [ { - "__id__": 174 + "__id__": 190 }, { - "__id__": 176 + "__id__": 192 }, { - "__id__": 178 + "__id__": 194 } ], "_prefab": { - "__id__": 180 + "__id__": 196 }, "_lpos": { "__type__": "cc.Vec3", @@ -4155,11 +4535,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 173 + "__id__": 189 }, "_enabled": true, "__prefab": { - "__id__": 175 + "__id__": 191 }, "_contentSize": { "__type__": "cc.Size", @@ -4183,11 +4563,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 173 + "__id__": 189 }, "_enabled": true, "__prefab": { - "__id__": 177 + "__id__": 193 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -4251,11 +4631,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 173 + "__id__": 189 }, "_enabled": true, "__prefab": { - "__id__": 179 + "__id__": 195 }, "_alignFlags": 12, "_target": null, @@ -4300,23 +4680,23 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 156 + "__id__": 172 }, "_children": [], "_active": true, "_components": [ { - "__id__": 182 + "__id__": 198 }, { - "__id__": 184 + "__id__": 200 }, { - "__id__": 186 + "__id__": 202 } ], "_prefab": { - "__id__": 188 + "__id__": 204 }, "_lpos": { "__type__": "cc.Vec3", @@ -4353,11 +4733,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 181 + "__id__": 197 }, "_enabled": true, "__prefab": { - "__id__": 183 + "__id__": 199 }, "_contentSize": { "__type__": "cc.Size", @@ -4381,11 +4761,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 181 + "__id__": 197 }, "_enabled": true, "__prefab": { - "__id__": 185 + "__id__": 201 }, "_alignFlags": 45, "_target": null, @@ -4417,11 +4797,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 181 + "__id__": 197 }, "_enabled": true, "__prefab": { - "__id__": 187 + "__id__": 203 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -4475,20 +4855,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 156 + "__id__": 172 }, "_children": [], "_active": true, "_components": [ { - "__id__": 190 + "__id__": 206 }, { - "__id__": 192 + "__id__": 208 } ], "_prefab": { - "__id__": 194 + "__id__": 210 }, "_lpos": { "__type__": "cc.Vec3", @@ -4505,8 +4885,8 @@ }, "_lscale": { "__type__": "cc.Vec3", - "x": 1, - "y": 1, + "x": 0.6, + "y": 0.6, "z": 1 }, "_mobility": 0, @@ -4525,11 +4905,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 189 + "__id__": 205 }, "_enabled": true, "__prefab": { - "__id__": 191 + "__id__": 207 }, "_contentSize": { "__type__": "cc.Size", @@ -4553,11 +4933,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 189 + "__id__": 205 }, "_enabled": true, "__prefab": { - "__id__": 193 + "__id__": 209 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -4611,23 +4991,23 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 156 + "__id__": 172 }, "_children": [], "_active": true, "_components": [ { - "__id__": 196 + "__id__": 212 }, { - "__id__": 198 + "__id__": 214 }, { - "__id__": 200 + "__id__": 216 } ], "_prefab": { - "__id__": 202 + "__id__": 218 }, "_lpos": { "__type__": "cc.Vec3", @@ -4664,11 +5044,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 195 + "__id__": 211 }, "_enabled": true, "__prefab": { - "__id__": 197 + "__id__": 213 }, "_contentSize": { "__type__": "cc.Size", @@ -4692,11 +5072,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 195 + "__id__": 211 }, "_enabled": true, "__prefab": { - "__id__": 199 + "__id__": 215 }, "_alignFlags": 45, "_target": null, @@ -4728,11 +5108,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 195 + "__id__": 211 }, "_enabled": true, "__prefab": { - "__id__": 201 + "__id__": 217 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -4786,11 +5166,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 156 + "__id__": 172 }, "_enabled": true, "__prefab": { - "__id__": 204 + "__id__": 220 }, "_contentSize": { "__type__": "cc.Size", @@ -4814,11 +5194,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 156 + "__id__": 172 }, "_enabled": true, "__prefab": { - "__id__": 206 + "__id__": 222 }, "clickEvents": [], "_interactable": true, @@ -4858,7 +5238,7 @@ "_duration": 0.1, "_zoomScale": 0.95, "_target": { - "__id__": 156 + "__id__": 172 }, "_id": "" }, @@ -4872,23 +5252,23 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 156 + "__id__": 172 }, "_enabled": true, "__prefab": { - "__id__": 208 + "__id__": 224 }, "lockImg": { - "__id__": 192 + "__id__": 208 }, "lockCover": { - "__id__": 186 + "__id__": 202 }, "titleName": { - "__id__": 176 + "__id__": 192 }, "img": { - "__id__": 161 + "__id__": 177 }, "_id": "" }, @@ -4915,30 +5295,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 85 + "__id__": 101 }, "_children": [ { - "__id__": 211 + "__id__": 227 } ], "_active": true, "_components": [ { - "__id__": 227 + "__id__": 243 }, { - "__id__": 229 + "__id__": 245 }, { - "__id__": 231 + "__id__": 247 }, { - "__id__": 233 + "__id__": 249 } ], "_prefab": { - "__id__": 235 + "__id__": 251 }, "_lpos": { "__type__": "cc.Vec3", @@ -4975,30 +5355,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 210 + "__id__": 226 }, "_children": [ { - "__id__": 212 + "__id__": 228 } ], "_active": true, "_components": [ { - "__id__": 218 + "__id__": 234 }, { - "__id__": 220 + "__id__": 236 }, { - "__id__": 222 + "__id__": 238 }, { - "__id__": 224 + "__id__": 240 } ], "_prefab": { - "__id__": 226 + "__id__": 242 }, "_lpos": { "__type__": "cc.Vec3", @@ -5035,20 +5415,20 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 211 + "__id__": 227 }, "_children": [], "_active": true, "_components": [ { - "__id__": 213 + "__id__": 229 }, { - "__id__": 215 + "__id__": 231 } ], "_prefab": { - "__id__": 217 + "__id__": 233 }, "_lpos": { "__type__": "cc.Vec3", @@ -5085,11 +5465,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 212 + "__id__": 228 }, "_enabled": true, "__prefab": { - "__id__": 214 + "__id__": 230 }, "_contentSize": { "__type__": "cc.Size", @@ -5113,11 +5493,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 212 + "__id__": 228 }, "_enabled": true, "__prefab": { - "__id__": 216 + "__id__": 232 }, "_resizeMode": 1, "_layoutType": 3, @@ -5164,16 +5544,16 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 211 + "__id__": 227 }, "_enabled": true, "__prefab": { - "__id__": 219 + "__id__": 235 }, "_contentSize": { "__type__": "cc.Size", "width": 730, - "height": 802.319 + "height": 802.3190000000002 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5192,11 +5572,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 211 + "__id__": 227 }, "_enabled": true, "__prefab": { - "__id__": 221 + "__id__": 237 }, "_type": 0, "_inverted": false, @@ -5214,11 +5594,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 211 + "__id__": 227 }, "_enabled": true, "__prefab": { - "__id__": 223 + "__id__": 239 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -5260,11 +5640,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 211 + "__id__": 227 }, "_enabled": true, "__prefab": { - "__id__": 225 + "__id__": 241 }, "_alignFlags": 45, "_target": null, @@ -5309,16 +5689,16 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 210 + "__id__": 226 }, "_enabled": true, "__prefab": { - "__id__": 228 + "__id__": 244 }, "_contentSize": { "__type__": "cc.Size", "width": 730, - "height": 802.319 + "height": 802.3190000000002 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5337,11 +5717,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 210 + "__id__": 226 }, "_enabled": false, "__prefab": { - "__id__": 230 + "__id__": 246 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -5382,11 +5762,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 210 + "__id__": 226 }, "_enabled": true, "__prefab": { - "__id__": 232 + "__id__": 248 }, "bounceDuration": 0.23, "brake": 0.75, @@ -5397,7 +5777,7 @@ "cancelInnerEvents": true, "scrollEvents": [], "_content": { - "__id__": 212 + "__id__": 228 }, "_horizontalScrollBar": null, "_verticalScrollBar": null, @@ -5413,11 +5793,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 210 + "__id__": 226 }, "_enabled": true, "__prefab": { - "__id__": 234 + "__id__": 250 }, "_alignFlags": 45, "_target": null, @@ -5462,16 +5842,16 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 85 + "__id__": 101 }, "_enabled": true, "__prefab": { - "__id__": 237 + "__id__": 253 }, "_contentSize": { "__type__": "cc.Size", "width": 750, - "height": 1160.7999999999997 + "height": 1160.8 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5490,11 +5870,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 85 + "__id__": 101 }, "_enabled": false, "__prefab": { - "__id__": 239 + "__id__": 255 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -5535,11 +5915,11 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 85 + "__id__": 101 }, "_enabled": true, "__prefab": { - "__id__": 241 + "__id__": 257 }, "_alignFlags": 45, "_target": null, @@ -5588,12 +5968,12 @@ }, "_enabled": true, "__prefab": { - "__id__": 244 + "__id__": 260 }, "_contentSize": { "__type__": "cc.Size", "width": 750, - "height": 1333.9999999999998 + "height": 1334 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5616,7 +5996,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 246 + "__id__": 262 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -5661,7 +6041,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 248 + "__id__": 264 }, "_alignFlags": 45, "_target": null, @@ -5710,12 +6090,12 @@ }, "_enabled": true, "__prefab": { - "__id__": 251 + "__id__": 267 }, "_contentSize": { "__type__": "cc.Size", "width": 750, - "height": 1333.9999999999998 + "height": 1334 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5738,7 +6118,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 253 + "__id__": 269 }, "_alignFlags": 45, "_target": null, @@ -5774,7 +6154,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 255 + "__id__": 271 }, "m_rootNode": null, "_id": ""