联机功能开发

This commit is contained in:
daixiawu 2026-05-27 14:19:32 +08:00
parent abb7d89f5b
commit 9ae4a84b8f
54 changed files with 9800 additions and 4659 deletions

View File

@ -1,5 +1,5 @@
{
"nextId": 267,
"nextId": 270,
"bugs": [
{
"id": 2,
@ -2640,6 +2640,38 @@
"module": "",
"createdAt": 1779776751092,
"updatedAt": 1779776751092
},
{
"id": 267,
"title": "莫名其妙的伤害预览等待Ai的时候伤害预览",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"createdAt": 1779798489273,
"updatedAt": 1779798489273
},
{
"id": 268,
"title": "0回合的时候点击重玩本回合结果是上一个档",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1779806750642,
"updatedAt": 1779806750642
},
{
"id": 269,
"title": "切换语言后 ranking没有刷新",
"description": "",
"status": "open",
"priority": "medium",
"module": "",
"longTerm": false,
"createdAt": 1779810291469,
"updatedAt": 1779810291469
}
]
}

View File

@ -1,4 +1,14 @@
{
"nextId": 1,
"suggestions": []
}
"nextId": 2,
"suggestions": [
{
"id": 1,
"title": "这种挡住人口的情况能不能优化下(",
"description": "",
"status": "open",
"module": "",
"createdAt": 1779802647070,
"updatedAt": 1779802647070
}
]
}

View File

@ -438,6 +438,7 @@
</div>
<!-- Toolbar -->
<div class="toolbar">
<button class="bug-btn" id="bugs-longterm-toggle" type="button">查看长期 BUG</button>
<input type="text" id="bugs-search" class="search-input" placeholder="搜索编号、标题或描述...">
<select id="bugs-status-filter" class="filter-select">
<option value="">全部状态</option>

View File

@ -11,6 +11,7 @@
let bugsList = [];
let bugsLoaded = false;
let bugsNextId = 1;
let bugsLongTermMode = false;
// ========== Status / Priority Definitions ==========
@ -79,6 +80,7 @@ function bugsRenderList() {
if (statusF) filtered = filtered.filter(b => b.status === statusF);
if (priorityF) filtered = filtered.filter(b => b.priority === priorityF);
if (moduleF) filtered = filtered.filter(b => b.module === moduleF);
filtered = filtered.filter(b => !!b.longTerm === bugsLongTermMode);
// Sort: priority (asc) then id (desc)
filtered.sort((a, b) => {
@ -92,11 +94,20 @@ function bugsRenderList() {
if (countEl) {
const total = bugsList.length;
const openCount = bugsList.filter(b => b.status === 'open' || b.status === 'fixing').length;
countEl.textContent = `${total} 个 BUG${openCount} 个待处理`;
const longTermCount = bugsList.filter(b => !!b.longTerm).length;
countEl.textContent = `${total} 个 BUG${openCount} 个待处理,${longTermCount} 个长期 BUG`;
}
const modeBtn = document.getElementById('bugs-longterm-toggle');
if (modeBtn) {
modeBtn.textContent = bugsLongTermMode ? '查看非长期 BUG' : '查看长期 BUG';
modeBtn.title = bugsLongTermMode ? '切换到非长期 BUG 列表' : '切换到长期 BUG 列表';
modeBtn.classList.toggle('bug-btn-primary', bugsLongTermMode);
}
if (filtered.length === 0) {
container.innerHTML = '<div class="loading-inline">暂无匹配的 BUG 记录</div>';
const emptyText = bugsLongTermMode ? '暂无匹配的长期 BUG 记录' : '暂无匹配的非长期 BUG 记录';
container.innerHTML = `<div class="loading-inline">${emptyText}</div>`;
return;
}
@ -104,7 +115,9 @@ function bugsRenderList() {
const st = BUG_STATUSES[b.status] || BUG_STATUSES.open;
const pr = BUG_PRIORITIES[b.priority] || BUG_PRIORITIES.medium;
const dateStr = b.createdAt ? new Date(b.createdAt).toLocaleDateString('zh-CN') : '';
const updStr = b.updatedAt ? new Date(b.updatedAt).toLocaleDateString('zh-CN') : '';
const longTermBtnLabel = b.longTerm ? '转出长期 bug' : '转入长期 bug';
const longTermBtnTitle = b.longTerm ? '取消长期 BUG 标记' : '标记为长期 BUG';
const longTermBtn = `<button class="bug-btn bug-btn-sm bug-longterm-action" data-bug-id="${b.id}" title="${longTermBtnTitle}" style="margin-right:4px">${longTermBtnLabel}</button>`;
// 快速修复按钮 - 只在待修复/修复中状态时显示
const showFixBtn = (b.status === 'open' || b.status === 'fixing');
@ -115,15 +128,24 @@ function bugsRenderList() {
<span class="bug-card-id">#${String(b.id).padStart(3, '0')}</span>
<span class="bug-card-pri" style="color:${pr.color}">${pr.label}</span>
<span class="bug-card-title">${bugsEsc(b.title)}</span>
${b.longTerm ? '<span class="bug-card-module" style="background:#fef3c7;color:#92400e">长期 BUG</span>' : ''}
${b.module ? `<span class="bug-card-module">${bugsEsc(b.module)}</span>` : ''}
</div>
<div class="bug-card-right">
${longTermBtn}
${fixBtn}
<span class="bug-card-status" style="color:${st.color};background:${st.bg}">${st.label}</span>
<span class="bug-card-date">${dateStr}</span>
</div>
</div>`;
}).join('');
container.querySelectorAll('.bug-longterm-action').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
bugsToggleLongTerm(Number(btn.dataset.bugId), e);
});
});
}
function bugsEsc(s) {
@ -157,6 +179,7 @@ function bugsShowDetail(id) {
<div class="bug-detail-title">${bugsEsc(bug.title)}</div>
<div class="bug-detail-meta">
<span class="bug-card-pri" style="color:${pr.color}">${pr.label}</span>
${bug.longTerm ? '<span class="bug-card-module" style="background:#fef3c7;color:#92400e">长期 BUG</span>' : ''}
${bug.module ? `<span class="bug-card-module">${bugsEsc(bug.module)}</span>` : ''}
<span>创建: ${dateStr}</span>
${updStr ? `<span>更新: ${updStr}</span>` : ''}
@ -172,7 +195,10 @@ function bugsShowDetail(id) {
<label>状态:</label>
<select id="bug-status-select" class="filter-select" onchange="bugsUpdateStatus(${bug.id}, this.value)">${statusOpts}</select>
</div>
<div>
<div style="display:flex;gap:8px;align-items:center">
<button class="bug-btn" id="bug-detail-longterm-btn" type="button">
${bug.longTerm ? '转出长期 bug' : '转入长期 bug'}
</button>
<button class="bug-btn bug-btn-danger" onclick="bugsDelete(${bug.id})">删除</button>
</div>
</div>
@ -180,6 +206,11 @@ function bugsShowDetail(id) {
`;
document.body.appendChild(overlay);
document.getElementById('bug-detail-longterm-btn')?.addEventListener('click', async (e) => {
await bugsToggleLongTerm(bug.id, e);
overlay.remove();
});
// ESC to close
const handler = (e) => {
if (e.key === 'Escape') {
@ -299,6 +330,40 @@ async function bugsQuickFix(id, event) {
}
}
// ========== Long-term Bug ==========
function bugsToggleLongTermMode() {
bugsLongTermMode = !bugsLongTermMode;
bugsRenderList();
}
async function bugsToggleLongTerm(id, event) {
if (event) {
event.stopPropagation();
}
const bug = bugsList.find(b => b.id === id);
if (!bug) return;
const nextLongTerm = !bug.longTerm;
try {
const r = await fetch('/api/bugs/update', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, longTerm: nextLongTerm })
});
const result = await r.json();
if (result.success) {
bug.longTerm = nextLongTerm;
bug.updatedAt = Date.now();
bugsRenderList();
bugsShowToast(nextLongTerm ? '已转入长期 BUG' : '已转出长期 BUG', 'success');
}
} catch (e) {
alert('更新失败: ' + e.message);
}
}
// ========== Update Status ==========
async function bugsUpdateStatus(id, newStatus) {
@ -367,6 +432,12 @@ function bugsBindFilters() {
if (el) el.addEventListener(el.tagName === 'SELECT' ? 'change' : 'input', () => bugsRenderList());
});
const longTermToggle = document.getElementById('bugs-longterm-toggle');
if (longTermToggle && !longTermToggle.dataset.bound) {
longTermToggle.dataset.bound = '1';
longTermToggle.addEventListener('click', bugsToggleLongTermMode);
}
// Populate module filter dropdown
const moduleFilter = document.getElementById('bugs-module-filter');
if (moduleFilter && moduleFilter.options.length <= 1) {

View File

@ -936,6 +936,7 @@ class DashboardHandler(http.server.SimpleHTTPRequestHandler):
'status': 'open',
'priority': data.get('priority', 'medium'),
'module': data.get('module', ''),
'longTerm': False,
'createdAt': now,
'updatedAt': now,
}
@ -967,7 +968,7 @@ class DashboardHandler(http.server.SimpleHTTPRequestHandler):
return
# Update allowed fields
for field in ('status', 'priority', 'title', 'description', 'module'):
for field in ('status', 'priority', 'title', 'description', 'module', 'longTerm'):
if field in data:
bug[field] = data[field]

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: a2aacaf5c6244864ab112cdfdd1bc7bd
AudioImporter:
externalObjects: {}
serializedVersion: 7
defaultSettings:
serializedVersion: 2
loadType: 0
sampleRateSetting: 0
sampleRateOverride: 44100
compressionFormat: 1
quality: 1
conversionMode: 0
preloadAudioData: 0
platformSettingOverrides: {}
forceToMono: 0
normalize: 1
loadInBackground: 0
ambisonic: 0
3D: 1
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 3f4a3f31fcefb1f4b95996e46a23e65e
AudioImporter:
externalObjects: {}
serializedVersion: 7
defaultSettings:
serializedVersion: 2
loadType: 0
sampleRateSetting: 0
sampleRateOverride: 44100
compressionFormat: 1
quality: 1
conversionMode: 0
preloadAudioData: 0
platformSettingOverrides: {}
forceToMono: 0
normalize: 1
loadInBackground: 0
ambisonic: 0
3D: 1
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 6fa126b335a9b2549b831e4dcbe9d33e
AudioImporter:
externalObjects: {}
serializedVersion: 7
defaultSettings:
serializedVersion: 2
loadType: 0
sampleRateSetting: 0
sampleRateOverride: 44100
compressionFormat: 1
quality: 1
conversionMode: 0
preloadAudioData: 0
platformSettingOverrides: {}
forceToMono: 0
normalize: 1
loadInBackground: 0
ambisonic: 0
3D: 1
userData:
assetBundleName:
assetBundleVariant:

View File

@ -37,6 +37,8 @@ MonoBehaviour:
OutsideMultiplayOpenTitle: "\u5F85\u52A0\u5165"
OutsideMultiplayReadyTitle: "\u5DF2\u51C6\u5907"
OutsideMultiplayOpenHint: "\u4ECD\u6709\u5F85\u52A0\u5165\u7684\u5E2D\u4F4D\uFF0C\u8BF7\u51CF\u5C11\u5E2D\u4F4D"
OutsideMultiplayRoomFull: "\u623F\u95F4\u5DF2\u6EE1"
OutsideMultiplayRoomGone: "\u623F\u95F4\u5DF2\u89E3\u6563\u6216\u5DF2\u5F00\u59CB\u6E38\u620F"
OutsideHistoryDropListNoLimitP: "\u4E0D\u9650"
OutsideHistoryDropList2P: "2\u4EBA"
OutsideHistoryDropList3P: "3\u4EBA"

File diff suppressed because one or more lines are too long

View File

@ -37,6 +37,8 @@ MonoBehaviour:
OutsideMultiplayOpenTitle: 20068
OutsideMultiplayReadyTitle: 20069
OutsideMultiplayOpenHint: 20077
OutsideMultiplayRoomFull: 20078
OutsideMultiplayRoomGone: 20079
OutsideHistoryDropListNoLimitP: 17352
OutsideHistoryDropList2P: 17353
OutsideHistoryDropList3P: 17354

View File

@ -302,7 +302,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u4E0B\u4E00\u56DE\u5408"
m_text: "\u4E0B\u4E00\u56DE\u5408{param}"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}

View File

@ -1977,7 +1977,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 475.04083, y: -253.69449}
m_SizeDelta: {x: 830.08167, y: 137.3574}
m_SizeDelta: {x: 0, y: 137.3574}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1640998311177812195
MonoBehaviour:

View File

@ -1587,7 +1587,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 338.1344, y: -253.69449}
m_SizeDelta: {x: 556.2688, y: 137.3574}
m_SizeDelta: {x: 0, y: 137.3574}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1640998311177812195
MonoBehaviour:

View File

@ -897,6 +897,7 @@ RectTransform:
- {fileID: 3133578300518463787}
- {fileID: 2439448078848170519}
- {fileID: 3618832129753901035}
- {fileID: 1474286997294041896}
- {fileID: 6639640428677976138}
- {fileID: 7463303194629128016}
m_Father: {fileID: 0}
@ -1268,6 +1269,131 @@ CanvasGroup:
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!1 &1914164061467379823
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1474286997294041896}
- component: {fileID: 2011404267749524708}
- component: {fileID: 8640139426645544408}
- component: {fileID: 2575979264737155721}
- component: {fileID: 8631636501533165638}
m_Layer: 5
m_Name: MainOption
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1474286997294041896
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1914164061467379823}
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: 6606599364322460693}
- {fileID: 386778647830652531}
- {fileID: 2619787506741607809}
- {fileID: 8378484949347058075}
m_Father: {fileID: 1937094061063432054}
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: 685.66, y: 58.596}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2011404267749524708
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1914164061467379823}
m_CullTransparentMesh: 1
--- !u!114 &8640139426645544408
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1914164061467379823}
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: 4ecd2ec108d90844fa8da6f661f5f2ba, 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 &2575979264737155721
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1914164061467379823}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 0
m_Spacing: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 0
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &8631636501533165638
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1914164061467379823}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8dcc80d08d40bf94ab40a2dc19128fd0, type: 3}
m_Name:
m_EditorClassIdentifier:
options:
- {fileID: 1807640456278866168}
- {fileID: 4210926127593848258}
- {fileID: 5016693945640908142}
SelectBG: {fileID: 6606599364322460693}
Passive: 0
--- !u!1 &1989639312305090475
GameObject:
m_ObjectHideFlags: 0
@ -1343,6 +1469,216 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &1999161440677586977
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 386778647830652531}
- component: {fileID: 7990871729346823581}
- component: {fileID: 7795559999661117964}
- component: {fileID: 1807640456278866168}
- component: {fileID: 8771933438046784565}
m_Layer: 5
m_Name: Option1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &386778647830652531
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1999161440677586977}
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: 1474286997294041896}
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: 232.7144, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7990871729346823581
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1999161440677586977}
m_CullTransparentMesh: 1
--- !u!114 &7795559999661117964
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1999161440677586977}
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: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "bug\u62A5\u544A"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4285151807
m_fontColor: {r: 0.24705884, g: 0.227451, b: 0.4156863, 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: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 24
m_fontStyle: 0
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: 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!114 &1807640456278866168
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1999161440677586977}
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: 0
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: 7795559999661117964}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!114 &8771933438046784565
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1999161440677586977}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 17125
FontID: 2
TextCfg:
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &2051357518330651642
GameObject:
m_ObjectHideFlags: 0
@ -2023,6 +2359,102 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_ShowMaskGraphic: 0
--- !u!1 &3383405614125398143
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6606599364322460693}
- component: {fileID: 6273590708716621151}
- component: {fileID: 1902778048877976185}
- component: {fileID: 874024432785967225}
m_Layer: 5
m_Name: Selected
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6606599364322460693
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3383405614125398143}
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: 1474286997294041896}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 577, y: -28.828}
m_SizeDelta: {x: 219.2009, y: 57.655}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6273590708716621151
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3383405614125398143}
m_CullTransparentMesh: 1
--- !u!114 &1902778048877976185
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3383405614125398143}
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.25490198, g: 0.23137257, b: 0.41960788, 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: 4ecd2ec108d90844fa8da6f661f5f2ba, 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 &874024432785967225
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3383405614125398143}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &3615384252569431640
GameObject:
m_ObjectHideFlags: 0
@ -3095,6 +3527,216 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5846297993139481704
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2619787506741607809}
- component: {fileID: 3385654819515015557}
- component: {fileID: 3403372174413168230}
- component: {fileID: 4210926127593848258}
- component: {fileID: 6687397942884599374}
m_Layer: 5
m_Name: Option2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2619787506741607809
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5846297993139481704}
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: 1474286997294041896}
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: 232.7144, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3385654819515015557
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5846297993139481704}
m_CullTransparentMesh: 1
--- !u!114 &3403372174413168230
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5846297993139481704}
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: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u7FFB\u8BD1\u9519\u8BEF"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4285151807
m_fontColor: {r: 0.24705884, g: 0.227451, b: 0.4156863, 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: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 24
m_fontStyle: 0
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: 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!114 &4210926127593848258
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5846297993139481704}
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: 0
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: 3403372174413168230}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!114 &6687397942884599374
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5846297993139481704}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 272
FontID: 2
TextCfg:
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &5894350066324164393
GameObject:
m_ObjectHideFlags: 0
@ -3164,6 +3806,216 @@ MonoBehaviour:
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &5918702236667496888
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8378484949347058075}
- component: {fileID: 5801127926463566140}
- component: {fileID: 5739847322603019725}
- component: {fileID: 5016693945640908142}
- component: {fileID: 8008891161689170056}
m_Layer: 5
m_Name: Option3
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8378484949347058075
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918702236667496888}
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: 1474286997294041896}
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: 232.7144, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5801127926463566140
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918702236667496888}
m_CullTransparentMesh: 1
--- !u!114 &5739847322603019725
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918702236667496888}
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: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u63D0\u51FA\u5EFA\u8BAE"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, 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: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 24
m_fontStyle: 0
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: 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!114 &5016693945640908142
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918702236667496888}
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: 0
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: 5739847322603019725}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!114 &8008891161689170056
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918702236667496888}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 19676
FontID: 2
TextCfg:
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &6286795247557177253
GameObject:
m_ObjectHideFlags: 0
@ -3343,7 +4195,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 700.719, y: -526.8339}
m_AnchoredPosition: {x: 700.719, y: -585.42993}
m_SizeDelta: {x: 1037.964, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2233556797218185597

View File

@ -5397,7 +5397,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 1150287024181789176, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -79.4652
value: -76.465
objectReference: {fileID: 0}
- target: {fileID: 1350492721882748050, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchorMax.y
@ -5437,7 +5437,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 1604250236086511826, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -79.4652
value: -76.465
objectReference: {fileID: 0}
- target: {fileID: 2012257235429162126, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchorMax.y
@ -5477,7 +5477,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2293914634218563585, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -79.4652
value: -76.465
objectReference: {fileID: 0}
- target: {fileID: 2423916526881118935, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchorMax.y
@ -5489,7 +5489,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2423916526881118935, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_SizeDelta.y
value: 108.4702
value: 105.47
objectReference: {fileID: 0}
- target: {fileID: 2423916526881118935, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.x
@ -5497,7 +5497,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2423916526881118935, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -166.15051
value: -303.675
objectReference: {fileID: 0}
- target: {fileID: 2511047359023480271, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchorMax.y
@ -5529,7 +5529,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2897385894931438084, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_SizeDelta.y
value: 108.4702
value: 105.47
objectReference: {fileID: 0}
- target: {fileID: 2897385894931438084, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.x
@ -5537,7 +5537,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2897385894931438084, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -105.69031
value: -188.205
objectReference: {fileID: 0}
- target: {fileID: 2947719523726246818, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_SizeDelta.x
@ -5573,7 +5573,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4041604487283979261, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_SizeDelta.y
value: 108.4702
value: 105.47
objectReference: {fileID: 0}
- target: {fileID: 4041604487283979261, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.x
@ -5581,7 +5581,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4041604487283979261, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -45.230103
value: -72.735
objectReference: {fileID: 0}
- target: {fileID: 6031293868694483027, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchorMax.y
@ -5693,11 +5693,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 7220624217921356721, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.x
value: 232.36604
value: 283.8
objectReference: {fileID: 0}
- target: {fileID: 7220624217921356721, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -25.230103
value: -23.73
objectReference: {fileID: 0}
- target: {fileID: 7721772225024868457, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_Name
@ -5717,11 +5717,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 8365422807726369352, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.x
value: 232.36604
value: 283.8
objectReference: {fileID: 0}
- target: {fileID: 8365422807726369352, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -25.230103
value: -23.73
objectReference: {fileID: 0}
- target: {fileID: 9043542078479674011, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchorMax.y
@ -5733,11 +5733,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 9043542078479674011, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.x
value: 232.36604
value: 283.8
objectReference: {fileID: 0}
- target: {fileID: 9043542078479674011, guid: f707ad1415ed95c4dbac2aa3ef60e237, type: 3}
propertyPath: m_AnchoredPosition.y
value: -25.230103
value: -23.73
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@ -5970,7 +5970,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4944937303067552312, guid: fb0641be7df17f1489b938bde7529f8b, type: 3}
propertyPath: m_IsActive
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5892710643921794157, guid: fb0641be7df17f1489b938bde7529f8b, type: 3}
propertyPath: m_AnchorMax.y

View File

@ -832,7 +832,7 @@ RectTransform:
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: 397.9826, y: -34}
m_AnchoredPosition: {x: -5, y: -51}
m_SizeDelta: {x: 338.1129, y: 53.9677}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6457064681279636580
@ -1068,7 +1068,7 @@ RectTransform:
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: -557, y: -387}
m_AnchoredPosition: {x: -557, y: -353}
m_SizeDelta: {x: 63.3733, y: 63.6832}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3987244559183850426
@ -1708,7 +1708,7 @@ RectTransform:
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: -1.5339, y: -19.3419}
m_AnchoredPosition: {x: -1.5339, y: 12}
m_SizeDelta: {x: 368.6122, y: 67.1428}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2328433573199222475
@ -2698,7 +2698,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 26, y: -767}
m_AnchoredPosition: {x: 26, y: -747}
m_SizeDelta: {x: 321.8103, y: 104.9406}
m_Pivot: {x: 0, y: 1}
--- !u!222 &8919916523410679615
@ -3247,8 +3247,8 @@ RectTransform:
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: -738.3697, y: -452.11703}
m_SizeDelta: {x: 391.9449, y: 121.9672}
m_AnchoredPosition: {x: -738.55, y: -435.5198}
m_SizeDelta: {x: 391.6, y: 178.7196}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &153221385617399801
CanvasRenderer:
@ -3826,7 +3826,7 @@ RectTransform:
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: 15.5, y: 27.44}
m_AnchoredPosition: {x: 15.5, y: 58.78189}
m_SizeDelta: {x: 216.98, y: 26.42}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3550754327903251425
@ -4066,7 +4066,7 @@ RectTransform:
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: -73, y: 27.44}
m_AnchoredPosition: {x: -73, y: 58.78189}
m_SizeDelta: {x: 216.98, y: 26.42}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9146606384703110025

View File

@ -11807,6 +11807,7 @@ RectTransform:
- {fileID: 442963545254729132}
- {fileID: 2172527432691932578}
- {fileID: 950736415580937085}
- {fileID: 6394447706666146607}
- {fileID: 5306177055940492692}
- {fileID: 5319791491089766199}
m_Father: {fileID: 3681143847542175175}
@ -15698,6 +15699,171 @@ MonoBehaviour:
- {fileID: 2411504628776399857}
SelectBG: {fileID: 5877282367144789499}
Passive: 0
--- !u!1 &4327218388685173335
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6394447706666146607}
- component: {fileID: 905120754425247179}
- component: {fileID: 7202360347716054817}
- component: {fileID: 7247273129590876727}
m_Layer: 5
m_Name: IlegalHint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &6394447706666146607
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4327218388685173335}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1.00008, y: 1.00008, z: 1.00008}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 673566701473212552}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 928.03, y: -58.9889}
m_SizeDelta: {x: 275.93, y: 37.3549}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &905120754425247179
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4327218388685173335}
m_CullTransparentMesh: 1
--- !u!114 &7202360347716054817
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4327218388685173335}
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: "\u623F\u95F4\u540D\u4E0D\u5408\u89C4"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_sharedMaterial: {fileID: -8081454072124122709, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278518015
m_fontColor: {r: 1, g: 0, b: 0.021029472, 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: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 22
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 12
m_fontSizeMax: 22
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: 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!114 &7247273129590876727
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4327218388685173335}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 19979
FontID: 2
TextCfg:
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &4330990698167950129
GameObject:
m_ObjectHideFlags: 0

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 47f0483d122c95d49aa9e90b4d51deb5
guid: 7861091965088df41b5c1aca5e9c0a3e
PrefabImporter:
externalObjects: {}
userData:

View File

@ -1136,6 +1136,171 @@ MonoBehaviour:
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &5763353435607814537
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8484977175690715260}
- component: {fileID: 2874665760547938859}
- component: {fileID: 2400030704245378848}
- component: {fileID: 2998396317244162034}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8484977175690715260
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5763353435607814537}
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: 4512853961089905004}
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: 75.03357, y: -0.17298126}
m_SizeDelta: {x: 124.7169, y: 46.6237}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2874665760547938859
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5763353435607814537}
m_CullTransparentMesh: 1
--- !u!114 &2400030704245378848
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5763353435607814537}
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: "\u5C4F\u853D"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_sharedMaterial: {fileID: -8081454072124122709, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4289079557
m_fontColor: {r: 0.021493427, g: 0.16216365, b: 0.6509434, 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: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 20
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 12
m_fontSizeMax: 24
m_fontStyle: 4
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: 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!114 &2998396317244162034
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5763353435607814537}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
m_Name:
m_EditorClassIdentifier:
Ban: 0
NoExport: 0
FontBan: 0
Preset: 0
ID: 17377
FontID: 2
TextCfg:
- Type: 1
ApplyFontSize: 0
FontSize: 24
ApplyCharacterSpacing: 0
CharacterSpacing: 0
ApplyWordSpacing: 0
WordSpacing: 0
ApplyLineSpacing: 0
LineSpacing: 0
ApplyParagraphSpacing: 0
ParagraphSpacing: 0
--- !u!1 &5879505570580221772
GameObject:
m_ObjectHideFlags: 0
@ -1339,6 +1504,7 @@ RectTransform:
- {fileID: 555533381074390939}
- {fileID: 96625707259803793}
- {fileID: 768525217504304060}
- {fileID: 4512853961089905004}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@ -1402,3 +1568,240 @@ MonoBehaviour:
GameStateText: {fileID: 0}
VersionText: {fileID: 0}
JoinButton: {fileID: 5777197804309038576}
ActionButton: {fileID: 5800461245087449632}
--- !u!1 &8852519433211468652
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4512853961089905004}
- component: {fileID: 5815633150663516744}
- component: {fileID: 60679182699258626}
- component: {fileID: 5800461245087449632}
- component: {fileID: 1345292219526059393}
- component: {fileID: 8403910360848460228}
m_Layer: 5
m_Name: JubaoButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4512853961089905004
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8852519433211468652}
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: 8484977175690715260}
m_Father: {fileID: 2527218108953289808}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 1132.4092, y: -65.257}
m_SizeDelta: {x: 153.5145, y: 65.514}
m_Pivot: {x: 0, y: 0}
--- !u!222 &5815633150663516744
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8852519433211468652}
m_CullTransparentMesh: 1
--- !u!114 &60679182699258626
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8852519433211468652}
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.003921569}
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: df39380aaef39404eaf3e0e9183c785c, type: 3}
m_Type: 1
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1.5
--- !u!114 &5800461245087449632
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8852519433211468652}
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: 60679182699258626}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!82 &1345292219526059393
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8852519433211468652}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!114 &8403910360848460228
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8852519433211468652}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 33d75335a9dad784a91baba5578371fb, type: 3}
m_Name:
m_EditorClassIdentifier:
hoverSound: {fileID: 0}
targetScale: 1.1
clickSound: {fileID: 0}
pressScale: 0.8
scaleDuration: 0.1

View File

@ -66,7 +66,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u6295\u964D"
m_text: "\u4E3E\u62A5"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
@ -169,7 +169,7 @@ GameObject:
- component: {fileID: 8122721559232986071}
- component: {fileID: 749900240545571269}
m_Layer: 5
m_Name: CheckButton
m_Name: NoSeeButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@ -405,7 +405,7 @@ GameObject:
- component: {fileID: 8341363460398201508}
- component: {fileID: 4268531322444815779}
m_Layer: 5
m_Name: SurrenderButton
m_Name: JubaoButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@ -946,7 +946,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u786E\u8BA4"
m_text: "\u5C4F\u853D"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
@ -1060,7 +1060,7 @@ GameObject:
- component: {fileID: 5660124054416036487}
- component: {fileID: 5151123123469694305}
m_Layer: 5
m_Name: UIBottomBottomBarQuitPanel
m_Name: UIOutsideMultiplayRoomActionPanel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@ -1151,13 +1151,12 @@ MonoBehaviour:
m_GameObject: {fileID: 4562217579296961775}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 23a2c17451c60ba4596a82bec9da1626, type: 3}
m_Script: {fileID: 11500000, guid: f86d753f5f274e94b87ac0f58e6c5eed, type: 3}
m_Name:
m_EditorClassIdentifier:
Animancer: {fileID: 5660124054416036487}
CancelButton: {fileID: 3793769769101931997}
SurrenderButton: {fileID: 6171244316253519132}
CheckButton: {fileID: 4254165084226125654}
BlockButton: {fileID: 4254165084226125654}
ReportButton: {fileID: 6171244316253519132}
--- !u!1 &4669599011627093475
GameObject:
m_ObjectHideFlags: 0
@ -1536,7 +1535,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u9000\u51FA\u672C\u5C40"
m_text: "\u7279\u6B8A\u64CD\u4F5C"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ce4904f8ddac15944907907115531ad5, type: 2}
m_sharedMaterial: {fileID: 1214840240034325189, guid: ce4904f8ddac15944907907115531ad5, type: 2}
@ -1969,9 +1968,9 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7534345392331640139}
- {fileID: 8336259769512063222}
- {fileID: 3276818161146238211}
- {fileID: 8336259769512063222}
- {fileID: 7534345392331640139}
m_Father: {fileID: 2929065332464497643}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
@ -2086,7 +2085,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u662F\u5426\u9000\u51FA\u6E38\u620F\uFF1F\n\u6E38\u620F\u5C06\u81EA\u52A8\u4FDD\u5B58"
m_text: "\u5C4F\u853D\u623F\u95F4\u540E\u5C06\u57281\u5929\u5185\u4E0D\u518D\u663E\u793A\u8BE5\u73A9\u5BB6\u7684\u623F\u95F4\uFF0C\u4E3E\u62A5\u529F\u80FD\u4ECD\u5728\u5F00\u53D1\u4E2D\u3002"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}
m_sharedMaterial: {fileID: -8081454072124122709, guid: 8e119f168f1a6b745be02ef19f51610f, type: 2}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d4ab4a8a3b7e1024f820bff533bdcb3f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,17 +1,85 @@
# TH1 屏蔽词表
# 规则:
# - 一行一个词
# - #开头的行是注释
# - 空行忽略
# - 大小写不敏感
# TH1 banned word fallback list
# Scope:
# - Small high-confidence fallback for room names and player chat.
# - Steam text filtering should still run first when available.
# - Do not add political, religious, historical, personal-name, or broad sensitive terms here.
# - One entry per line. Lines starting with # are ignored.
# - Matching is case-insensitive in code.
#
# 来源建议GitHub 搜 sensitive-words / textfilter 有现成多语种词表,复制粘贴即可
# 修改本文件后无需重启编辑器,下次进游戏自动重新加载
# Maintenance:
# - Keep this list compact to reduce false positives.
# - Avoid very short ambiguous English words such as ass, sex, die, kill.
# - Move to a generated multi-source word-list before treating this as a compliance solution.
# ========== 中文 ==========
# English
fuck
fucking
fucker
motherfucker
shit
bullshit
asshole
bitch
bastard
cunt
dickhead
dick
cock
pussy
whore
slut
nigger
nigga
# ========== English ==========
# Chinese
傻逼
傻b
煞笔
妈的
他妈的
去你妈
你妈逼
草你妈
草泥马
操你
操你妈
卧槽
尼玛
死妈
鸡巴
几把
贱人
王八蛋
混蛋
狗屎
# ========== 日本語 ==========
# Japanese
くそ
クソ
ちくしょう
ばかやろう
バカヤロー
死ね
くたばれ
ファック
ちんこ
まんこ
# ========== 한국어 ==========
# Korean
씨발
시발
ㅅㅂ
병신
개새끼
새끼
좆같
지랄
꺼져
죽어
엿먹어
미친놈
미친년
보지
자지

View File

@ -104,6 +104,9 @@ namespace Logic.Audio
path["SFX/MATCH_lose"] = "Audio/SFX/MATCH_lose";
path["SFX/UNIT_born"] = "Audio/SFX/UNIT_born";
path["SFX/start"] = "Audio/SFX/start";
path["SFX/UI_message"] = "Audio/SFX/UI_message";
path["SFX/UI_playerenter"] = "Audio/SFX/UI_playerenter";
path["SFX/UI_beep"] = "Audio/SFX/UI_beep";

View File

@ -133,7 +133,9 @@ namespace TH1_Core.Events
TurnHint,
ExamineTech,
ExamineCityExp,
InfiltrateStealCoin
InfiltrateStealCoin,
OutsideMultiplayRoomFull,
OutsideMultiplayRoomGone
}
public struct ShowUINotifyCommon
{

View File

@ -176,6 +176,7 @@ namespace TH1_Core.Managers
{
//step #2
DebugUI?.Update();
UIBottomManager?.Update();
//如果正在AIPlaying 更新AIHint
if (Main.MapData != null && Main.MapData.CurPlayer != null && Main.MapData.CurPlayer != Main.MapData.PlayerMap.SelfPlayerData)

View File

@ -41,6 +41,8 @@ public class TextDataAssets : ScriptableObject
[MultilingualField]public string OutsideMultiplayOpenTitle;
[MultilingualField]public string OutsideMultiplayReadyTitle;
[MultilingualField]public string OutsideMultiplayOpenHint;
[MultilingualField]public string OutsideMultiplayRoomFull;
[MultilingualField]public string OutsideMultiplayRoomGone;
[MultilingualField]public string OutsideHistoryDropListNoLimitP;
[MultilingualField]public string OutsideHistoryDropList2P;

View File

@ -1,51 +1,57 @@
/*
* @Description: Resources/banned_words.txt *
* @Date: 2026-05-22
*/
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
#if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX
using Steamworks;
#endif
namespace TH1_Logic.Chat
{
public enum BannedTextContext
{
GameContent,
Chat,
Name
}
public static class BannedWordFilter
{
private const string ResourcePath = "banned_words";
private static readonly List<string> _words = new List<string>();
private static readonly string[] BuiltInWords = { "fuck" };
private static bool _loaded;
/// <summary>
/// 对输入文本做屏蔽词过滤,命中词原地替换为同长度的 *。
/// 大小写不敏感。空字符串/null 原样返回。
/// </summary>
public static string Filter(string input)
#if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX
private static bool _steamFilterInitAttempted;
private static bool _steamFilterAvailable;
#endif
public static string Filter(string input, BannedTextContext context = BannedTextContext.GameContent, ulong sourceSteamId = 0)
{
if (string.IsNullOrEmpty(input)) return input;
EnsureLoaded();
if (_words.Count == 0) return input;
string result = input;
EnsureLoaded();
string result = TrySteamFilter(input, context, sourceSteamId, out var steamFiltered)
? steamFiltered
: input;
foreach (var word in BuiltInWords)
{
result = ReplaceWord(result, word);
}
foreach (var word in _words)
{
int searchStart = 0;
while (searchStart < result.Length)
{
int idx = result.IndexOf(word, searchStart, StringComparison.OrdinalIgnoreCase);
if (idx < 0) break;
result = result.Substring(0, idx)
+ new string('*', word.Length)
+ result.Substring(idx + word.Length);
searchStart = idx + word.Length;
}
result = ReplaceWord(result, word);
}
return result;
}
/// <summary>
/// 强制重新加载词表。调试/热更新词表时手动调用。
/// </summary>
public static void Reload()
{
_loaded = false;
@ -61,7 +67,7 @@ namespace TH1_Logic.Chat
var ta = Resources.Load<TextAsset>(ResourcePath);
if (ta == null)
{
Debug.LogWarning($"[BannedWordFilter] Resources/{ResourcePath}.txt 未找到,屏蔽词过滤不生效");
Debug.LogWarning($"[BannedWordFilter] Resources/{ResourcePath}.txt not found, local word-list filtering is disabled");
return;
}
@ -72,7 +78,79 @@ namespace TH1_Logic.Chat
if (line.StartsWith("#")) continue;
_words.Add(line);
}
Debug.Log($"[BannedWordFilter] 加载完成,共 {_words.Count} 个屏蔽词");
Debug.Log($"[BannedWordFilter] Loaded {_words.Count} local banned words");
}
private static bool TrySteamFilter(string input, BannedTextContext context, ulong sourceSteamId, out string filtered)
{
filtered = null;
#if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX
try
{
if (!CallbackDispatcher.IsInitialized) return false;
if (!_steamFilterInitAttempted)
{
_steamFilterInitAttempted = true;
_steamFilterAvailable = SteamUtils.InitFilterText(0);
if (!_steamFilterAvailable)
{
Debug.LogWarning("[BannedWordFilter] Steam text filter unavailable, falling back to local word list");
}
}
if (!_steamFilterAvailable) return false;
var source = sourceSteamId == 0 ? CSteamID.Nil : new CSteamID(sourceSteamId);
uint bufferSize = (uint)Math.Max(Encoding.UTF8.GetByteCount(input) + 1, 1);
int filteredCount = SteamUtils.FilterText(MapSteamContext(context), source, input, out filtered, bufferSize);
return filteredCount >= 0 && filtered != null;
}
catch (Exception e) when (e is DllNotFoundException || e is EntryPointNotFoundException || e is InvalidOperationException)
{
_steamFilterAvailable = false;
Debug.LogWarning($"[BannedWordFilter] Steam text filter failed, falling back to local word list: {e.Message}");
return false;
}
#else
return false;
#endif
}
#if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX
private static ETextFilteringContext MapSteamContext(BannedTextContext context)
{
switch (context)
{
case BannedTextContext.Chat:
return ETextFilteringContext.k_ETextFilteringContextChat;
case BannedTextContext.Name:
return ETextFilteringContext.k_ETextFilteringContextName;
default:
return ETextFilteringContext.k_ETextFilteringContextGameContent;
}
}
#endif
private static string ReplaceWord(string input, string word)
{
if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(word)) return input;
int searchStart = 0;
while (searchStart < input.Length)
{
int idx = input.IndexOf(word, searchStart, StringComparison.OrdinalIgnoreCase);
if (idx < 0) break;
input = input.Substring(0, idx)
+ new string('*', word.Length)
+ input.Substring(idx + word.Length);
searchStart = idx + word.Length;
}
return input;
}
}
}

View File

@ -39,7 +39,7 @@ namespace TH1_Logic.Chat
var item = new ChatItem();
item.Hash = System.Guid.NewGuid().GetHashCode();
item.SenderId = lobby.GetSelfMemberId();
item.Message = BannedWordFilter.Filter(message);
item.Message = BannedWordFilter.Filter(message, BannedTextContext.Chat, item.SenderId);
item.Time = Time.time;
ChatItems.Add(item);
@ -56,7 +56,7 @@ namespace TH1_Logic.Chat
public void ReceiveChatItem(ChatItem newItem)
{
if (newItem == null || _chatItems.ContainsKey(newItem.Hash)) return;
newItem.Message = BannedWordFilter.Filter(newItem.Message);
newItem.Message = BannedWordFilter.Filter(newItem.Message, BannedTextContext.Chat, newItem.SenderId);
newItem.Time = Time.time;
ChatItems.Add(newItem);
_chatItems[newItem.Hash] = newItem;
@ -87,4 +87,4 @@ namespace TH1_Logic.Chat
[MemoryPackIgnore]
public bool AlreadyUIShow;
}
}
}

View File

@ -1124,7 +1124,7 @@ namespace TH1_Logic.Steam
}
var filteredRoomName = result.ToString();
if (string.IsNullOrEmpty(filteredRoomName)) return "Default";
return BannedWordFilter.Filter(filteredRoomName);
return BannedWordFilter.Filter(filteredRoomName, BannedTextContext.Name);
}
public bool IsInitialized()

View File

@ -116,6 +116,11 @@ namespace TH1_UI.Controller.Bottom
WindowScript.HideBottomBarNextTurn();
}
public void RefreshNextTurnCountdown()
{
WindowScript?.RefreshNextTurnCountdown();
}
public void ShowBottomBarTabUnit()
{
@ -215,4 +220,4 @@ namespace TH1_UI.Controller.Bottom
Close();
}
}
}
}

View File

@ -94,9 +94,9 @@ namespace TH1_UI.Core
{
BottomBarController.BottomBarQuit();
}
public static void Update()
public void Update()
{
BottomBarController?.RefreshNextTurnCountdown();
}
public void UpdateBottomBarHeroAvatar()
@ -119,4 +119,4 @@ namespace TH1_UI.Core
}
}
}

View File

@ -38,7 +38,7 @@ namespace TH1_UI.View.Bottom.Chat
}
else
{
SenderText.text = BannedWordFilter.Filter(data.SenderName) + ":";
SenderText.text = BannedWordFilter.Filter(data.SenderName, BannedTextContext.Name) + ":";
SenderText.color = data.IsSelf ? SelfNameColor : OtherNameColor;
}
}
@ -46,7 +46,7 @@ namespace TH1_UI.View.Bottom.Chat
// 设置消息内容
if (MessageText != null)
{
MessageText.text = BannedWordFilter.Filter(data.Message);
MessageText.text = BannedWordFilter.Filter(data.Message, BannedTextContext.Chat);
}
// 设置时间

View File

@ -49,6 +49,10 @@ namespace TH1_UI.View.Bottom
public UIBottomBottomBarNextTurnConfirmPanelMono NextTurnConfirmPanel;
public int _tabUnitCount = 0;
private TextMeshProUGUI _nextButtonText;
private MultilingualTextMono _nextButtonMultilingualText;
private string _lastNextTurnCountdownParam;
private int _lastCountdownBeepSecond = -1;
protected override void OnInit()
{
@ -117,8 +121,8 @@ namespace TH1_UI.View.Bottom
public void SetNextTurnButtonVisible(bool visible)
{
if(visible) ShowButton(NextButton);
else HideButton(NextButton);
if(visible) ShowBottomBarNextTurn();
else HideBottomBarNextTurn();
}
//通常一局只会set一次,每次都是完全清空,然后绑定新的一个对局的按钮
@ -128,6 +132,7 @@ namespace TH1_UI.View.Bottom
QuitPanel.gameObject.SetActive(false);
if (NextTurnConfirmPanel != null)
NextTurnConfirmPanel.gameObject.SetActive(false);
CacheNextTurnButtonText();
QuitButton.onClick.RemoveAllListeners();
QuitButton.onClick.AddListener(OnQuitButtonClicked);
@ -163,6 +168,7 @@ namespace TH1_UI.View.Bottom
// 初始检查 TabButton 是否显示
SetTabButtonVisible(CheckHasTabUnit(out var _));
RefreshNextTurnCountdown();
}
private void OnQuitButtonClicked()
@ -305,6 +311,7 @@ namespace TH1_UI.View.Bottom
//HideButton(TechButton);
//HideButton(HeroButton);
HideButton(NextButton);
SetNextTurnCountdownParam(string.Empty);
}
public void HideBottomBarTabUnit()
@ -324,9 +331,73 @@ namespace TH1_UI.View.Bottom
{
//ShowButton(TechButton);
ShowButton(NextButton);
RefreshNextTurnCountdown();
//ShowButton(HeroButton);
}
public void RefreshNextTurnCountdown()
{
SetNextTurnCountdownParam(GetNextTurnCountdownParam());
}
private void Update()
{
RefreshNextTurnCountdown();
}
private string GetNextTurnCountdownParam()
{
var map = Main.MapData;
if (map?.MapConfig == null || map.Net == null || map.PlayerMap == null) return string.Empty;
if (map.Net.Mode != NetMode.Multi) return string.Empty;
if (!map.MapConfig.IsLimitTime || map.MapConfig.TimeLimitSeconds <= 0) return string.Empty;
if (map.CurPlayer == null || map.PlayerMap.SelfPlayerData == null) return string.Empty;
if (map.CurPlayer != map.PlayerMap.SelfPlayerData) return string.Empty;
if (NextButton == null || !NextButton.gameObject.activeInHierarchy) return string.Empty;
var remainingSeconds = map.Net.PlayerStartTime > 0f
? Mathf.CeilToInt(map.MapConfig.TimeLimitSeconds - (Time.time - map.Net.PlayerStartTime))
: map.MapConfig.TimeLimitSeconds;
if (remainingSeconds < 0) remainingSeconds = 0;
PlayCountdownBeepIfNeeded(remainingSeconds);
return $" {remainingSeconds}s";
}
private void SetNextTurnCountdownParam(string param)
{
CacheNextTurnButtonText();
if (_nextButtonMultilingualText == null) return;
param ??= string.Empty;
if (string.IsNullOrEmpty(param)) _lastCountdownBeepSecond = -1;
if (_lastNextTurnCountdownParam == param) return;
_lastNextTurnCountdownParam = param;
_nextButtonMultilingualText.ParamList = new List<string> { param };
_nextButtonMultilingualText.OnMultilingualChanged();
}
private void PlayCountdownBeepIfNeeded(int secondsLeft)
{
if (secondsLeft > 10 || secondsLeft <= 0)
{
_lastCountdownBeepSecond = -1;
return;
}
if (_lastCountdownBeepSecond == secondsLeft) return;
_lastCountdownBeepSecond = secondsLeft;
AudioManager.Instance.PlayAudio("SFX/UI_beep");
}
private void CacheNextTurnButtonText()
{
if (_nextButtonMultilingualText != null) return;
if (NextButton == null) return;
_nextButtonText = NextButton.GetComponentInChildren<TextMeshProUGUI>(true);
_nextButtonMultilingualText = _nextButtonText != null
? _nextButtonText.GetComponent<MultilingualTextMono>()
: null;
}
public void SetTechButtonVisible(bool visible)
{

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Logic.Audio;
using Logic.Multilingual;
using TH1_Logic.Net;
using TH1_Logic.Steam;
@ -33,6 +34,7 @@ namespace TH1_UI.View.Bottom
private List<UIBottomNetRowMono> _netInfoRowList = null;
private bool _initialized = false;
private int _lastNetMemberCount = -1;
protected override void OnInit()
{
@ -119,6 +121,7 @@ namespace TH1_UI.View.Bottom
var lobbyInfo = LobbyManager.Instance.Lobby as SteamLobbyManager;
if (lobbyInfo == null) return;
var mids = lobbyInfo.GetAllMemberInfo();
PlayMemberEnterAudioIfNeeded(mids.Count);
//如果发现人数变多了重新Init比如继续一个3人局游戏开始进来的时候只有2人
if (mids.Count > _netInfoRowList.Count)
@ -141,6 +144,13 @@ namespace TH1_UI.View.Bottom
}
}
private void PlayMemberEnterAudioIfNeeded(int memberCount)
{
if (_lastNetMemberCount >= 0 && memberCount > _lastNetMemberCount)
AudioManager.Instance.PlayAudio("SFX/UI_playerenter");
_lastNetMemberCount = memberCount;
}
private void Update()
{
@ -208,6 +218,7 @@ namespace TH1_UI.View.Bottom
public void CloseView()
{
_initialized = false;
_lastNetMemberCount = -1;
// 清理 ChatArea
CloseChatArea();

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Logic.Audio;
using Logic.Multilingual;
using TH1_Logic.Chat;
using TH1_Logic.Net;
@ -281,6 +282,8 @@ namespace TH1_UI.View.Common
};
CreateChatRow(data);
}
if (newCount > 0)
AudioManager.Instance.PlayAudio("SFX/UI_message");
Debug.Log($"[ChatArea] RefreshChatBox: {newCount} new messages, total items={items.Count}, rows={_chatRows.Count}");
}
@ -342,7 +345,7 @@ namespace TH1_UI.View.Common
senderName = $"玩家{item.SenderId}";
if (sb.Length > 0) sb.Append('\n');
sb.Append(FilterChatText(senderName)).Append(':').Append(FilterChatText(item.Message));
sb.Append(FilterNameText(senderName)).Append(':').Append(FilterChatText(item.Message));
}
DocText.text = sb.ToString();
@ -390,7 +393,7 @@ namespace TH1_UI.View.Common
// 拼接显示文本: "发言者:内容" 或系统消息直接显示内容
string displayMessage = FilterChatText(data.Message);
string displaySenderName = FilterChatText(data.SenderName);
string displaySenderName = FilterNameText(data.SenderName);
string displayText = data.IsSystem
? displayMessage
: $"{displaySenderName}:{displayMessage}";
@ -407,7 +410,12 @@ namespace TH1_UI.View.Common
private static string FilterChatText(string text)
{
return BannedWordFilter.Filter(text);
return BannedWordFilter.Filter(text, BannedTextContext.Chat);
}
private static string FilterNameText(string text)
{
return BannedWordFilter.Filter(text, BannedTextContext.Name);
}
}

View File

@ -56,6 +56,12 @@ namespace TH1_UI.View.Notify
case UINotifyCommonType.InfiltrateStealCoin:
MultilingualManager.Instance.SetUIText(content,Table.Instance.TextDataAssets.NotifyUIInfiltrateStealCoin,new List<string>(){eventType.IntParam.ToString()});
break;
case UINotifyCommonType.OutsideMultiplayRoomFull:
MultilingualManager.Instance.SetUIText(content,Table.Instance.TextDataAssets.OutsideMultiplayRoomFull);
break;
case UINotifyCommonType.OutsideMultiplayRoomGone:
MultilingualManager.Instance.SetUIText(content,Table.Instance.TextDataAssets.OutsideMultiplayRoomGone);
break;
}
Timer.Instance.TimerRegister(this, AutoClose,1f,"UINotifyCommonView");
}

View File

@ -0,0 +1,51 @@
using TH1_Logic.Chat;
namespace TH1_UI.View.Outside
{
internal static class RoomNameInputValidator
{
public const int MaxRoomNameLength = 20;
public const string InvalidRoomNameHint = "房间名称包含不适当内容,请修改后再确认。禁止使用辱骂、歧视、色情、广告、冒充官方或泄露隐私等内容。";
public const string InvalidCharactersHint = "房间名称只能使用中文、英文字母、数字、下划线、中划线和点。";
public static string SanitizeAllowedCharacters(string input)
{
if (string.IsNullOrEmpty(input)) return string.Empty;
var result = new System.Text.StringBuilder();
foreach (char c in input.Trim())
{
bool isChinese = c >= '\u4e00' && c <= '\u9fff';
bool isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
bool isDigit = c >= '0' && c <= '9';
bool isAllowedSymbol = c == '_' || c == '-' || c == '.';
if (isChinese || isLetter || isDigit || isAllowedSymbol)
{
result.Append(c);
}
if (result.Length >= MaxRoomNameLength) break;
}
return result.ToString();
}
public static bool TryValidateForSubmit(string input, string fallbackRoomName, out string roomName, out string hint)
{
roomName = SanitizeAllowedCharacters(input);
if (string.IsNullOrEmpty(roomName)) roomName = SanitizeAllowedCharacters(fallbackRoomName);
if (string.IsNullOrEmpty(roomName)) roomName = "Default";
var filtered = BannedWordFilter.Filter(roomName, BannedTextContext.Name);
if (filtered != roomName)
{
hint = InvalidRoomNameHint;
return false;
}
hint = null;
return true;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2a7a6d47e24d4e2f95a2c3d6ce1b4a78
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -35,6 +35,8 @@ namespace TH1_UI.View.Outside
public TMP_InputField PasswordInput;
public GameObject PasswordHintObject;
public TextMeshProUGUI PasswordHintText;
public GameObject RoomNameHintObject;
public TextMeshProUGUI RoomNameHintText;
private Action<CreateRoomParams> _onConfirm;
private Action _onClose;
@ -63,6 +65,7 @@ namespace TH1_UI.View.Outside
RoomType.OnOptionClicked = _ => RefreshPasswordVisible();
AutoBindRoomNameInput();
InitRoomNameInput();
EnsureSeatCountOption();
AutoBindPasswordLabel();
EnsurePasswordHint();
@ -76,6 +79,7 @@ namespace TH1_UI.View.Outside
SeatCount?.Init(SeatToIndex(defaultSeatCount));
if (RoomNameInput != null) RoomNameInput.text = string.Empty;
SetRoomNamePlaceholder(_defaultRoomName);
HideRoomNameHint();
if (PasswordInput != null) PasswordInput.text = string.Empty;
HidePasswordHint();
RefreshPasswordVisible();
@ -88,9 +92,13 @@ namespace TH1_UI.View.Outside
public bool TryBuildParams(out CreateRoomParams args)
{
var roomName = RoomNameInput != null ? RoomNameInput.text?.Trim() : string.Empty;
if (string.IsNullOrEmpty(roomName)) roomName = _defaultRoomName;
roomName = SteamLobbyManager.FilterRoomName(roomName);
args = default;
var inputRoomName = RoomNameInput != null ? RoomNameInput.text : string.Empty;
if (!RoomNameInputValidator.TryValidateForSubmit(inputRoomName, _defaultRoomName, out var roomName, out var roomNameHint))
{
ShowRoomNameHint(roomNameHint);
return false;
}
args = new CreateRoomParams
{
@ -172,6 +180,38 @@ namespace TH1_UI.View.Outside
}
}
private void InitRoomNameInput()
{
if (RoomNameInput == null) return;
RoomNameInput.characterLimit = RoomNameInputValidator.MaxRoomNameLength;
RoomNameInput.onValueChanged.RemoveListener(OnRoomNameInputChanged);
RoomNameInput.onValueChanged.AddListener(OnRoomNameInputChanged);
}
private void OnRoomNameInputChanged(string value)
{
HideRoomNameHint();
var sanitized = RoomNameInputValidator.SanitizeAllowedCharacters(value);
if (sanitized == value) return;
RoomNameInput.SetTextWithoutNotify(sanitized);
RoomNameInput.caretPosition = sanitized.Length;
ShowRoomNameHint(RoomNameInputValidator.InvalidCharactersHint);
}
private void ShowRoomNameHint(string hint)
{
EnsureRoomNameHint();
if (RoomNameHintText != null) RoomNameHintText.text = hint;
if (RoomNameHintObject != null) RoomNameHintObject.SetActive(true);
}
private void HideRoomNameHint()
{
if (RoomNameHintObject != null) RoomNameHintObject.SetActive(false);
}
private void ShowPasswordHint()
{
EnsurePasswordHint();
@ -274,6 +314,30 @@ namespace TH1_UI.View.Outside
PasswordHintObject.SetActive(false);
}
private void EnsureRoomNameHint()
{
if (RoomNameHintObject != null && RoomNameHintText != null) return;
if (RoomNameInput == null || RoomNameInput.textComponent == null) return;
var hintObject = new GameObject("RoomNameHint", typeof(RectTransform));
hintObject.transform.SetParent(RoomNameInput.transform.parent, false);
var rect = hintObject.GetComponent<RectTransform>();
rect.anchorMin = new Vector2(0.5f, 0.5f);
rect.anchorMax = new Vector2(0.5f, 0.5f);
rect.pivot = new Vector2(0.5f, 0.5f);
rect.anchoredPosition = new Vector2(0f, -34f);
rect.sizeDelta = new Vector2(520f, 54f);
RoomNameHintText = hintObject.AddComponent<TextMeshProUGUI>();
RoomNameHintText.font = RoomNameInput.textComponent.font;
RoomNameHintText.fontSize = 18f;
RoomNameHintText.color = Color.red;
RoomNameHintText.alignment = TextAlignmentOptions.Center;
RoomNameHintText.text = RoomNameInputValidator.InvalidRoomNameHint;
RoomNameHintObject = hintObject;
RoomNameHintObject.SetActive(false);
}
private int GetSeatCount()
{
if (SeatCount == null) return 4;

View File

@ -0,0 +1,117 @@
using System;
using System.Text.RegularExpressions;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace TH1_UI.View.Outside
{
public class UIOutsideMultiplayJoinPasswordPanelMono : MonoBehaviour
{
public GameObject PanelRoot;
public Button CheckButton;
public Button CloseButton;
public TMP_InputField PasswordInput;
public GameObject PasswordHintObject;
public TextMeshProUGUI PasswordHintText;
private Action<string> _onConfirm;
private Action _onClose;
public void Init(Action<string> onConfirm, Action onClose = null)
{
_onConfirm = onConfirm;
_onClose = onClose;
if (CheckButton != null)
{
CheckButton.onClick.RemoveAllListeners();
CheckButton.onClick.AddListener(OnClickCheck);
}
if (CloseButton != null)
{
CloseButton.onClick.RemoveAllListeners();
CloseButton.onClick.AddListener(OnClickClose);
}
if (PasswordInput != null)
{
PasswordInput.characterLimit = 4;
PasswordInput.onValueChanged.RemoveListener(OnPasswordChanged);
PasswordInput.onValueChanged.AddListener(OnPasswordChanged);
}
Hide();
}
public void Show()
{
if (PasswordInput != null)
PasswordInput.text = string.Empty;
HideHint();
GetRoot().SetActive(true);
PasswordInput?.ActivateInputField();
}
public void Hide()
{
GetRoot().SetActive(false);
}
private void OnClickCheck()
{
var password = PasswordInput != null ? PasswordInput.text?.Trim() : string.Empty;
if (!IsValidPassword(password))
{
ShowHint();
return;
}
Hide();
_onConfirm?.Invoke(password);
}
private void OnClickClose()
{
Hide();
_onClose?.Invoke();
}
private void OnPasswordChanged(string value)
{
HideHint();
if (PasswordInput == null) return;
var sanitized = Regex.Replace(value ?? string.Empty, @"\D", string.Empty);
if (sanitized == value) return;
PasswordInput.SetTextWithoutNotify(sanitized);
PasswordInput.caretPosition = sanitized.Length;
}
private void ShowHint()
{
if (PasswordHintText != null)
PasswordHintText.text = "密码必须是4位数字请重新输入";
if (PasswordHintObject != null)
PasswordHintObject.SetActive(true);
}
private void HideHint()
{
if (PasswordHintObject != null)
PasswordHintObject.SetActive(false);
}
private static bool IsValidPassword(string password)
{
return !string.IsNullOrEmpty(password) && Regex.IsMatch(password, @"^\d{4}$");
}
private GameObject GetRoot()
{
return PanelRoot != null ? PanelRoot : gameObject;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b3f19e9ed4884c44a8e548dbf29d4c37
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -14,11 +14,13 @@ public class UIOutsideMultiplayLobbyRowMono : MonoBehaviour
public TextMeshProUGUI GameStateText;
public TextMeshProUGUI VersionText;
public Button JoinButton;
public Button ActionButton;
private LobbyListInfo _lobbyInfo;
public bool CheckParam()
{
AutoBindButtons();
return RoomNameText != null && OwnerNameText != null
&& PlayerCountText != null && JoinButton != null;
}
@ -29,7 +31,7 @@ public class UIOutsideMultiplayLobbyRowMono : MonoBehaviour
/// <param name="lobbyInfo">房间信息</param>
/// <param name="lobby">SteamLobbyManager实例</param>
/// <param name="onJoinClicked">加入按钮回调由View统一处理</param>
public void SetContent(LobbyListInfo lobbyInfo, SteamLobbyManager lobby, Action<LobbyListInfo> onJoinClicked)
public void SetContent(LobbyListInfo lobbyInfo, SteamLobbyManager lobby, Action<LobbyListInfo> onJoinClicked, Action<LobbyListInfo> onActionClicked = null)
{
if (!CheckParam()) return;
@ -38,7 +40,7 @@ public class UIOutsideMultiplayLobbyRowMono : MonoBehaviour
var roomName = string.IsNullOrEmpty(lobbyInfo.RoomName)
? $"Room {lobbyInfo.LobbyId}"
: lobbyInfo.RoomName;
RoomNameText.text = BannedWordFilter.Filter(roomName);
RoomNameText.text = BannedWordFilter.Filter(roomName, BannedTextContext.Name);
OwnerNameText.text = lobbyInfo.OwnerName ?? "Unknown";
PlayerCountText.text = $"{lobbyInfo.CurrentPlayers}/{lobbyInfo.MaxPlayers}";
@ -49,6 +51,24 @@ public class UIOutsideMultiplayLobbyRowMono : MonoBehaviour
JoinButton.onClick.RemoveAllListeners();
JoinButton.onClick.AddListener(() => onJoinClicked?.Invoke(_lobbyInfo));
if (ActionButton != null)
{
ActionButton.onClick.RemoveAllListeners();
ActionButton.onClick.AddListener(() => onActionClicked?.Invoke(_lobbyInfo));
}
}
private void AutoBindButtons()
{
if (ActionButton == null)
ActionButton = FindButton("ActionButton") ?? FindButton("MoreButton") ?? FindButton("OptionButton");
}
private Button FindButton(string buttonName)
{
var child = transform.Find(buttonName);
return child != null ? child.GetComponent<Button>() : null;
}
void Start()

View File

@ -0,0 +1,67 @@
using System;
using TH1_Logic.Steam;
using UnityEngine;
using UnityEngine.UI;
namespace TH1_UI.View.Outside
{
public class UIOutsideMultiplayRoomActionPanelMono : MonoBehaviour
{
public Button CancelButton;
public Button BlockButton;
public Button ReportButton;
private LobbyListInfo _lobbyInfo;
private Action<LobbyListInfo> _onBlock;
private Action<LobbyListInfo> _onReport;
public void Init(Action<LobbyListInfo> onBlock, Action<LobbyListInfo> onReport)
{
_onBlock = onBlock;
_onReport = onReport;
if (CancelButton != null)
{
CancelButton.onClick.RemoveAllListeners();
CancelButton.onClick.AddListener(Hide);
}
if (BlockButton != null)
{
BlockButton.onClick.RemoveAllListeners();
BlockButton.onClick.AddListener(OnClickBlock);
}
if (ReportButton != null)
{
ReportButton.onClick.RemoveAllListeners();
ReportButton.onClick.AddListener(OnClickReport);
}
Hide();
}
public void Show(LobbyListInfo lobbyInfo)
{
_lobbyInfo = lobbyInfo;
gameObject.SetActive(true);
}
public void Hide()
{
gameObject.SetActive(false);
}
private void OnClickBlock()
{
Hide();
_onBlock?.Invoke(_lobbyInfo);
}
private void OnClickReport()
{
Hide();
_onReport?.Invoke(_lobbyInfo);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f86d753f5f274e94b87ac0f58e6c5eed
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -4,6 +4,7 @@ using Animancer;
using Logic;
using Logic.Action;
using Logic.AI;
using Logic.Audio;
using Logic.Multilingual;
using ParadoxNotion;
using RuntimeData;
@ -66,6 +67,8 @@ namespace TH1_UI.View.Outside
public TMP_InputField RoomNameInput;
public Button RoomNameEditButton;
public Button RoomNameCheckButton;
public GameObject RoomNameHintObject;
public TextMeshProUGUI RoomNameHintText;
@ -81,6 +84,10 @@ namespace TH1_UI.View.Outside
public Button RefreshHallButton;
public GameObject HallRowPrefab;
public GameObject HallList;
public GameObject JoinPasswordPanel;
public UIOutsideMultiplayJoinPasswordPanelMono JoinPasswordPanelMono;
public GameObject RoomActionPanel;
public UIOutsideMultiplayRoomActionPanelMono RoomActionPanelMono;
[Header("聊天区域")]
public RectTransform ChatAreaRoot;
@ -110,6 +117,7 @@ namespace TH1_UI.View.Outside
private List<UIOutsideMultiplayLobbyRowMono> _lobbyRowList;
private UIChatAreaMono _chatArea;
private GameObject _chatAreaGo;
private LobbyListInfo _pendingJoinLobbyInfo;
private SteamLobbyManager _lobby;
private const int MaxRoomSeatCount = 4;
@ -122,6 +130,7 @@ namespace TH1_UI.View.Outside
public ViDelegateAssisstant.Dele OnStartGame;
private bool _noRoom = false;
private int _lastRoomMemberCount = -1;
// 自动刷新大厅列表
private float _lastLobbyRefreshTime = 0f;
@ -223,6 +232,13 @@ namespace TH1_UI.View.Outside
RoomNameCheckButton.onClick.AddListener(ConfirmEditRoomName);
}
if (RoomNameInput != null)
{
RoomNameInput.characterLimit = RoomNameInputValidator.MaxRoomNameLength;
RoomNameInput.onValueChanged.RemoveListener(OnRoomNameInputChanged);
RoomNameInput.onValueChanged.AddListener(OnRoomNameInputChanged);
}
if (ReadyButton != null)
{
SetButtonText(ReadyButton, MultilingualManager.Instance.GetMultilingualText(Table.Instance.TextDataAssets.OutsideMultiplayReadyTitle));
@ -244,6 +260,8 @@ namespace TH1_UI.View.Outside
_lobbyRowList = new List<UIOutsideMultiplayLobbyRowMono>();
_lobby = LobbyManager.Instance.Lobby as SteamLobbyManager;
EnsureMultiplaySubPanels();
RefreshHallButton.onClick.RemoveAllListeners();
RefreshHallButton.onClick.AddListener(OnRefreshLobbyClicked);
@ -370,18 +388,28 @@ namespace TH1_UI.View.Outside
{
CloseChatArea();
_noRoom = true;
_lastRoomMemberCount = -1;
SetNoRoom();
}
else
{
InitChatArea();
_noRoom = false;
PlayMemberEnterAudioIfNeeded();
SetRoomInfoSetting();
SetRoomInfoMember();
ShowRoom();
}
}
private void PlayMemberEnterAudioIfNeeded()
{
int memberCount = _lobby.GetMemberCount();
if (_lastRoomMemberCount >= 0 && memberCount > _lastRoomMemberCount)
AudioManager.Instance.PlayAudio("SFX/UI_playerenter");
_lastRoomMemberCount = memberCount;
}
private void ShowRoom()
{
@ -1008,6 +1036,7 @@ namespace TH1_UI.View.Outside
RoomNameInput.ActivateInputField();
}
HideRoomNameHint();
SetRoomNameEditMode(true);
}
@ -1019,12 +1048,14 @@ namespace TH1_UI.View.Outside
return;
}
var roomName = RoomNameInput != null ? RoomNameInput.text?.Trim() : string.Empty;
if (!string.IsNullOrEmpty(roomName))
var inputRoomName = RoomNameInput != null ? RoomNameInput.text : string.Empty;
if (!RoomNameInputValidator.TryValidateForSubmit(inputRoomName, _lobby.GetRoomName(), out var roomName, out var roomNameHint))
{
_lobby.SetRoomName(roomName);
ShowRoomNameHint(roomNameHint);
return;
}
_lobby.SetRoomName(roomName);
SetRoomNameEditMode(false);
}
@ -1045,9 +1076,59 @@ namespace TH1_UI.View.Outside
RoomNameInput.gameObject.SetActive(isEditing);
}
if (!isEditing) HideRoomNameHint();
if (RoomNameEditButton != null) RoomNameEditButton.gameObject.SetActive(canEdit && !isEditing);
if (RoomNameCheckButton != null) RoomNameCheckButton.gameObject.SetActive(canEdit && isEditing);
}
private void OnRoomNameInputChanged(string value)
{
HideRoomNameHint();
var sanitized = RoomNameInputValidator.SanitizeAllowedCharacters(value);
if (sanitized == value) return;
RoomNameInput.SetTextWithoutNotify(sanitized);
RoomNameInput.caretPosition = sanitized.Length;
ShowRoomNameHint(RoomNameInputValidator.InvalidCharactersHint);
}
private void ShowRoomNameHint(string hint)
{
EnsureRoomNameHint();
if (RoomNameHintText != null) RoomNameHintText.text = hint;
if (RoomNameHintObject != null) RoomNameHintObject.SetActive(true);
}
private void HideRoomNameHint()
{
if (RoomNameHintObject != null) RoomNameHintObject.SetActive(false);
}
private void EnsureRoomNameHint()
{
if (RoomNameHintObject != null && RoomNameHintText != null) return;
if (RoomNameInput == null || RoomNameInput.textComponent == null) return;
var hintObject = new GameObject("RoomNameHint", typeof(RectTransform));
hintObject.transform.SetParent(RoomNameInput.transform.parent, false);
var rect = hintObject.GetComponent<RectTransform>();
rect.anchorMin = new Vector2(0.5f, 0.5f);
rect.anchorMax = new Vector2(0.5f, 0.5f);
rect.pivot = new Vector2(0.5f, 0.5f);
rect.anchoredPosition = new Vector2(0f, -34f);
rect.sizeDelta = new Vector2(520f, 54f);
RoomNameHintText = hintObject.AddComponent<TextMeshProUGUI>();
RoomNameHintText.font = RoomNameInput.textComponent.font;
RoomNameHintText.fontSize = 18f;
RoomNameHintText.color = Color.red;
RoomNameHintText.alignment = TextAlignmentOptions.Center;
RoomNameHintText.text = RoomNameInputValidator.InvalidRoomNameHint;
RoomNameHintObject = hintObject;
RoomNameHintObject.SetActive(false);
}
public void OnPlayerOptionClicked(uint idx)
{
@ -1673,7 +1754,7 @@ namespace TH1_UI.View.Outside
for (int i = 0; i < lobbyCount; i++)
{
_lobbyRowList[i].gameObject.SetActive(true);
_lobbyRowList[i].SetContent(lobbyInfos[i], _lobby, OnJoinLobbyClicked);
_lobbyRowList[i].SetContent(lobbyInfos[i], _lobby, OnJoinLobbyClicked, OnLobbyActionClicked);
}
}
@ -1690,15 +1771,112 @@ namespace TH1_UI.View.Outside
if (lobbyInfo.GameState != 0)
{
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.LobbyJoinFailed);
ShowLobbyNotify(UINotifyCommonType.OutsideMultiplayRoomGone);
return;
}
if (lobbyInfo.MaxPlayers > 0 && lobbyInfo.CurrentPlayers >= lobbyInfo.MaxPlayers)
{
ShowLobbyNotify(UINotifyCommonType.OutsideMultiplayRoomFull);
return;
}
if (lobbyInfo.HasPassword)
{
if (JoinPasswordPanelMono != null)
{
_pendingJoinLobbyInfo = lobbyInfo;
JoinPasswordPanelMono.Show();
}
else
{
Debug.LogError("[UIOutsideMultiplay] Join password panel is missing.");
JoinLobbyWithPassword(lobbyInfo, string.Empty);
}
return;
}
//注册一次性加入结果监听
JoinLobbyWithPassword(lobbyInfo, string.Empty);
}
private void OnJoinPasswordConfirmed(string password)
{
if (_pendingJoinLobbyInfo == null) return;
JoinLobbyWithPassword(_pendingJoinLobbyInfo, password);
_pendingJoinLobbyInfo = null;
}
private void JoinLobbyWithPassword(LobbyListInfo lobbyInfo, string password)
{
_lobby.OnLobbyEnteredEvent += OnLobbyJoinSuccess;
_lobby.OnLobbyErrorEvent += OnLobbyJoinFailed;
_lobby.RefreshLobbyListInfo();
LobbyManager.Instance.Lobby.JoinLobbyById(lobbyInfo.LobbyId);
LobbyManager.Instance.Lobby.JoinLobbyById(lobbyInfo.LobbyId, password);
}
private void OnLobbyActionClicked(LobbyListInfo lobbyInfo)
{
RoomActionPanelMono?.Show(lobbyInfo);
}
private void OnBlockLobbyClicked(LobbyListInfo lobbyInfo)
{
Debug.Log($"[UIOutsideMultiplay] Block lobby owner: {lobbyInfo?.OwnerId}");
}
private void OnReportLobbyClicked(LobbyListInfo lobbyInfo)
{
Debug.Log($"[UIOutsideMultiplay] Report lobby owner: {lobbyInfo?.OwnerId}");
EventManager.Publish(new ShowUIGlobalBugReport());
}
private void ShowLobbyNotify(UINotifyCommonType type)
{
EventManager.Publish(new ShowUINotifyCommon { UINotifyCommonType = type });
}
private void EnsureMultiplaySubPanels()
{
if (JoinPasswordPanelMono == null)
{
if (JoinPasswordPanel == null)
{
var existing = transform.Find("UIOutsideMultiplayJoinPasswordPanel");
JoinPasswordPanel = existing != null ? existing.gameObject : null;
}
if (JoinPasswordPanel == null)
{
var prefab = Resources.Load<GameObject>("Prefab/UI/Outside/UIOutsideMultiplayJoinPasswordPanel");
if (prefab != null)
JoinPasswordPanel = Instantiate(prefab, transform);
}
JoinPasswordPanelMono = JoinPasswordPanel?.GetComponent<UIOutsideMultiplayJoinPasswordPanelMono>();
}
JoinPasswordPanelMono?.Init(OnJoinPasswordConfirmed);
if (RoomActionPanelMono == null)
{
if (RoomActionPanel == null)
{
var existing = transform.Find("UIOutsideMultiplayRoomActionPanel");
RoomActionPanel = existing != null ? existing.gameObject : null;
}
if (RoomActionPanel == null)
{
var prefab = Resources.Load<GameObject>("Prefab/UI/Outside/UIOutsideMultiplayRoomActionPanel");
if (prefab != null)
RoomActionPanel = Instantiate(prefab, transform);
}
RoomActionPanelMono = RoomActionPanel?.GetComponent<UIOutsideMultiplayRoomActionPanelMono>();
}
RoomActionPanelMono?.Init(OnBlockLobbyClicked, OnReportLobbyClicked);
}
/// <summary>

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff