From 48aed26725ff01781f567efbc3e6de82185f82c5 Mon Sep 17 00:00:00 2001 From: ud18010 Date: Tue, 28 Jul 2026 11:54:07 +0800 Subject: [PATCH] feat: add world chat UI --- Client/Assets/Doc/Rule/UIGenerationPrompt.md | 168 + .../Doc/Rule/UIGenerationPrompt.md.meta | 7 + Client/Assets/Doc/Rule/UIGenerationRules.md | 297 ++ .../Assets/Doc/Rule/UIGenerationRules.md.meta | 7 + Client/Assets/Doc/Rule/UnityProject.md | 8 +- .../Shared/Protocol/FrameworkMessages.cs | 50 + .../Game/Art/UI/Prefab/UI_CommonChat.prefab | 2952 +++++++++++++++++ .../Art/UI/Prefab/UI_CommonChat.prefab.meta | 7 + .../Art/UI/Prefab/UI_LobbyJoystick.prefab | 110 +- .../Script/Editor/JsonUIPrefabBuilder.cs | 196 +- Client/Assets/Script/Editor/XWorldUtil.cs | 2 +- .../JsonUIPrefabBuilderInputFieldTests.cs | 157 + ...JsonUIPrefabBuilderInputFieldTests.cs.meta | 11 + .../Tests/EditMode/UIManagerAttachTests.cs | 52 + .../EditMode/UIManagerAttachTests.cs.meta | 11 + .../EditMode/XWorld.Link.EditModeTests.asmdef | 6 +- .../XWorldJsonPrefabAutoConvertTests.cs | 35 + .../XWorldJsonPrefabAutoConvertTests.cs.meta | 11 + .../Script/xmain/Client/CSharpClientApp.cs | 48 + .../xmain/Client/LobbyWorldController.cs | 5 +- .../Assets/Script/xmain/Client/UIManager.cs | 47 + .../Script/xmain/Module/WorldChatModule.cs | 383 +++ .../xmain/Module/WorldChatModule.cs.meta | 11 + Doc/UIPrefabCreater/UI_CommonChat.json | 718 ++++ .../FrameworkMessagesTests.cs | 23 + Server/Gateway.Tests/ServerLoopTests.cs | 33 + Server/Gateway/ServerLoop.cs | 39 + Server/Gateway/SessionManager.cs | 13 + 28 files changed, 5308 insertions(+), 99 deletions(-) create mode 100644 Client/Assets/Doc/Rule/UIGenerationPrompt.md create mode 100644 Client/Assets/Doc/Rule/UIGenerationPrompt.md.meta create mode 100644 Client/Assets/Doc/Rule/UIGenerationRules.md create mode 100644 Client/Assets/Doc/Rule/UIGenerationRules.md.meta create mode 100644 Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab create mode 100644 Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab.meta create mode 100644 Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs create mode 100644 Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs.meta create mode 100644 Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs create mode 100644 Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs.meta create mode 100644 Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs create mode 100644 Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs.meta create mode 100644 Client/Assets/Script/xmain/Module/WorldChatModule.cs create mode 100644 Client/Assets/Script/xmain/Module/WorldChatModule.cs.meta create mode 100644 Doc/UIPrefabCreater/UI_CommonChat.json diff --git a/Client/Assets/Doc/Rule/UIGenerationPrompt.md b/Client/Assets/Doc/Rule/UIGenerationPrompt.md new file mode 100644 index 00000000..358260da --- /dev/null +++ b/Client/Assets/Doc/Rule/UIGenerationPrompt.md @@ -0,0 +1,168 @@ +# UI 生成提示词(AI JSON 生成契约) + +> 可直接作为系统提示词投喂给 AI。完整流程、排错和维护说明见 `Client/Assets/Doc/Rule/UIGenerationRules.md`。 + +你是本项目的 Unity UI 原型生成器。你的**唯一产物是一份 JSON**,写入 `Doc/UIPrefabCreater/{界面名}.json`,由 Unity 编辑器自动转换为 UGUI Prefab。不要输出 HTML、C#、Lua、Markdown 说明或浏览器 CSS。JSON 必须符合 `JsonUIPrefabBuilder` 当前支持的字段和组件能力。 + +## 1. 强制上下文 + +生成前必须遵守以下项目文档: + +- `Client/Assets/Doc/Rule/UnityProject.md`:Unity 工程目录、JSON→Prefab 管线、UI 挂载、资源加载和小游戏规则。 +- `Doc/design/UI_Design_Principles.md`:休闲卡通糖果风、配色、字体、控件视觉规范。 +- `Doc/design/UI_Pic_Set.md`:通用 UI 切图、Sprite 名、九宫格 Border 与用途。 +- `Doc/UIPrefabCreater/UI_LobbyJoystick.json`、`Doc/UIPrefabCreater/UI_MiniGameResult.json`:JSON 写法参考。 + +## 2. 唯一产物 + +只输出一个 JSON 根对象,必须包含: + +- `schemaVersion`:当前使用 `1`。 +- `prefabName`:Prefab 名,必须与根节点 `name` 完全一致。 +- `prefabPath`:必须位于 Unity `Assets/` 下。通用 UI 使用 `Assets/Game/Art/UI/Prefab/{prefabName}.prefab`;小游戏专属 UI 使用对应小游戏目录,不要写入通用 `Game` 目录。 +- `description`:说明界面用途、挂载层级、运行时绑定方式和特殊适配原因。 +- `canvas.canvasScaler.referenceResolution`:必须为 `[2048, 1024]`。 +- `assets.sprites`:本 JSON 中所有 Image/Button 使用的 Sprite 短名到资源路径的映射。 +- `nodes`:所有需要生成 Unity GameObject 的节点。 +- `bindings`:业务代码需要按名访问的节点名数组,可为空数组。 +- `events`:点击等事件声明数组,可为空数组。 + +## 3. JSON 骨架 + +```json +{ + "schemaVersion": 1, + "prefabName": "UI_Example", + "prefabPath": "Assets/Game/Art/UI/Prefab/UI_Example.prefab", + "description": "Normal 层普通功能界面。运行时控制器按 bindings/events 绑定节点。", + "canvas": { + "canvasScaler": { + "referenceResolution": [2048, 1024], + "matchWidthOrHeight": 0.5 + } + }, + "assets": { + "sprites": { + "ui_panel_main": "Assets/Game/Art/UI/Texture/Common/ui_panel_main.png", + "btn_primary_normal": "Assets/Game/Art/UI/Texture/Common/btn_primary_normal.png", + "btn_primary_hover": "Assets/Game/Art/UI/Texture/Common/btn_primary_hover.png", + "btn_primary_pressed": "Assets/Game/Art/UI/Texture/Common/btn_primary_pressed.png", + "btn_primary_disabled": "Assets/Game/Art/UI/Texture/Common/btn_primary_disabled.png" + } + }, + "nodes": [], + "bindings": [], + "events": [] +} +``` + +## 4. 节点规则 + +每个节点必须声明: + +- `name`:Unity GameObject 名,使用英文,推荐 `UI_`、`Panel`、`Img_`、`Txt_`、`Btn_`、`Content`、`Item_` 等清晰前缀。 +- `parent`:父节点名;根节点为 `null`。父节点必须在 `nodes` 数组中先于子节点出现。 +- `active`:是否默认激活。 +- `rect`:RectTransform 参数。 +- `components`:组件数组,可为空数组。 + +`rect` 优先使用: + +- 常规固定位置:`anchorMin`、`anchorMax`、`pivot`、`anchoredPosition`、`sizeDelta`。 +- 全屏或拉伸区域:`anchorMin`、`anchorMax`、`offsetMin`、`offsetMax`。 + +同一父节点下,`nodes` 数组越靠后的节点显示在越上层。 + +## 5. 当前转换器支持的组件 + +以 `Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs` 当前代码为准,可直接生成的组件包括: + +- `Canvas` +- `CanvasScaler` +- `GraphicRaycaster` +- `CanvasGroup` +- `Image` +- `TextMeshProUGUI` +- `Button` +- `Shadow` +- `Outline` +- `ScrollRect` +- `RectMask2D` +- `Mask` +- `TMP_InputField` +- `VerticalLayoutGroup` +- `ContentSizeFitter` +- `LayoutElement` +- `MonoBehaviour` + +以下组件在项目规则中允许声明,但当前转换器尚未完整实现或会跳过,生成时不要依赖它们直接可用: + +- `Toggle` +- `TMP_Dropdown` +- `Slider` +- `Scrollbar` +- `ScrollView` + +如果需求必须使用这些控件,可以先用 `Image`、`TextMeshProUGUI`、`Button`、`ScrollRect` 等生成可视骨架,并在 `description` 说明需要人工或后续转换器补齐。 + +## 6. 视觉与素材规则 + +- 风格必须符合休闲、友好、明快的卡通糖果风:大圆角、深色描边、顶部高光、柔和阴影、高饱和按钮。 +- 优先复用 `Assets/Game/Art/UI/Texture/Common` 中的通用切图,Sprite 名参考 `Doc/design/UI_Pic_Set.md`。 +- 所有可拉伸容器、按钮、输入底、列表项、进度底等必须使用 `"imageType": "Sliced"`。 +- 普通图标、关闭按钮、返回按钮等使用 `"imageType": "Simple"`。 +- 文字统一使用 `TextMeshProUGUI`,字体遵循项目默认思源黑体。 +- 浅色文字在按钮、复杂背景、深色或高饱和背景上必须使用 `Outline` 或 `Shadow`,颜色优先 `#102033` 或 `#0B1724`,不要默认纯黑。 +- 间距使用 8 的倍数,内容区留白通常不小于 24,安全区不小于 24。 +- 按钮优先使用 `Image + Button`,`Button.transition` 使用 `SpriteSwap`,并提供 normal/hover/pressed/disabled 状态图。 +- 需要新贴图时,先在 `description` 标明缺图;实际贴图用 gptimage2 按项目风格生成到对应目录。小游戏专属贴图必须生成到小游戏自己的资源目录结构。 + +## 7. 事件与绑定 + +- 业务代码需要访问的节点必须加入 `bindings`,例如 `["Txt_Title", "Btn_Start"]`。 +- 可点击按钮组件中声明 `onClick` 字符串,并在根对象 `events` 中登记: + +```json +"events": [ + { "name": "Example.Start", "node": "Btn_Start" } +] +``` + +`onClick` 只是事件标记,不会在 Prefab 中写死 Unity 回调。运行时 C# 控制器按事件名和节点名绑定。 + +需要挂载脚本时,在根节点或业务节点上声明: + +```json +{ + "type": "MonoBehaviour", + "typeName": "XGame.ExampleController" +} +``` + +## 8. 层级与挂载意图 + +在 `description` 中明确界面所属层级: + +- `HUD`:常驻战斗/大厅信息,如血条、摇杆、小地图。 +- `Normal`:普通功能面板,如背包、设置、商城。 +- `Dialog`:模态弹窗、二次确认。 +- `Tips`:Toast、飘字、轻提示。 + +Prefab 生成后运行时必须挂到 `UIRoot` 下对应层级,不要直接挂到 `UIRoot`。 + +## 9. 输出前自检 + +输出 JSON 前逐条检查: + +- [ ] 只输出 JSON,不输出解释文本。 +- [ ] `prefabName` 与唯一根节点 `name` 一致。 +- [ ] 只有一个 `parent: null` 的根节点。 +- [ ] `prefabPath` 在 `Assets/` 下,且目录符合通用/小游戏资源规则。 +- [ ] `referenceResolution` 为 `[2048, 1024]`。 +- [ ] 每个节点有 `name`、`parent`、`active`、`rect`、`components`。 +- [ ] 父节点先于子节点出现,所有父节点名真实存在。 +- [ ] 所有 `Image`、`Button` 使用的 Sprite 都已登记到 `assets.sprites`。 +- [ ] 九宫格控件声明 `"imageType": "Sliced"`。 +- [ ] 文字使用 `TextMeshProUGUI`,关键浅色字有轻描边或阴影。 +- [ ] 事件节点存在于 `nodes`,绑定节点存在于 `nodes`。 +- [ ] 不依赖当前转换器未实现的组件完成核心功能。 diff --git a/Client/Assets/Doc/Rule/UIGenerationPrompt.md.meta b/Client/Assets/Doc/Rule/UIGenerationPrompt.md.meta new file mode 100644 index 00000000..519c5f9a --- /dev/null +++ b/Client/Assets/Doc/Rule/UIGenerationPrompt.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7aa6827799244d9ba13792d52a13f7e9 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Doc/Rule/UIGenerationRules.md b/Client/Assets/Doc/Rule/UIGenerationRules.md new file mode 100644 index 00000000..d00b772f --- /dev/null +++ b/Client/Assets/Doc/Rule/UIGenerationRules.md @@ -0,0 +1,297 @@ +# UI 生成规则(AI JSON 生成流程 + 人类参考) + +> 本文档面向“AI 根据需求生成 JSON → Unity 自动转换为 Prefab → C# 接管业务”的本项目 UI 自动生成流程。 +> +> - **Part A**:整体流水线。 +> - **Part B**:AI 生成契约。 +> - **Part C**:生成后接管与排错。 +> - **Part D**:后续扩展建议。 +> +> 可直接投喂 AI 的精简系统提示词见 `Client/Assets/Doc/Rule/UIGenerationPrompt.md`。 + +--- + +## Part A - 整体流水线 + +本项目采用 JSON-first 流程,不引入参考项目的 HTML 中间层: + +```text +需求说明 + -> AI 读取项目规则/设计规范/切图清单/现有 JSON 示例 + -> 生成 Doc/UIPrefabCreater/{UIName}.json + -> Unity 重新获得焦点或手动菜单触发 + -> JsonUIPrefabBuilder 生成 Assets/.../{UIName}.prefab + -> C# MonoBehaviour/业务代码按节点名、bindings、events 接管 +``` + +### A1. 为什么不使用 HTML + +参考项目的核心经验是“AI 产物契约 + 自动转换触发 + 自检清单”,不是 HTML 格式本身。本项目已经有 `Doc/UIPrefabCreater/*.json` 到 Prefab 的转换器,直接让 AI 输出 JSON 能减少一层转换误差,并且更贴近 Unity 的 RectTransform、组件、SpriteSwap 和 bindings/events。 + +### A2. 自动转换入口 + +转换器相关代码: + +- `Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs` +- `Client/Assets/Script/Editor/XWorldUtil.cs` + +可用入口: + +- Unity 菜单 `Tools/UI/Generate Prefab From JSON...` +- Unity 菜单 `Tools/UI/Generate All Prefabs From JSON` +- Unity 菜单 `XWorld/UI/Convert Changed JSON Prefabs Now` +- Unity 菜单 `XWorld/UI/Auto Convert JSON On Focus` + +自动转换开启后,Unity 重新获得焦点时会扫描 `Doc/UIPrefabCreater`,只转换比目标 Prefab 更新的 UI JSON。 + +### A3. 目录约定 + +JSON 输入: + +- `Doc/UIPrefabCreater/{UIName}.json` + +通用 UI 产物: + +- `Assets/Game/Art/UI/Prefab/{UIName}.prefab` +- `Assets/Game/Art/UI/Texture/Common/{sprite}.png` +- `Assets/Game/Art/UI/Font/SourceHanSansCN-Regular.otf` + +小游戏专属 UI 产物: + +- 按 `UnityProject.md` 规则,将通用资源目录中的 `Game` 替换为小游戏名。 +- 小游戏专属贴图不要生成到通用 `Assets/Game/...` 目录。 + +--- + +## Part B - AI 生成契约 + +### B1. 输入信息模板 + +给 AI 生成 UI 时,建议提供以下信息: + +```text +界面名: +所属层级:HUD / Normal / Dialog / Tips +使用场景: +目标用户操作: +需要显示的数据: +需要点击/拖拽/输入的控件: +业务绑定节点: +事件名: +是否小游戏专属: +是否需要新贴图: +特殊适配要求: +``` + +### B2. 必读上下文 + +AI 生成前必须参考: + +- `Client/Assets/Doc/Rule/UnityProject.md` +- `Doc/design/UI_Design_Principles.md` +- `Doc/design/UI_Pic_Set.md` +- `Doc/UIPrefabCreater/UI_LobbyJoystick.json` +- `Doc/UIPrefabCreater/UI_MiniGameResult.json` +- `Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs` 的当前支持能力 + +### B3. JSON 顶层字段 + +| 字段 | 要求 | +| --- | --- | +| `schemaVersion` | 当前为 `1` | +| `prefabName` | 与根节点 `name` 完全一致 | +| `prefabPath` | 必须位于 `Assets/` 下 | +| `description` | 描述用途、层级、运行时绑定、特殊适配 | +| `canvas` | 必须包含 `canvasScaler.referenceResolution: [2048,1024]` | +| `assets` | 统一登记 Sprite 短名和路径 | +| `nodes` | 每个 Unity 节点一条记录 | +| `bindings` | C# 需要按名访问的节点 | +| `events` | 事件名与触发节点 | + +### B4. 节点命名 + +节点名必须英文,便于 C# `transform.Find` 或递归查找: + +| 类型 | 推荐命名 | +| --- | --- | +| 根节点 | `UI_Xxx` | +| 面板 | `Panel` / `Panel_Main` / `Panel_Content` | +| 图片 | `Img_Mask` / `Img_Bg` / `Img_Icon` | +| 文本 | `Txt_Title` / `Txt_Count` / `Txt_Desc` | +| 按钮 | `Btn_Start` / `Btn_Close` / `Btn_Ok` | +| 列表 | `Scroll_List` / `Viewport` / `Content` / `Item_Template` | +| 业务区域 | `Group_Top` / `Group_Info` / `Group_Actions` | + +### B5. 当前可直接生成的组件 + +`JsonUIPrefabBuilder` 当前可直接创建: + +- `Canvas` +- `CanvasScaler` +- `GraphicRaycaster` +- `CanvasGroup` +- `Image` +- `TextMeshProUGUI` +- `Button` +- `Shadow` +- `Outline` +- `ScrollRect` +- `RectMask2D` +- `Mask` +- `TMP_InputField` +- `VerticalLayoutGroup` +- `ContentSizeFitter` +- `LayoutElement` +- `MonoBehaviour` + +项目规则文档中出现但当前转换器尚未完整实现的组件,要谨慎使用: + +- `Toggle` +- `TMP_Dropdown` +- `Slider` +- `Scrollbar` +- `ScrollView` + +其中 `Toggle` 当前会被识别为已知但未实现组件并跳过;`TMP_InputField` 已支持生成与绑定;`ScrollView` 应改用当前代码支持的 `ScrollRect` 结构。 + +### B6. 常用结构模板 + +#### 普通面板 + +- 根节点:可按需要挂 `Canvas`、`CanvasScaler`、`GraphicRaycaster`,或作为由外部 Canvas 承载的子树。 +- 背景遮罩:Dialog 层使用 `Img_Mask`,全屏拉伸,Sprite `ui_overlay_dim`。 +- 主面板:`Panel` 使用 `ui_panel_main` 或 `ui_panel_popup`,`imageType: Sliced`。 +- 标题:`Txt_Title`,字号 36-52,根据界面层级调整。 +- 内容区:`ui_panel_content`,留白不小于 24。 +- 操作区:按钮组放在底部,主行为用绿色 `btn_primary_*`。 + +#### 按钮 + +按钮节点通常同时包含 `Image` 和 `Button`: + +```json +{ + "type": "Image", + "sprite": "btn_primary_normal", + "imageType": "Sliced", + "raycastTarget": true, + "color": "#FFFFFFFF" +}, +{ + "type": "Button", + "transition": "SpriteSwap", + "spriteHighlighted": "btn_primary_hover", + "spritePressed": "btn_primary_pressed", + "spriteDisabled": "btn_primary_disabled", + "onClick": "Example.Confirm" +} +``` + +按钮文字作为按钮子节点,使用 `TextMeshProUGUI`。浅色按钮文字必须加轻量 `Outline` 或 `Shadow`。 + +#### 滚动列表 + +当前使用 `ScrollRect`,推荐结构: + +```text +Scroll_List (Image + ScrollRect) + Viewport (Image + RectMask2D) + Content (VerticalLayoutGroup + ContentSizeFitter) + Item_Template (Image + LayoutElement, active=false) +``` + +`ScrollRect` 组件通过 `viewport` 和 `content` 字段引用节点名。 + +#### HUD + +HUD 节点应尽量少用模态遮罩。角落信息使用对应角的锚点;摇杆、血条、状态条等优先使用拉伸或角锚,避免写死只适配一个屏幕比例。 + +--- + +## Part C - 生成后接管与排错 + +### C1. 生成后接管步骤 + +1. 打开 Unity,确认 JSON 自动转换是否开启,或手动执行 `XWorld/UI/Convert Changed JSON Prefabs Now`。 +2. 检查 Console 中 `[UIGen]` 日志,确认没有错误,警告均可解释。 +3. 打开生成 Prefab,核对层级、RectTransform、Sprite、文字、按钮状态。 +4. 根节点或业务节点按需挂 `MonoBehaviour` 控制器,或让 JSON 中的 `MonoBehaviour.typeName` 自动添加。 +5. C# 通过 `transform.Find`、递归查找或 `Utility.FindTransform` 获取 `TextMeshProUGUI`、`Button`、`Image`、`RectTransform` 等组件。 +6. 按 `bindings` 和 `events` 绑定数据刷新与点击回调。 +7. 运行时资源加载必须使用异步接口,不要新写同步资源加载。 + +### C2. 常见问题 + +| 现象 | 原因 | 处理 | +| --- | --- | --- | +| JSON 不转换 | 自动转换关闭、Unity 未重新获得焦点、JSON 不比 Prefab 新 | 手动执行 `Convert Changed JSON Prefabs Now` | +| `referenceResolution 必须为 [2048, 1024]` | 画布分辨率错误 | 改为 `[2048,1024]`,特殊情况写入 `description` 并同步调整转换器规则 | +| `根节点数量必须为 1` | 多个 `parent:null` | 只保留一个根节点 | +| `prefabName 必须与根节点名一致` | 顶层命名不一致 | 统一 `prefabName` 与根节点 `name` | +| `找不到 Sprite` | `assets.sprites` 短名或路径与真实切图不一致 | 按 `UI_Pic_Set.md` 校正 Sprite 名,确认图片导入为 Sprite | +| 图片存在但非 Sprite | Texture Import 设置错误 | 设置 `Texture Type = Sprite (2D and UI)` | +| Toggle 没生成 | 当前转换器未实现 | 用可视骨架替代,或补转换器 | +| TMP_InputField 文本不显示 | `textComponent` / `placeholderComponent` 指向的节点缺少 `TextMeshProUGUI` 或不在输入框下 | 修正节点名,或省略节点名让转换器自动创建 `Text Area/Text/Placeholder` | +| ScrollView 警告未知 | 当前组件名应为 `ScrollRect` | 改为 `ScrollRect`,并声明 `viewport`、`content` | +| 文字不可读 | 缺描边/阴影或背景对比不足 | 加 `Outline`/`Shadow`,使用 `#102033` 或 `#0B1724` | + +### C3. 提交前自检 + +- [ ] JSON 位于 `Doc/UIPrefabCreater`。 +- [ ] 顶层字段完整。 +- [ ] `prefabName` 与根节点名一致。 +- [ ] 只有一个根节点。 +- [ ] 节点名英文且不重复。 +- [ ] 父节点先于子节点出现。 +- [ ] `referenceResolution` 为 `[2048,1024]`。 +- [ ] 所有 Sprite 已登记且路径符合通用/小游戏目录规则。 +- [ ] 九宫格图片使用 `Sliced`。 +- [ ] 文字统一 TMP,关键浅色字有轻描边或阴影。 +- [ ] 按钮有 normal/hover/pressed/disabled 状态。 +- [ ] `bindings`、`events` 中的节点真实存在。 +- [ ] 不依赖未实现组件完成核心功能。 +- [ ] 生成的 Prefab 在 Unity 中打开无明显重叠、越界或丢图。 + +--- + +## Part D - 后续扩展建议 + +### D1. 补齐转换器组件 + +建议优先补齐以下组件,顺序按 UI 高频程度排列: + +1. `Toggle` +2. `Slider` +3. `Scrollbar` +4. `TMP_Dropdown` + +每补一个组件,都应同步更新: + +- `Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs` +- `Client/Assets/Doc/Rule/UIGenerationPrompt.md` +- `Client/Assets/Doc/Rule/UIGenerationRules.md` +- 对应 EditMode 测试或最小 JSON 样例 + +### D2. 公共控件识别 + +参考项目的公共控件自动识别可以作为本项目下一阶段能力,但需要先定义稳定的本项目 canonical Sprite 名和空间约束。可优先考虑: + +| 目标 | 识别依据 | 生成结果 | +| --- | --- | --- | +| 通用关闭按钮 | `btn_close` | 替换或规范化为关闭按钮 Prefab | +| 通用返回按钮 | `btn_back` | 替换或规范化为返回按钮 Prefab | +| 标准弹窗 | `ui_overlay_dim` + `ui_panel_popup` + `btn_close` | 标准 Dialog Prefab | +| 资源条 | `ico_coin` / `ico_diamond` + 数值 + `ico_plus` | 标准 Currency 组件 | +| Toast | `toast_bg` + 文本 | 标准 Tips 组件 | + +识别器必须保守:缺件、歧义、跨区域时保留原节点并输出 Warning,不要误合并。 + +### D3. AI 生成质量评审 + +AI 产出的 UI JSON 应优先检查三件事: + +1. **工程可转换**:字段、父子关系、组件名、Sprite 名都能被当前工具处理。 +2. **视觉一致**:符合糖果风、配色语义、九宫格、TMP 和可读性规则。 +3. **业务可接管**:节点命名稳定,bindings/events 完整,C# 能按名找到控件。 + +只要这三件事成立,生成的 Prefab 就可以作为程序接管的稳定 UI 骨架。 diff --git a/Client/Assets/Doc/Rule/UIGenerationRules.md.meta b/Client/Assets/Doc/Rule/UIGenerationRules.md.meta new file mode 100644 index 00000000..4c3940b7 --- /dev/null +++ b/Client/Assets/Doc/Rule/UIGenerationRules.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b2cd5daa93154de08df4414baf54b7f5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Doc/Rule/UnityProject.md b/Client/Assets/Doc/Rule/UnityProject.md index 0954c2ca..ace42a6d 100644 --- a/Client/Assets/Doc/Rule/UnityProject.md +++ b/Client/Assets/Doc/Rule/UnityProject.md @@ -1,5 +1,11 @@ # Unity 项目规则 +## Unity 编辑器环境 + +- Unity 版本:`2022.3.62f3`(见 `Client/ProjectSettings/ProjectVersion.txt`)。 +- 本机 Unity Editor 目录:`D:\Program Files\Unity 2022.3.62f3\Editor`。 +- Unity 可执行文件:`D:\Program Files\Unity 2022.3.62f3\Editor\Unity.exe`。 + ## 美术资源目录 通用资源目录: - Shader 目录:`Client\Assets\Game\shader` @@ -68,7 +74,7 @@ UI 预设统一挂在 `UIRoot` 节点下对应的子节点,按界面类型分 - 标题、按钮文字、状态提示、倒计时等关键 UI 文本可使用轻描边或阴影;普通正文、列表、输入框文本不默认加描边,优先通过背景对比度保证可读性。 - TextMeshProUGUI 描边建议保持轻量,常规 UI 使用较小 Outline Width,避免粗黑边导致界面变脏。 - 按钮节点使用 `Button` 组件,`transition` 优先使用 `SpriteSwap`;需要点击事件时在组件中声明 `onClick`,并在根对象 `events` 中登记事件名和节点名。 -- 输入框节点使用 `TMP_InputField`,必须声明 `placeholder`、`characterLimit`、`contentType`;密码输入使用 `"contentType": "Password"`。 +- 输入框节点使用 `TMP_InputField`,必须声明 `placeholder`、`characterLimit`、`contentType`;可声明 `textComponent`、`placeholderComponent` 绑定已有 `TextMeshProUGUI` 节点,不声明时转换器自动创建 `Text Area/Text/Placeholder` 标准结构;密码输入使用 `"contentType": "Password"`。 - Toggle 节点必须声明 `toggleGroup`、`isOn`,并分别用子节点声明背景和选中标记。 - 需要业务绑定的控件必须加入根对象 `bindings`,例如 `login.username`、`register.password`;事件统一加入根对象 `events`,例如 `{ "name": "Auth.Login", "node": "Btn_Login" }`。 - 需要挂载运行时脚本时使用 `MonoBehaviour` 组件,并声明 `typeName`,例如 `"typeName": "XGame.MatchWaitingController"`。 diff --git a/Client/Assets/Framework/Shared/Protocol/FrameworkMessages.cs b/Client/Assets/Framework/Shared/Protocol/FrameworkMessages.cs index 939229a2..aaec1176 100644 --- a/Client/Assets/Framework/Shared/Protocol/FrameworkMessages.cs +++ b/Client/Assets/Framework/Shared/Protocol/FrameworkMessages.cs @@ -21,6 +21,8 @@ namespace XWorld.Framework.Protocol LobbyState = 13, LobbyMove = 14, LobbyLeave = 15, + WorldChatSend = 16, + WorldChatMessage = 17, } public sealed class HeartbeatMsg @@ -381,4 +383,52 @@ namespace XWorld.Framework.Protocol }; } } + + public sealed class WorldChatSendMsg + { + public string Text; + + public byte[] Encode() + { + var w = new PacketWriter(); + w.WriteString(Text); + return w.ToArray(); + } + + public static WorldChatSendMsg Decode(byte[] data) + { + var r = new PacketReader(data); + return new WorldChatSendMsg { Text = r.ReadString() }; + } + } + + public sealed class WorldChatMessageMsg + { + public int PlayerId; + public string PlayerName; + public string Text; + public long ServerTimeMs; + + public byte[] Encode() + { + var w = new PacketWriter(); + w.WriteVarInt(PlayerId); + w.WriteString(PlayerName); + w.WriteString(Text); + w.WriteVarLong(ServerTimeMs); + return w.ToArray(); + } + + public static WorldChatMessageMsg Decode(byte[] data) + { + var r = new PacketReader(data); + return new WorldChatMessageMsg + { + PlayerId = r.ReadVarInt(), + PlayerName = r.ReadString(), + Text = r.ReadString(), + ServerTimeMs = r.ReadVarLong(), + }; + } + } } diff --git a/Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab b/Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab new file mode 100644 index 00000000..7ca82bd5 --- /dev/null +++ b/Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab @@ -0,0 +1,2952 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &197778723959778568 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 868671214367771710} + - component: {fileID: 108974163443016377} + - component: {fileID: 6979077600845911104} + - component: {fileID: 8281757025489821804} + m_Layer: 5 + m_Name: Btn_ClearInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &868671214367771710 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197778723959778568} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 277633694990422102} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -38, y: 0} + m_SizeDelta: {x: 44, y: 44} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &108974163443016377 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197778723959778568} + m_CullTransparentMesh: 1 +--- !u!114 &6979077600845911104 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197778723959778568} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: f8c6b47816634977863c765844e5ccf2, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8281757025489821804 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 197778723959778568} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6979077600845911104} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &224965620548905913 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8828061989992527931} + - component: {fileID: 2498487652991745351} + - component: {fileID: 1025946188178498883} + - component: {fileID: 1741873825119099076} + m_Layer: 5 + m_Name: Item_MessageSelf_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &8828061989992527931 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224965620548905913} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5462170353451329338} + m_Father: {fileID: 8776161181885514415} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 104} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &2498487652991745351 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224965620548905913} + m_CullTransparentMesh: 1 +--- !u!114 &1025946188178498883 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224965620548905913} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8666667, g: 0.972549, b: 0.9019608, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: bb8a632f2c6e06a48b289995fb3797dd, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1741873825119099076 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224965620548905913} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 840 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &936563167512619750 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5383546691831162797} + - component: {fileID: 1180949041191276757} + - component: {fileID: 1864428803611998855} + m_Layer: 5 + m_Name: Txt_Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5383546691831162797 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936563167512619750} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6430448507232356778} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -4, y: 0} + m_SizeDelta: {x: -216, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1180949041191276757 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936563167512619750} + m_CullTransparentMesh: 1 +--- !u!114 &1864428803611998855 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936563167512619750} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u804A\u5929" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.0627451, g: 0.1254902, b: 0.2, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 42 + m_fontSizeBase: 42 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1153575598040703030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6574216793489368577} + - component: {fileID: 1063007967425238563} + - component: {fileID: 8805997400627165651} + m_Layer: 5 + m_Name: Panel_InputBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6574216793489368577 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1153575598040703030} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 277633694990422102} + - {fileID: 9113315340281034343} + m_Father: {fileID: 12418433254861047} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 120} + m_Pivot: {x: 0.5, y: 0} +--- !u!222 &1063007967425238563 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1153575598040703030} + m_CullTransparentMesh: 1 +--- !u!114 &8805997400627165651 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1153575598040703030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: af72336d8095b924287c4946ada9af64, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1443036609571532981 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8776161181885514415} + - component: {fileID: 7560926058715527936} + - component: {fileID: 9137833605241336048} + m_Layer: 5 + m_Name: Content_Messages + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8776161181885514415 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1443036609571532981} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1334347125939036660} + - {fileID: 8828061989992527931} + m_Father: {fileID: 8041431614232118609} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &7560926058715527936 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1443036609571532981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 8 + m_Right: 8 + m_Top: 8 + m_Bottom: 8 + m_ChildAlignment: 1 + m_Spacing: 14 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &9137833605241336048 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1443036609571532981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1640887914561786042 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4387953806112635165} + - component: {fileID: 4180423159806752077} + m_Layer: 5 + m_Name: Scroll_Messages + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4387953806112635165 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640887914561786042} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8041431614232118609} + m_Father: {fileID: 6993069120248086768} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -40, y: -40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4180423159806752077 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640887914561786042} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 8776161181885514415} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 8041431614232118609} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1931044157972301083 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 12418433254861047} + - component: {fileID: 3996078534588094249} + - component: {fileID: 3175291885407070016} + - component: {fileID: 7446872540590116419} + m_Layer: 5 + m_Name: Panel_Chat + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &12418433254861047 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931044157972301083} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6430448507232356778} + - {fileID: 6993069120248086768} + - {fileID: 6574216793489368577} + m_Father: {fileID: 1618785925902366330} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 40} + m_SizeDelta: {x: 960, y: 720} + m_Pivot: {x: 0.5, y: 0} +--- !u!222 &3996078534588094249 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931044157972301083} + m_CullTransparentMesh: 1 +--- !u!114 &3175291885407070016 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931044157972301083} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 8cd9a168993f4d2439cb650f12a07fba, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7446872540590116419 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931044157972301083} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0.023529412, g: 0.0627451, b: 0.12156863, a: 0.4} + m_EffectDistance: {x: 0, y: -10} + m_UseGraphicAlpha: 1 +--- !u!1 &2219703279535409354 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8041431614232118609} + - component: {fileID: 5951751490040094963} + - component: {fileID: 7148969153463820523} + - component: {fileID: 7066300762460964307} + m_Layer: 5 + m_Name: Viewport_Messages + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8041431614232118609 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2219703279535409354} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8776161181885514415} + m_Father: {fileID: 4387953806112635165} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5951751490040094963 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2219703279535409354} + m_CullTransparentMesh: 1 +--- !u!114 &7148969153463820523 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2219703279535409354} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 3eabb8bb82892d84096d49bf36765aca, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7066300762460964307 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2219703279535409354} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: 0, y: 0, z: 0, w: 0} + m_Softness: {x: 0, y: 0} +--- !u!1 &2282693630428846729 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8926693945099752652} + - component: {fileID: 116936221328221239} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8926693945099752652 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2282693630428846729} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 427301585568437146} + - {fileID: 8439779029164190125} + m_Father: {fileID: 277633694990422102} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -48, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &116936221328221239 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2282693630428846729} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: 0, y: 0, z: 0, w: 0} + m_Softness: {x: 0, y: 0} +--- !u!1 &2380008698871228242 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7577192315366592942} + - component: {fileID: 8811633456234051677} + - component: {fileID: 1474741574487393575} + - component: {fileID: 3532825629730459036} + - component: {fileID: 7426008558550245835} + m_Layer: 5 + m_Name: Btn_CollapsedInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7577192315366592942 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380008698871228242} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8453970406504748435} + - {fileID: 8999620422928038479} + m_Father: {fileID: 7865711300914181402} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8811633456234051677 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380008698871228242} + m_CullTransparentMesh: 1 +--- !u!114 &1474741574487393575 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380008698871228242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 350cd59a0a3809141badd82b4fab88a3, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3532825629730459036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380008698871228242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 2 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 21300000, guid: ce00abffdf2406845815844204ab8694, type: 3} + m_PressedSprite: {fileID: 21300000, guid: ce00abffdf2406845815844204ab8694, type: 3} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 21300000, guid: 350cd59a0a3809141badd82b4fab88a3, type: 3} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1474741574487393575} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &7426008558550245835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2380008698871228242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0.023529412, g: 0.0627451, b: 0.12156863, a: 0.33333334} + m_EffectDistance: {x: 0, y: -6} + m_UseGraphicAlpha: 1 +--- !u!1 &2688328098754583669 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5217936630345611217} + - component: {fileID: 7188741623604110866} + - component: {fileID: 5674041437515323801} + - component: {fileID: 8943545635349360313} + m_Layer: 5 + m_Name: Txt_Send + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5217936630345611217 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2688328098754583669} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 9113315340281034343} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7188741623604110866 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2688328098754583669} + m_CullTransparentMesh: 1 +--- !u!114 &5674041437515323801 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2688328098754583669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u53D1\u9001" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.12156863, g: 0.22745098, b: 0.05490196, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &8943545635349360313 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2688328098754583669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!1 &3035394797540110169 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1618785925902366330} + - component: {fileID: 5016714339247281233} + - component: {fileID: 865047350409828391} + - component: {fileID: 5883391384728966387} + m_Layer: 5 + m_Name: UI_CommonChat + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1618785925902366330 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3035394797540110169} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7865711300914181402} + - {fileID: 12418433254861047} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &5016714339247281233 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3035394797540110169} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 12000 + m_TargetDisplay: 0 +--- !u!114 &865047350409828391 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3035394797540110169} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 2048, y: 1024} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &5883391384728966387 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3035394797540110169} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!1 &3700349651069330730 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8439779029164190125} + - component: {fileID: 5325248971296717466} + - component: {fileID: 7998425819338855339} + m_Layer: 5 + m_Name: Txt_InputPlaceholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8439779029164190125 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3700349651069330730} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8926693945099752652} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5325248971296717466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3700349651069330730} + m_CullTransparentMesh: 1 +--- !u!114 &7998425819338855339 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3700349651069330730} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u8F93\u5165\u804A\u5929\u5185\u5BB9..." + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.47843137, g: 0.5529412, b: 0.6313726, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 28 + m_fontSizeBase: 28 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &3762555175040114055 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5462170353451329338} + - component: {fileID: 3072674295889812168} + - component: {fileID: 3144040127656486575} + m_Layer: 5 + m_Name: Txt_SelfMessage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5462170353451329338 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3762555175040114055} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8828061989992527931} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -56, y: -32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3072674295889812168 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3762555175040114055} + m_CullTransparentMesh: 1 +--- !u!114 &3144040127656486575 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3762555175040114055} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u8FD9\u662F\u6211\u53D1\u9001\u7684\u6D88\u606F\u3002" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.11764706, g: 0.2901961, b: 0.18039216, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 28 + m_fontSizeBase: 28 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 4 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &5165373798920480066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 277633694990422102} + - component: {fileID: 6396777740328234201} + - component: {fileID: 5096479146492603305} + - component: {fileID: 1498121753961336888} + m_Layer: 5 + m_Name: InputHitArea + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &277633694990422102 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5165373798920480066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6448680790030033737} + - {fileID: 868671214367771710} + - {fileID: 8926693945099752652} + m_Father: {fileID: 6574216793489368577} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -84, y: 0} + m_SizeDelta: {x: -256, y: 76} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6396777740328234201 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5165373798920480066} + m_CullTransparentMesh: 1 +--- !u!114 &5096479146492603305 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5165373798920480066} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 350cd59a0a3809141badd82b4fab88a3, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1498121753961336888 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5165373798920480066} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 5096479146492603305} + m_TextViewport: {fileID: 8926693945099752652} + m_TextComponent: {fileID: 4731768269632282055} + m_Placeholder: {fileID: 7998425819338855339} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 200 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!1 &5547185391350347358 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6993069120248086768} + - component: {fileID: 8264893984760748996} + - component: {fileID: 3501676489634070869} + m_Layer: 5 + m_Name: Panel_MessageArea + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6993069120248086768 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5547185391350347358} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4387953806112635165} + m_Father: {fileID: 12418433254861047} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 6} + m_SizeDelta: {x: -64, y: -252} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8264893984760748996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5547185391350347358} + m_CullTransparentMesh: 1 +--- !u!114 &3501676489634070869 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5547185391350347358} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 3eabb8bb82892d84096d49bf36765aca, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5564992627619582744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 427301585568437146} + - component: {fileID: 2918224833040219650} + - component: {fileID: 4731768269632282055} + m_Layer: 5 + m_Name: Txt_InputValue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &427301585568437146 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5564992627619582744} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8926693945099752652} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2918224833040219650 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5564992627619582744} + m_CullTransparentMesh: 1 +--- !u!114 &4731768269632282055 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5564992627619582744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.13725491, g: 0.21960784, b: 0.29803923, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 28 + m_fontSizeBase: 28 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &6018147619102825501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8999620422928038479} + - component: {fileID: 4648378466917989359} + - component: {fileID: 3643800865170578955} + m_Layer: 5 + m_Name: Txt_CollapsedPlaceholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8999620422928038479 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6018147619102825501} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7577192315366592942} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 30, y: 0} + m_SizeDelta: {x: -124, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4648378466917989359 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6018147619102825501} + m_CullTransparentMesh: 1 +--- !u!114 &3643800865170578955 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6018147619102825501} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u70B9\u51FB\u8F93\u5165\u6D88\u606F..." + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.41960785, g: 0.49411765, b: 0.57254905, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &6363275991757281917 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4488077828769746102} + - component: {fileID: 824015227649850201} + - component: {fileID: 3313701793901960716} + m_Layer: 5 + m_Name: Txt_OtherName + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4488077828769746102 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6363275991757281917} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1334347125939036660} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -12} + m_SizeDelta: {x: -40, y: 30} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &824015227649850201 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6363275991757281917} + m_CullTransparentMesh: 1 +--- !u!114 &3313701793901960716 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6363275991757281917} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u73A9\u5BB6" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.18431373, g: 0.41568628, b: 0.65882355, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 22 + m_fontSizeBase: 22 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &6957032044882761107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6448680790030033737} + - component: {fileID: 941260442218858718} + - component: {fileID: 3515240817960448989} + m_Layer: 5 + m_Name: Img_Keyboard + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6448680790030033737 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6957032044882761107} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 277633694990422102} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 42, y: 0} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &941260442218858718 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6957032044882761107} + m_CullTransparentMesh: 1 +--- !u!114 &3515240817960448989 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6957032044882761107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 3a1bf48f90a606b449e2b030b888055d, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7049631615137478324 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9113315340281034343} + - component: {fileID: 3790758258495012604} + - component: {fileID: 8410031982027132408} + - component: {fileID: 7621920895094971825} + m_Layer: 5 + m_Name: Btn_Send + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9113315340281034343 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7049631615137478324} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5217936630345611217} + m_Father: {fileID: 6574216793489368577} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -92, y: 0} + m_SizeDelta: {x: 160, y: 76} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3790758258495012604 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7049631615137478324} + m_CullTransparentMesh: 1 +--- !u!114 &8410031982027132408 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7049631615137478324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 072186a6a7ca30e4f8a81bf5bc777322, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7621920895094971825 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7049631615137478324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 2 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 21300000, guid: 7b39f56c5126ec34ab147fdf41431946, type: 3} + m_PressedSprite: {fileID: 21300000, guid: fb9e6e1b376bcbb43b9e69d127ce9af3, type: 3} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 21300000, guid: 78e2e2b0c47979148b85ad997dc87357, type: 3} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8410031982027132408} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &7544928303870738538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4033304746640028086} + - component: {fileID: 8780103218224430298} + - component: {fileID: 6623166037006242081} + - component: {fileID: 6652914055757996137} + m_Layer: 5 + m_Name: Btn_Close + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4033304746640028086 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7544928303870738538} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6430448507232356778} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -56, y: 0} + m_SizeDelta: {x: 72, y: 72} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8780103218224430298 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7544928303870738538} + m_CullTransparentMesh: 1 +--- !u!114 &6623166037006242081 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7544928303870738538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ef84692da6b083f448baab7f4660dc83, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6652914055757996137 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7544928303870738538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6623166037006242081} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &7855993982818246310 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3025317886599187175} + - component: {fileID: 1620647482551556043} + - component: {fileID: 3899050787395560542} + m_Layer: 5 + m_Name: Img_HeaderChatIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3025317886599187175 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7855993982818246310} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6430448507232356778} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 58, y: 0} + m_SizeDelta: {x: 52, y: 52} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1620647482551556043 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7855993982818246310} + m_CullTransparentMesh: 1 +--- !u!114 &3899050787395560542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7855993982818246310} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 59d0825071c54cf09c61d78e3452e852, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8039980522102029030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1334347125939036660} + - component: {fileID: 4806553053532989555} + - component: {fileID: 268081580565109764} + - component: {fileID: 1461492872059572812} + m_Layer: 5 + m_Name: Item_MessageOther_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1334347125939036660 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8039980522102029030} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4488077828769746102} + - {fileID: 5148768927947314515} + m_Father: {fileID: 8776161181885514415} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 112} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &4806553053532989555 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8039980522102029030} + m_CullTransparentMesh: 1 +--- !u!114 &268081580565109764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8039980522102029030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: bb8a632f2c6e06a48b289995fb3797dd, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1461492872059572812 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8039980522102029030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 840 + m_PreferredHeight: 112 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &9038142196558175414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5148768927947314515} + - component: {fileID: 1644444842298029983} + - component: {fileID: 8225388548352951444} + m_Layer: 5 + m_Name: Txt_OtherMessage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5148768927947314515 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9038142196558175414} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1334347125939036660} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -6, y: -14} + m_SizeDelta: {x: -52, y: -56} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1644444842298029983 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9038142196558175414} + m_CullTransparentMesh: 1 +--- !u!114 &8225388548352951444 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9038142196558175414} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u4F60\u597D\uFF0C\u6B22\u8FCE\u6765\u5230\u804A\u5929\u9891\u9053\u3002" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_sharedMaterial: {fileID: 1803920224224718538, guid: 023543f7caff42979bf03529f9868d06, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.13725491, g: 0.21960784, b: 0.29803923, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 28 + m_fontSizeBase: 28 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &9122761778887113698 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8453970406504748435} + - component: {fileID: 517132414760079004} + - component: {fileID: 1901812571968543591} + m_Layer: 5 + m_Name: Img_CollapsedChatIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8453970406504748435 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9122761778887113698} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7577192315366592942} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 48, y: 0} + m_SizeDelta: {x: 48, y: 48} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &517132414760079004 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9122761778887113698} + m_CullTransparentMesh: 1 +--- !u!114 &1901812571968543591 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9122761778887113698} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 59d0825071c54cf09c61d78e3452e852, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &9151017604651843326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6430448507232356778} + - component: {fileID: 7341211464264438562} + - component: {fileID: 6476175304255366760} + m_Layer: 5 + m_Name: Panel_Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6430448507232356778 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9151017604651843326} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3025317886599187175} + - {fileID: 5383546691831162797} + - {fileID: 4033304746640028086} + m_Father: {fileID: 12418433254861047} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 104} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &7341211464264438562 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9151017604651843326} + m_CullTransparentMesh: 1 +--- !u!114 &6476175304255366760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9151017604651843326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: e1a7d422fae56b1458da5c3511a60e75, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &9170893137342980695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7865711300914181402} + - component: {fileID: 3395877345116044317} + m_Layer: 5 + m_Name: Panel_Collapsed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7865711300914181402 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9170893137342980695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7577192315366592942} + m_Father: {fileID: 1618785925902366330} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 40} + m_SizeDelta: {x: 720, y: 88} + m_Pivot: {x: 0.5, y: 0} +--- !u!225 &3395877345116044317 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9170893137342980695} + m_Enabled: 1 + m_Alpha: 0.98 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 diff --git a/Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab.meta b/Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab.meta new file mode 100644 index 00000000..78d05e8c --- /dev/null +++ b/Client/Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3df6794ba6e8fe04eaeca41a8f2f0d80 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Game/Art/UI/Prefab/UI_LobbyJoystick.prefab b/Client/Assets/Game/Art/UI/Prefab/UI_LobbyJoystick.prefab index 73fd5e9c..0b281dfb 100644 --- a/Client/Assets/Game/Art/UI/Prefab/UI_LobbyJoystick.prefab +++ b/Client/Assets/Game/Art/UI/Prefab/UI_LobbyJoystick.prefab @@ -9,9 +9,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2000000000000000001} - - component: {fileID: 1019881374409531711} - - component: {fileID: -3354548917243692638} - - component: {fileID: 5674143642735492565} + - component: {fileID: 8720693099983328153} m_Layer: 5 m_Name: UI_LobbyJoystick m_TagString: Untagged @@ -31,62 +29,28 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 8967095311611333637} + - {fileID: 2000000000000000002} + - {fileID: 2000000000000000003} + - {fileID: 2000000000000000004} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchoredPosition: {x: 208, y: 158} + m_SizeDelta: {x: 148, y: 148} m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1019881374409531711 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1000000000000000001} - m_CullTransparentMesh: 1 ---- !u!223 &-3354548917243692638 -Canvas: +--- !u!225 &8720693099983328153 +CanvasGroup: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000000000000000001} m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 2 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 - m_AdditionalShaderChannelsFlag: 0 - m_UpdateRectTransformForStandalone: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!114 &5674143642735492565 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1000000000000000001} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 + m_Alpha: 0.96 + m_Interactable: 0 + m_BlocksRaycasts: 0 + m_IgnoreParentGroups: 0 --- !u!1 &1000000000000000002 GameObject: m_ObjectHideFlags: 0 @@ -113,12 +77,12 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000000000000000002} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 8967095311611333637} + m_Father: {fileID: 2000000000000000001} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -203,12 +167,12 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000000000000000003} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 8967095311611333637} + m_Father: {fileID: 2000000000000000001} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -279,12 +243,12 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000000000000000004} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 8967095311611333637} + m_Father: {fileID: 2000000000000000001} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -344,41 +308,3 @@ MonoBehaviour: m_EffectColor: {r: 0.023529412, g: 0.0627451, b: 0.12156863, a: 0.36078432} m_EffectDistance: {x: 0, y: -5} m_UseGraphicAlpha: 1 ---- !u!1 &2264943395517929137 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8967095311611333637} - m_Layer: 5 - m_Name: Joystick - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &8967095311611333637 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2264943395517929137} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2000000000000000002} - - {fileID: 2000000000000000003} - - {fileID: 2000000000000000004} - m_Father: {fileID: 2000000000000000001} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 200, y: 150} - m_SizeDelta: {x: 100, y: 100} - m_Pivot: {x: 0.5, y: 0.5} diff --git a/Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs b/Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs index b80ce13e..49e345d8 100644 --- a/Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs +++ b/Client/Assets/Script/Editor/JsonUIPrefabBuilder.cs @@ -24,6 +24,7 @@ namespace XGame.EditorTools // 不能用相对路径(Unity 工作目录是工程目录),需基于 dataPath 解析为绝对路径。 private const string JsonRootRelative = "Doc/UIPrefabCreater"; private const string TextureRoot = "Assets/Game/Art/UI/Texture"; + private static readonly int UiLayer = LayerMask.NameToLayer("UI"); private static readonly int[] RequiredRefResolution = { 2048, 1024 }; // 解析 JSON 根目录绝对路径:优先 仓库根/Doc/UIPrefabCreater,回退 工程根/Doc/UIPrefabCreater @@ -49,7 +50,7 @@ namespace XGame.EditorTools // 已识别但本期未实现的组件:遇到只告警、不报错(让 LoginPanelControls.json 仍能通过) private static readonly HashSet KnownUnimplemented = new HashSet { - "Toggle", "TMP_InputField", "RotationAnimation" + "Toggle", "RotationAnimation" }; [MenuItem("Tools/UI/Generate Prefab From JSON...")] @@ -258,6 +259,7 @@ namespace XGame.EditorTools string parentName = node["parent"]?.Type == JTokenType.Null ? null : (string)node["parent"]; GameObject go = new GameObject(name, typeof(RectTransform)); + ApplyUiLayer(go); map[name] = go; if (parentName == null) { @@ -534,6 +536,21 @@ namespace XGame.EditorTools // onClick 仅作事件标记,不在 Prefab 写死回调 break; } + case "TMP_InputField": + { + TMP_InputField input = GetOrAdd(go); + Image target = go.GetComponent(); + if (target != null) input.targetGraphic = target; + if (comp["characterLimit"] != null) input.characterLimit = (int)comp["characterLimit"]; + input.contentType = ParseInputContentType((string)comp["contentType"]); + input.lineType = ParseInputLineType((string)comp["lineType"]); + + string textName = (string)comp["textComponent"]; + string placeholderName = (string)comp["placeholderComponent"]; + string placeholderText = (string)comp["placeholder"]; + deferred.Add(() => BindTmpInputField(go, input, map, textName, placeholderName, placeholderText)); + break; + } case "Shadow": { Shadow shadow = GetOrAdd(go); @@ -630,7 +647,154 @@ namespace XGame.EditorTools } } + private static void BindTmpInputField( + GameObject go, + TMP_InputField input, + Dictionary map, + string textName, + string placeholderName, + string placeholderText) + { + if (go == null || input == null) + { + return; + } + + RectTransform textViewport = EnsureInputTextViewport(go); + input.textViewport = textViewport; + + TextMeshProUGUI text = ResolveOrCreateInputText( + go, + map, + textName, + textViewport, + "Text", + string.Empty, + "#23384CFF"); + TextMeshProUGUI placeholder = ResolveOrCreateInputText( + go, + map, + placeholderName, + textViewport, + "Placeholder", + placeholderText ?? string.Empty, + "#7A8DA1FF"); + + input.textComponent = text; + input.placeholder = placeholder; + if (placeholder != null && !string.IsNullOrEmpty(placeholderText)) + { + placeholder.text = placeholderText; + } + } + + private static RectTransform EnsureInputTextViewport(GameObject go) + { + Transform existing = go.transform.Find("Text Area"); + GameObject textArea = existing == null ? null : existing.gameObject; + if (textArea == null) + { + textArea = new GameObject("Text Area", typeof(RectTransform), typeof(RectMask2D)); + ApplyUiLayer(textArea); + textArea.transform.SetParent(go.transform, false); + RectTransform rt = textArea.GetComponent(); + rt.anchorMin = Vector2.zero; + rt.anchorMax = Vector2.one; + rt.pivot = new Vector2(0.5f, 0.5f); + rt.offsetMin = new Vector2(24f, 0f); + rt.offsetMax = new Vector2(-24f, 0f); + } + RectTransform viewport = textArea.GetComponent(); + if (textArea.GetComponent() == null) + { + textArea.AddComponent(); + } + return viewport; + } + + private static TextMeshProUGUI ResolveOrCreateInputText( + GameObject inputRoot, + Dictionary map, + string nodeName, + RectTransform viewport, + string fallbackName, + string defaultText, + string defaultColor) + { + TextMeshProUGUI text = null; + if (!string.IsNullOrEmpty(nodeName) && map.TryGetValue(nodeName, out GameObject mapped) && mapped != null) + { + text = mapped.GetComponent(); + if (text == null) + { + text = mapped.AddComponent(); + } + if (mapped.transform.parent != viewport) + { + mapped.transform.SetParent(viewport, false); + } + StretchToFill(mapped.GetComponent()); + } + + if (text == null) + { + Transform existing = viewport.Find(fallbackName); + GameObject textGo = existing == null ? null : existing.gameObject; + if (textGo == null) + { + textGo = new GameObject(fallbackName, typeof(RectTransform)); + ApplyUiLayer(textGo); + textGo.transform.SetParent(viewport, false); + } + StretchToFill(textGo.GetComponent()); + text = GetOrAdd(textGo); + text.text = defaultText ?? string.Empty; + } + + ConfigureInputText(text, defaultColor); + return text; + } + + private static void ConfigureInputText(TextMeshProUGUI text, string color) + { + if (text == null) + { + return; + } + if (text.fontSize <= 0f) + { + text.fontSize = 28f; + } + text.alignment = text.alignment == TextAlignmentOptions.TopLeft ? TextAlignmentOptions.Left : text.alignment; + text.raycastTarget = false; + if (!string.IsNullOrEmpty(color)) + { + text.color = ParseColor(color, text.color); + } + } + // ---------- 资源/解析辅助 ---------- + private static void StretchToFill(RectTransform rt) + { + if (rt == null) + { + return; + } + rt.anchorMin = Vector2.zero; + rt.anchorMax = Vector2.one; + rt.pivot = new Vector2(0.5f, 0.5f); + rt.offsetMin = Vector2.zero; + rt.offsetMax = Vector2.zero; + } + + private static void ApplyUiLayer(GameObject go) + { + if (go != null && UiLayer >= 0) + { + go.layer = UiLayer; + } + } + private static Type FindComponentType(string typeName) { if (string.IsNullOrEmpty(typeName)) @@ -739,6 +903,36 @@ namespace XGame.EditorTools } } + private static TMP_InputField.ContentType ParseInputContentType(string contentType) + { + switch (contentType) + { + case "IntegerNumber": return TMP_InputField.ContentType.IntegerNumber; + case "DecimalNumber": return TMP_InputField.ContentType.DecimalNumber; + case "Alphanumeric": return TMP_InputField.ContentType.Alphanumeric; + case "Name": return TMP_InputField.ContentType.Name; + case "EmailAddress": return TMP_InputField.ContentType.EmailAddress; + case "Password": return TMP_InputField.ContentType.Password; + case "Pin": return TMP_InputField.ContentType.Pin; + case "Custom": return TMP_InputField.ContentType.Custom; + case "Standard": + default: + return TMP_InputField.ContentType.Standard; + } + } + + private static TMP_InputField.LineType ParseInputLineType(string lineType) + { + switch (lineType) + { + case "MultiLineSubmit": return TMP_InputField.LineType.MultiLineSubmit; + case "MultiLineNewline": return TMP_InputField.LineType.MultiLineNewline; + case "SingleLine": + default: + return TMP_InputField.LineType.SingleLine; + } + } + private static IEnumerable EnumStrings(JToken token) { if (token is JArray a) diff --git a/Client/Assets/Script/Editor/XWorldUtil.cs b/Client/Assets/Script/Editor/XWorldUtil.cs index 5a730300..777d3564 100644 --- a/Client/Assets/Script/Editor/XWorldUtil.cs +++ b/Client/Assets/Script/Editor/XWorldUtil.cs @@ -151,7 +151,7 @@ public class XWorldUtil { if (EditorPrefs.HasKey(AUTO_CONVERT_JSON_ON_FOCUS_PREF_KEY)) return EditorPrefs.GetBool(AUTO_CONVERT_JSON_ON_FOCUS_PREF_KEY, true); - return EditorPrefs.GetBool(AUTO_CONVERT_HTML_ON_FOCUS_PREF_KEY, true); + return true; } static bool s_IsAutoConvertingJsonPrefabs; diff --git a/Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs b/Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs new file mode 100644 index 00000000..3ba93a57 --- /dev/null +++ b/Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs @@ -0,0 +1,157 @@ +using System.IO; +using NUnit.Framework; +using TMPro; +using UnityEditor; +using UnityEngine; +using XGame.EditorTools; + +public sealed class JsonUIPrefabBuilderInputFieldTests +{ + private const string JsonPath = "../Temp/UIGenTests/UI_TMPInputTest.json"; + private const string PrefabPath = "Assets/Temp/UIGenTests/UI_TMPInputTest.prefab"; + + [TearDown] + public void TearDown() + { + AssetDatabase.DeleteAsset(PrefabPath); + AssetDatabase.DeleteAsset("Assets/Temp/UIGenTests"); + string fullJsonPath = Path.GetFullPath(Path.Combine(Application.dataPath, JsonPath)); + if (File.Exists(fullJsonPath)) + { + File.Delete(fullJsonPath); + } + } + + [Test] + public void BuildFromJsonFile_CreatesAndBindsTmpInputField() + { + string fullJsonPath = WriteJson(); + + string outputPath = JsonUIPrefabBuilder.BuildFromJsonFile(fullJsonPath); + + Assert.That(outputPath, Is.EqualTo(PrefabPath)); + GameObject prefab = AssetDatabase.LoadAssetAtPath(PrefabPath); + Assert.That(prefab, Is.Not.Null); + + Transform inputTransform = prefab.transform.Find("InputHitArea"); + Assert.That(inputTransform, Is.Not.Null); + TMP_InputField input = inputTransform.GetComponent(); + Assert.That(input, Is.Not.Null); + Assert.That(inputTransform.gameObject.layer, Is.EqualTo(LayerMask.NameToLayer("UI"))); + Assert.That(input.textComponent, Is.Not.Null); + Assert.That(input.textComponent.name, Is.EqualTo("Txt_InputValue")); + Assert.That(input.placeholder, Is.Not.Null); + Assert.That(input.placeholder.name, Is.EqualTo("Txt_InputPlaceholder")); + Assert.That(input.characterLimit, Is.EqualTo(140)); + Assert.That(input.lineType, Is.EqualTo(TMP_InputField.LineType.SingleLine)); + } + + private static string WriteJson() + { + string fullJsonPath = Path.GetFullPath(Path.Combine(Application.dataPath, JsonPath)); + Directory.CreateDirectory(Path.GetDirectoryName(fullJsonPath)); + File.WriteAllText(fullJsonPath, @"{ + ""schemaVersion"": 1, + ""prefabName"": ""UI_TMPInputTest"", + ""prefabPath"": ""Assets/Temp/UIGenTests/UI_TMPInputTest.prefab"", + ""description"": ""TMP input field test."", + ""canvas"": { + ""canvasScaler"": { + ""referenceResolution"": [2048, 1024], + ""matchWidthOrHeight"": 0.5 + } + }, + ""assets"": { + ""sprites"": {} + }, + ""nodes"": [ + { + ""name"": ""UI_TMPInputTest"", + ""parent"": null, + ""active"": true, + ""rect"": { + ""anchorMin"": [0, 0], + ""anchorMax"": [1, 1], + ""offsetMin"": [0, 0], + ""offsetMax"": [0, 0] + }, + ""components"": [] + }, + { + ""name"": ""InputHitArea"", + ""parent"": ""UI_TMPInputTest"", + ""active"": true, + ""rect"": { + ""anchorMin"": [0.5, 0.5], + ""anchorMax"": [0.5, 0.5], + ""pivot"": [0.5, 0.5], + ""anchoredPosition"": [0, 0], + ""sizeDelta"": [520, 80] + }, + ""components"": [ + { + ""type"": ""Image"", + ""imageType"": ""Sliced"", + ""raycastTarget"": true, + ""color"": ""#FFFFFFFF"" + }, + { + ""type"": ""TMP_InputField"", + ""textComponent"": ""Txt_InputValue"", + ""placeholderComponent"": ""Txt_InputPlaceholder"", + ""placeholder"": ""输入内容..."", + ""characterLimit"": 140, + ""lineType"": ""SingleLine"", + ""contentType"": ""Standard"" + } + ] + }, + { + ""name"": ""Txt_InputPlaceholder"", + ""parent"": ""InputHitArea"", + ""active"": true, + ""rect"": { + ""anchorMin"": [0, 0], + ""anchorMax"": [1, 1], + ""offsetMin"": [24, 0], + ""offsetMax"": [-24, 0] + }, + ""components"": [ + { + ""type"": ""TextMeshProUGUI"", + ""text"": ""输入内容..."", + ""fontSize"": 28, + ""alignment"": ""Left"", + ""color"": ""#7A8DA1FF"", + ""raycastTarget"": false + } + ] + }, + { + ""name"": ""Txt_InputValue"", + ""parent"": ""InputHitArea"", + ""active"": true, + ""rect"": { + ""anchorMin"": [0, 0], + ""anchorMax"": [1, 1], + ""offsetMin"": [24, 0], + ""offsetMax"": [-24, 0] + }, + ""components"": [ + { + ""type"": ""TextMeshProUGUI"", + ""text"": """", + ""fontSize"": 28, + ""alignment"": ""Left"", + ""color"": ""#23384CFF"", + ""raycastTarget"": false + } + ] + } + ], + ""bindings"": [], + ""events"": [] +}"); + return fullJsonPath; + } +} diff --git a/Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs.meta b/Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs.meta new file mode 100644 index 00000000..19ffa289 --- /dev/null +++ b/Client/Assets/Script/Tests/EditMode/JsonUIPrefabBuilderInputFieldTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 203834191d3c4f7c8b175a00e72186c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs b/Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs new file mode 100644 index 00000000..af868d9e --- /dev/null +++ b/Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs @@ -0,0 +1,52 @@ +using NUnit.Framework; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; +using XGame; + +public sealed class UIManagerAttachTests +{ + [TearDown] + public void TearDown() + { + DestroyIfExists("ZeroSizedCanvas"); + DestroyIfExists("UIRoot"); + EventSystem eventSystem = Object.FindObjectOfType(); + if (eventSystem != null) + { + Object.DestroyImmediate(eventSystem.gameObject); + } + } + + [Test] + public void AttachTo_StretchesZeroSizedCanvasRootAndAppliesUiLayer() + { + GameObject ui = new GameObject("ZeroSizedCanvas", typeof(RectTransform), typeof(Canvas)); + GameObject child = new GameObject("Child", typeof(RectTransform), typeof(Image)); + child.transform.SetParent(ui.transform, false); + + RectTransform rt = ui.GetComponent(); + rt.anchorMin = Vector2.zero; + rt.anchorMax = Vector2.zero; + rt.sizeDelta = Vector2.zero; + + UIManager.AttachTo(UILayer.Normal, ui); + + int uiLayer = LayerMask.NameToLayer("UI"); + Assert.That(rt.anchorMin, Is.EqualTo(Vector2.zero)); + Assert.That(rt.anchorMax, Is.EqualTo(Vector2.one)); + Assert.That(rt.offsetMin, Is.EqualTo(Vector2.zero)); + Assert.That(rt.offsetMax, Is.EqualTo(Vector2.zero)); + Assert.That(ui.layer, Is.EqualTo(uiLayer)); + Assert.That(child.layer, Is.EqualTo(uiLayer)); + } + + private static void DestroyIfExists(string name) + { + GameObject go = GameObject.Find(name); + if (go != null) + { + Object.DestroyImmediate(go); + } + } +} diff --git a/Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs.meta b/Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs.meta new file mode 100644 index 00000000..41b0919a --- /dev/null +++ b/Client/Assets/Script/Tests/EditMode/UIManagerAttachTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 793775c4067b48ffad9e0ca52d8e92db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Script/Tests/EditMode/XWorld.Link.EditModeTests.asmdef b/Client/Assets/Script/Tests/EditMode/XWorld.Link.EditModeTests.asmdef index 67a90031..dcf8a448 100644 --- a/Client/Assets/Script/Tests/EditMode/XWorld.Link.EditModeTests.asmdef +++ b/Client/Assets/Script/Tests/EditMode/XWorld.Link.EditModeTests.asmdef @@ -1,7 +1,11 @@ { "name": "XWorld.Link.EditModeTests", "rootNamespace": "", - "references": ["XWorld.Link"], + "references": [ + "XWorld.Link", + "Unity.TextMeshPro", + "GUID:119d45324677fde49923efc4ea54b313" + ], "includePlatforms": ["Editor"], "excludePlatforms": [], "allowUnsafeCode": false, diff --git a/Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs b/Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs new file mode 100644 index 00000000..0e2a4728 --- /dev/null +++ b/Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using NUnit.Framework; +using UnityEditor; + +public sealed class XWorldJsonPrefabAutoConvertTests +{ + private const string JsonPrefKey = "XWorld.UI.AutoConvertJsonOnFocus"; + private const string HtmlPrefKey = "XWorld.UI.AutoConvertHtmlOnFocus"; + + [TearDown] + public void TearDown() + { + EditorPrefs.DeleteKey(JsonPrefKey); + EditorPrefs.DeleteKey(HtmlPrefKey); + } + + [Test] + public void JsonAutoConvertDefaultsToEnabledIndependentlyOfHtmlPreference() + { + EditorPrefs.DeleteKey(JsonPrefKey); + EditorPrefs.SetBool(HtmlPrefKey, false); + + Assert.That(ReadJsonAutoConvertEnabled(), Is.True); + } + + private static bool ReadJsonAutoConvertEnabled() + { + MethodInfo method = typeof(XWorldUtil).GetMethod( + "IsAutoConvertJsonOnFocusEnabled", + BindingFlags.Static | BindingFlags.NonPublic); + + Assert.That(method, Is.Not.Null); + return (bool)method.Invoke(null, null); + } +} diff --git a/Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs.meta b/Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs.meta new file mode 100644 index 00000000..250ad1ca --- /dev/null +++ b/Client/Assets/Script/Tests/EditMode/XWorldJsonPrefabAutoConvertTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 802e633c1f3d4d38be7f72851fed177f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Script/xmain/Client/CSharpClientApp.cs b/Client/Assets/Script/xmain/Client/CSharpClientApp.cs index b2002f1f..fa83ae3d 100644 --- a/Client/Assets/Script/xmain/Client/CSharpClientApp.cs +++ b/Client/Assets/Script/xmain/Client/CSharpClientApp.cs @@ -38,6 +38,7 @@ namespace XGame private MiniGameNetChannel lobbyNet; private MiniGameHost gameHost; private LobbyWorldController lobbyWorld; + private WorldChatModule worldChat; private readonly List games = new List(); private bool lobbyActive; private bool openingLogin; @@ -120,6 +121,7 @@ namespace XGame { lobbyActive = false; lobbyWorld?.SendLeave(); + CloseWorldChat(); lobbyNet = null; socket?.close(); socket = null; @@ -581,6 +583,9 @@ namespace XGame } lobbyWorld?.HandleFrame(frame); break; + case FrameworkOpcode.WorldChatMessage: + worldChat?.HandleWorldChatMessage(WorldChatMessageMsg.Decode(frame.Payload)); + break; } } @@ -590,6 +595,7 @@ namespace XGame pendingGameVersion = 0; lobbyActive = false; lobbyWorld?.SendLeave(); + CloseWorldChat(); lobbyNet = null; CloseWaiting(); CloseLobby(); @@ -668,6 +674,48 @@ namespace XGame GetLobbyPlayerId(), GetLobbyPlayerName(), 0); + EnsureWorldChatModule(); + } + + private void EnsureWorldChatModule() + { + if (lobbyNet == null) + { + return; + } + if (worldChat == null) + { + worldChat = gameObject.GetComponent(); + if (worldChat == null) + { + worldChat = gameObject.AddComponent(); + } + } + worldChat.Initialize(GetLobbyPlayerId(), SendWorldChat); + if (!worldChat.IsOpen) + { + XWCoroutine.StartCo(worldChat.OpenAsync()); + } + } + + private void SendWorldChat(string text) + { + text = (text ?? string.Empty).Trim(); + if (text.Length == 0 || lobbyNet == null) + { + return; + } + lobbyNet.SendFramework( + FrameworkOpcode.WorldChatSend, + new WorldChatSendMsg { Text = text }.Encode()); + } + + private void CloseWorldChat() + { + if (worldChat != null) + { + worldChat.Close(); + } } private static string GetLobbyPlayerName() diff --git a/Client/Assets/Script/xmain/Client/LobbyWorldController.cs b/Client/Assets/Script/xmain/Client/LobbyWorldController.cs index c95db2c3..3d6bb95c 100644 --- a/Client/Assets/Script/xmain/Client/LobbyWorldController.cs +++ b/Client/Assets/Script/xmain/Client/LobbyWorldController.cs @@ -908,15 +908,14 @@ namespace XGame joystickRoot.gameObject.SetActive(joined); yield break; } - // 摇杆是抬头 HUD → 挂到 UIRoot/HUD 层(见 UI 挂载规则);Main 未就绪时降级到本地 HUD 画布 - Transform parent = GetHudParent(); GameObject prefabObj = prefab as GameObject; if (prefabObj == null) { Debug.LogError("[LobbyWorldController] load joystick prefab failed: " + JoystickPrefabPath); yield break; } - rootObj = Instantiate(prefabObj, parent, false); + rootObj = Instantiate(prefabObj); + UIManager.AttachTo(UILayer.HUD, rootObj); rootObj.name = "UI_LobbyJoystick"; joystickRoot = rootObj.GetComponent(); diff --git a/Client/Assets/Script/xmain/Client/UIManager.cs b/Client/Assets/Script/xmain/Client/UIManager.cs index e77a09f1..b418234d 100644 --- a/Client/Assets/Script/xmain/Client/UIManager.cs +++ b/Client/Assets/Script/xmain/Client/UIManager.cs @@ -27,6 +27,7 @@ namespace XGame private const string UIRootName = "UIRoot"; private static readonly string[] LayerNames = { "HUD", "Normal", "Dialog", "Tips" }; private static readonly Vector2 DesignResolution = new Vector2(2048f, 1024f); + private static readonly int UiLayerId = LayerMask.NameToLayer("UI"); /// 把 UI 挂到指定层(worldPositionStays=false 保留本地布局/锚点)。 public static void AttachTo(UILayer layer, GameObject ui, bool worldPositionStays = false) @@ -39,6 +40,8 @@ namespace XGame if (layerRt != null) { ui.transform.SetParent(layerRt, worldPositionStays); + ApplyUiLayer(ui.transform); + EnsureVisibleAttachedRoot(ui); } } @@ -62,6 +65,10 @@ namespace XGame if (go == null) { go = new GameObject(UIRootName, typeof(RectTransform), typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster)); + if (UiLayerId >= 0) + { + go.layer = UiLayerId; + } Canvas canvas = go.GetComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 100; // 位于主界面之上 @@ -78,9 +85,45 @@ namespace XGame CreateFullStretchChild(go.transform, LayerNames[i]); } } + ApplyUiLayer(go.transform); return go.transform; } + private static void EnsureVisibleAttachedRoot(GameObject ui) + { + RectTransform rt = ui == null ? null : ui.transform as RectTransform; + if (rt == null || ui.GetComponent() == null) + { + return; + } + + if (Mathf.Abs(rt.rect.width) > 0.01f || Mathf.Abs(rt.rect.height) > 0.01f) + { + return; + } + + rt.anchorMin = Vector2.zero; + rt.anchorMax = Vector2.one; + rt.offsetMin = Vector2.zero; + rt.offsetMax = Vector2.zero; + rt.pivot = new Vector2(0.5f, 0.5f); + rt.localScale = Vector3.one; + } + + private static void ApplyUiLayer(Transform root) + { + if (root == null || UiLayerId < 0) + { + return; + } + + root.gameObject.layer = UiLayerId; + for (int i = 0; i < root.childCount; i++) + { + ApplyUiLayer(root.GetChild(i)); + } + } + private static void EnsureEventSystem() { if (EventSystem.current != null || Object.FindObjectOfType() != null) @@ -93,6 +136,10 @@ namespace XGame private static Transform CreateFullStretchChild(Transform parent, string name) { GameObject go = new GameObject(name, typeof(RectTransform)); + if (UiLayerId >= 0) + { + go.layer = UiLayerId; + } RectTransform rt = go.GetComponent(); rt.SetParent(parent, false); rt.anchorMin = Vector2.zero; diff --git a/Client/Assets/Script/xmain/Module/WorldChatModule.cs b/Client/Assets/Script/xmain/Module/WorldChatModule.cs new file mode 100644 index 00000000..958cfe7d --- /dev/null +++ b/Client/Assets/Script/xmain/Module/WorldChatModule.cs @@ -0,0 +1,383 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; +using UnityEngine.UI; +using XWorld.Framework.Protocol; +using UObject = UnityEngine.Object; + +namespace XGame +{ + public sealed class WorldChatModule : MonoBehaviour + { + private const string ChatPrefabPath = "Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab"; + private const int MaxMessages = 80; + private const int MaxInputLength = 200; + + private GameObject view; + private GameObject panelCollapsed; + private GameObject panelChat; + private Transform contentMessages; + private GameObject otherTemplate; + private GameObject selfTemplate; + private TMP_InputField inputField; + private TMP_Text inputPlaceholder; + private TMP_Text inputValue; + private ScrollRect scrollMessages; + private bool opening; + private int openVersion; + private int localPlayerId; + private readonly Queue messageRows = new Queue(); + + public Action OnSendWorldChat; + + public bool IsOpen => view != null; + + public void Initialize(int playerId, Action sendWorldChat) + { + localPlayerId = playerId; + OnSendWorldChat = sendWorldChat; + } + + public IEnumerator OpenAsync() + { + if (view != null || opening) + { + yield break; + } + + opening = true; + int version = ++openVersion; + UObject loaded = null; + yield return XResLoader.coLoadRes(ChatPrefabPath, typeof(GameObject), obj => loaded = obj); + opening = false; + + if (version != openVersion) + { + yield break; + } + + GameObject prefab = loaded as GameObject; + if (prefab == null) + { + Debug.LogError("[WorldChatModule] load chat prefab failed: " + ChatPrefabPath); + yield break; + } + + view = Instantiate(prefab); + UIManager.AttachTo(UILayer.Normal, view); + CacheControls(); + BindEvents(); + Collapse(); + } + + public void Close() + { + openVersion++; + if (view != null) + { + Destroy(view); + view = null; + } + messageRows.Clear(); + panelCollapsed = null; + panelChat = null; + contentMessages = null; + otherTemplate = null; + selfTemplate = null; + inputField = null; + inputPlaceholder = null; + inputValue = null; + scrollMessages = null; + opening = false; + } + + public void HandleWorldChatMessage(WorldChatMessageMsg message) + { + if (message == null) + { + return; + } + if (view == null) + { + XWCoroutine.StartCo(OpenThenAppend(message)); + return; + } + AppendMessage(message); + } + + private IEnumerator OpenThenAppend(WorldChatMessageMsg message) + { + yield return OpenAsync(); + AppendMessage(message); + } + + private void CacheControls() + { + if (view == null) + { + return; + } + + panelCollapsed = FindGameObject("Panel_Collapsed"); + panelChat = FindGameObject("Panel_Chat"); + contentMessages = FindTransform("Content_Messages"); + otherTemplate = FindGameObject("Item_MessageOther_Template"); + selfTemplate = FindGameObject("Item_MessageSelf_Template"); + scrollMessages = FindComponent("Scroll_Messages"); + inputPlaceholder = FindComponent("Txt_InputPlaceholder"); + inputValue = FindComponent("Txt_InputValue"); + EnsureInputField(); + } + + private void BindEvents() + { + BindButton("Btn_CollapsedInput", Expand); + BindButton("Btn_Close", Collapse); + BindButton("Btn_Send", SendCurrentInput); + BindButton("Btn_ClearInput", ClearInput); + BindButton("InputHitArea", FocusInput); + if (inputField != null) + { + inputField.onSubmit.RemoveListener(OnInputSubmitted); + inputField.onSubmit.AddListener(OnInputSubmitted); + } + } + + private void EnsureInputField() + { + Transform hitArea = FindTransform("InputHitArea"); + if (hitArea == null) + { + return; + } + + inputField = hitArea.GetComponent(); + if (inputField == null) + { + inputField = hitArea.gameObject.AddComponent(); + } + + Button button = hitArea.GetComponent