打地鼠重置

This commit is contained in:
2025-08-01 15:18:12 +08:00
parent f883c502f7
commit 171bae4663
25 changed files with 4190 additions and 4083 deletions
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -19,7 +19,22 @@ MonoBehaviour:
m_Key: line:0559767
m_Metadata:
m_Items:
- rid: 2067218726650904583
- rid: 2067218753147109378
- m_Id: 26134354672488448
m_Key: line:02365db
m_Metadata:
m_Items:
- rid: 2067218753147109379
- m_Id: 26134354676682752
m_Key: line:0ee9c21
m_Metadata:
m_Items:
- rid: 2067218753147109380
- m_Id: 26134354676682753
m_Key: line:003a5c5
m_Metadata:
m_Items:
- rid: 2067218753147109381
m_Metadata:
m_Items: []
m_KeyGenerator:
@@ -31,8 +46,23 @@ MonoBehaviour:
type: {class: DistributedUIDGenerator, ns: UnityEngine.Localization.Tables, asm: Unity.Localization}
data:
m_CustomEpoch: 1747199431587
- rid: 2067218726650904583
- rid: 2067218753147109378
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: Start
tags: []
- rid: 2067218753147109379
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: Start
tags: []
- rid: 2067218753147109380
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: "\u6253\u5730\u9F20\u6E38\u620F\u901A\u8FC7"
tags: []
- rid: 2067218753147109381
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: "\u6253\u5730\u9F20\u6E38\u620F\u5931\u8D25"
tags: []
@@ -22,6 +22,18 @@ MonoBehaviour:
m_Localized: "me: \u6253\u5730\u9F20\u6D4B\u8BD5"
m_Metadata:
m_Items: []
- m_Id: 26134354672488448
m_Localized: "me: \u6D4B\u8BD5[[size]]\u53D8\u5927[[/size]]\u6B63\u5E38"
m_Metadata:
m_Items: []
- m_Id: 26134354676682752
m_Localized: "me: \u6210\u529F"
m_Metadata:
m_Items: []
- m_Id: 26134354676682753
m_Localized: "me: \u5931\u8D25"
m_Metadata:
m_Items: []
references:
version: 2
RefIds: []
+2 -2
View File
@@ -488,7 +488,7 @@ Material:
- _WindXPosition: 0
- _WorldTilingPixelsPerUnit: 100
m_Colors:
- _AddColorColor: {r: 2.996078, g: 0, b: 0, a: 0}
- _AddColorColor: {r: 0.913099, g: 0.14995982, b: 0.14995982, a: 1}
- _AlphaTintColor: {r: 0, g: 0, b: 0, a: 0}
- _BlackTintColor: {r: 0, g: 0, b: 1, a: 0}
- _BurnEdgeColor: {r: 11.98431, g: 1.129412, b: 0.1254902, a: 0}
@@ -595,7 +595,7 @@ Material:
- _ShiftingColorA: {r: 1.498039, g: 0, b: 0, a: 0}
- _ShiftingColorB: {r: 1.498039, g: 0.7490196, b: 0, a: 0}
- _ShineColor: {r: 11.98431, g: 11.98431, b: 11.98431, a: 0}
- _SineGlowColor: {r: 0, g: 2.007843, b: 2.996078, a: 0}
- _SineGlowColor: {r: 0.79129815, g: 0.36130688, b: 0.045186214, a: 1}
- _SineMoveFrequency: {r: 1, g: 1, b: 0, a: 0}
- _SineMoveOffset: {r: 0, g: 0.5, b: 0, a: 0}
- _SineRotatePivot: {r: 0.5, g: 0.5, b: 0, a: 0}
Binary file not shown.
+323 -222
View File
@@ -93,132 +93,6 @@ ScriptedImporter:
uvTransform: {x: 0, y: 0}
spritePosition: {x: 0, y: 0}
mosaicSpriteImportData:
- name: EXPRESION
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 240
y: 7932
width: 175
height: 25
spriteID: cac8e98ca09555145be1c8e98e17adbe
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 240, y: 7932}
spritePosition: {x: 1135, y: 427}
- name: 'LOGIC '
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 302
y: 7448
width: 25
height: 107
spriteID: 24f4f1b70d5a63546ae8f128c3185327
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 302, y: 7448}
spritePosition: {x: 1509, y: 1472}
- name: 'EMOT '
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 302
y: 7563
width: 25
height: 97
spriteID: 1f86f8254e117ac46a16c855741ba4b3
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 302, y: 7563}
spritePosition: {x: 897, y: 1490}
- name: MEMORY
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 302
y: 7382
width: 132
height: 25
spriteID: 34120f3620ef9d447a1bb64297147be5
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 302, y: 7382}
spritePosition: {x: 1184, y: 1634}
- name: 'VISION '
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 302
y: 7415
width: 108
height: 25
spriteID: 301c88c7258ca894aa24d5888e22f4af
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 302, y: 7415}
spritePosition: {x: 1388, y: 1204}
- name: EXTENSION
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 240
y: 7899
width: 181
height: 25
spriteID: 9b807da2e21e8d04aae917d529c7dcc0
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 240, y: 7899}
spritePosition: {x: 1132, y: 1364}
- name: "\u60C5\u611F\u53F3"
originalName:
pivot: {x: 1, y: 0.5}
@@ -226,8 +100,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 441
y: 7670
x: 2020
y: 6138
width: 49
height: 81
spriteID: 8ee1829f145adac4cada54af0898e927
@@ -238,7 +112,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 442, y: 7670}
uvTransform: {x: 2020, y: 6138}
spritePosition: {x: 793, y: 1499}
- name: "\u60C5\u611F\u5DE6"
originalName:
@@ -247,8 +121,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 338
y: 7965
x: 1421
y: 5519
width: 41
height: 81
spriteID: 47f41d9c8ff3fe74b85fc28bbcb73708
@@ -259,7 +133,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 338, y: 7965}
uvTransform: {x: 1421, y: 5519}
spritePosition: {x: 761, y: 1499}
- name: "\u8BB0\u5FC6\u53F3"
originalName:
@@ -268,8 +142,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 328
y: 7670
x: 1792
y: 6138
width: 49
height: 82
spriteID: 880150e9e43b11e4e80eb0f0e31d2d7b
@@ -280,7 +154,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 328, y: 7670}
uvTransform: {x: 1792, y: 6138}
spritePosition: {x: 1018, y: 1543}
- name: "\u8BB0\u5FC6\u5DE6"
originalName:
@@ -289,8 +163,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 414
y: 7197
x: 1364
y: 5518
width: 41
height: 82
spriteID: 2ac67bad364284f40882e9f8f7317c31
@@ -301,7 +175,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 414, y: 7197}
uvTransform: {x: 1364, y: 5518}
spritePosition: {x: 986, y: 1543}
- name: "\u601D\u7EF4\u53F3"
originalName:
@@ -310,8 +184,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 328
y: 7760
x: 1849
y: 6138
width: 49
height: 82
spriteID: a48543e6cca7c324888144d2dcf84484
@@ -322,7 +196,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 328, y: 7760}
uvTransform: {x: 1849, y: 6138}
spritePosition: {x: 1579, y: 1443}
- name: "\u601D\u7EF4\u5DE6"
originalName:
@@ -331,8 +205,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 414
y: 7287
x: 1364
y: 5608
width: 41
height: 82
spriteID: aabe36443d7d4364491cc2fe72f7ece9
@@ -343,7 +217,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 414, y: 7287}
uvTransform: {x: 1364, y: 5608}
spritePosition: {x: 1547, y: 1443}
- name: "\u8BED\u8A00\u53F3"
originalName:
@@ -352,8 +226,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 442
y: 7759
x: 2077
y: 6138
width: 49
height: 81
spriteID: 085c33f36bebaa741be012c596e618fa
@@ -364,7 +238,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 442, y: 7759}
uvTransform: {x: 2077, y: 6138}
spritePosition: {x: 1212, y: 492}
- name: "\u8BED\u8A00\u5DE6"
originalName:
@@ -373,8 +247,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 387
y: 7965
x: 1421
y: 5608
width: 41
height: 81
spriteID: 42f26d908c37d454b9e983b63ef74953
@@ -385,7 +259,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 387, y: 7965}
uvTransform: {x: 1421, y: 5608}
spritePosition: {x: 1180, y: 492}
- name: "\u6269\u5C55\u53F3"
originalName:
@@ -394,8 +268,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 385
y: 7670
x: 1906
y: 6138
width: 49
height: 82
spriteID: 6bf14ad1201e0a444b4335a3e586b778
@@ -406,7 +280,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 385, y: 7670}
uvTransform: {x: 1906, y: 6138}
spritePosition: {x: 1212, y: 1016}
- name: "\u6269\u5C55\u5DE6"
originalName:
@@ -415,8 +289,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 240
y: 7965
x: 1364
y: 5698
width: 41
height: 82
spriteID: a81772844f9f7d7458a487ce9aac3bc5
@@ -427,7 +301,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 240, y: 7965}
uvTransform: {x: 1364, y: 5698}
spritePosition: {x: 1180, y: 1016}
- name: "\u5DE6\u773C\u5DE6"
originalName:
@@ -436,8 +310,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 414
y: 7108
x: 1364
y: 5429
width: 49
height: 81
spriteID: 391befd4d6c68fa4c8137aea4fc0906a
@@ -448,7 +322,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 414, y: 7108}
uvTransform: {x: 1364, y: 5429}
spritePosition: {x: 949, y: 1039}
- name: "\u5DE6\u773C\u53F3"
originalName:
@@ -457,8 +331,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 436
y: 7965
x: 1421
y: 5697
width: 41
height: 81
spriteID: 66812d7769a083f4d969c545d4741b76
@@ -469,7 +343,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 436, y: 7965}
uvTransform: {x: 1421, y: 5697}
spritePosition: {x: 917, y: 1039}
- name: "\u53F3\u773C\u5DE6"
originalName:
@@ -478,8 +352,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 385
y: 7760
x: 1963
y: 6138
width: 49
height: 82
spriteID: fc8b43481499fbb42bdbc7fe3da8860d
@@ -490,7 +364,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 385, y: 7760}
uvTransform: {x: 1963, y: 6138}
spritePosition: {x: 1470, y: 1039}
- name: "\u53F3\u773C\u53F3"
originalName:
@@ -499,8 +373,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 289
y: 7965
x: 1421
y: 5429
width: 41
height: 82
spriteID: 6ec3d202dbc4b924d979298a5d9a9162
@@ -511,8 +385,134 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 289, y: 7965}
uvTransform: {x: 1421, y: 5429}
spritePosition: {x: 1438, y: 1039}
- name: "\u8868\u8FBE\u80CC\u666F"
originalName:
pivot: {x: 0, y: 0.5}
alignment: 4
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 1858
y: 4680
width: 182
height: 33
spriteID: f83ccab486a753044aaea7ced26c7e5c
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1858, y: 4680}
spritePosition: {x: 1132, y: 423}
- name: "\u8BB0\u5FC6\u80CC\u666F"
originalName:
pivot: {x: 0, y: 0.5}
alignment: 4
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 1929
y: 6047
width: 134
height: 39
spriteID: f2e87c161ca7592448ca53b02b4f34b4
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1929, y: 6047}
spritePosition: {x: 1181, y: 1629}
- name: "\u601D\u7EF4\u80CC\u666F"
originalName:
pivot: {x: 0, y: 0.5}
alignment: 4
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 1792
y: 6100
width: 136
height: 30
spriteID: 1dd2f0bb806a9d147b547afdda2b28eb
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1792, y: 6100}
spritePosition: {x: 1453, y: 1514}
- name: "\u89C6\u89C9\u80CC\u666F"
originalName:
pivot: {x: 0, y: 0.5}
alignment: 4
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 1792
y: 6047
width: 129
height: 45
spriteID: 10241bb3ac5f4b94cbe4ee6ee47efb8f
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1792, y: 6047}
spritePosition: {x: 1379, y: 1195}
- name: "\u60C5\u7EEA\u80CC\u666F"
originalName:
pivot: {x: 0, y: 0.5}
alignment: 4
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 1936
y: 6100
width: 134
height: 28
spriteID: 5f163d43ad7427943b115f60eea853b3
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1936, y: 6100}
spritePosition: {x: 843, y: 1527}
- name: "\u62D3\u5C55\u80CC\u666F"
originalName:
pivot: {x: 0, y: 0.5}
alignment: 4
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 1858
y: 4628
width: 217
height: 44
spriteID: 279ac1e75adc0e04191fcebfbfae499b
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1858, y: 4628}
spritePosition: {x: 1114, y: 1355}
- name: "\u82F1\u91CC\u8BB2\u8BDD\u6A21\u5757"
originalName:
pivot: {x: 0.5, y: 0.5}
@@ -520,8 +520,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
y: 7899
x: 1364
y: 5188
width: 228
height: 233
spriteID: 77c7308e7564b164793c69ce83bed43f
@@ -532,7 +532,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 7899}
uvTransform: {x: 1364, y: 5188}
spritePosition: {x: 1105, y: 412}
- name: "\u601D\u7EF4\u6A21\u5757"
originalName:
@@ -541,8 +541,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
y: 7670
x: 1792
y: 5818
width: 316
height: 221
spriteID: c958339204034e94993b425f8e985352
@@ -553,7 +553,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 7670}
uvTransform: {x: 1792, y: 5818}
spritePosition: {x: 1497, y: 1416}
- name: "\u60C5\u7EEA\u6A21\u5757 "
originalName:
@@ -562,8 +562,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
y: 7382
x: 1858
y: 4340
width: 290
height: 280
spriteID: cd023d13e1444754098eaa4c15a5e9f0
@@ -574,7 +574,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 7382}
uvTransform: {x: 1858, y: 4340}
spritePosition: {x: 670, y: 1381}
- name: "\u8BB0\u5FC6\u6A21\u5757"
originalName:
@@ -583,8 +583,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
y: 7108
x: 1732
y: 4754
width: 402
height: 266
spriteID: ea727aea94d983d4d984c7c066692c09
@@ -595,7 +595,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 7108}
uvTransform: {x: 1732, y: 4754}
spritePosition: {x: 964, y: 1504}
- name: "\u82F1\u91CC \u5DE6\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
originalName:
@@ -604,7 +604,7 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
x: 1296
y: 5818
width: 488
height: 434
@@ -616,6 +616,27 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1296, y: 5818}
spritePosition: {x: 576, y: 963}
- name: "\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
y: 5818
width: 1284
height: 434
spriteID: d0db0450cb597b1448f8ddba68c69714
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 5818}
spritePosition: {x: 576, y: 963}
- name: "\u82F1\u91CC\u53F3\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
@@ -625,8 +646,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
y: 6260
x: 1364
y: 4340
width: 486
height: 406
spriteID: 30a8ad3fffe366549ab70802705a418d
@@ -637,7 +658,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 6260}
uvTransform: {x: 1364, y: 4340}
spritePosition: {x: 1374, y: 991}
- name: "\u82F1\u91CC\u4E2D\u95F4\u6A21\u5757\u57FA\u5EA7"
originalName:
@@ -646,8 +667,8 @@ ScriptedImporter:
border: {x: 0, y: 0, z: 0, w: 0}
rect:
serializedVersion: 2
x: 4
y: 6674
x: 1364
y: 4754
width: 360
height: 426
spriteID: 190f2eb16fb613f45a88e7cefe3d7789
@@ -658,7 +679,7 @@ ScriptedImporter:
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 6674}
uvTransform: {x: 1364, y: 4754}
spritePosition: {x: 1038, y: 996}
- name: "\u82F1\u91CC\u5185\u90E8\u6784\u9020"
originalName:
@@ -1592,7 +1613,7 @@ ScriptedImporter:
spriteCategoryList:
categories: []
spritePackingTag:
resliceFromLayer: 0
resliceFromLayer: 1
mosaicPSDLayers:
- name: "\u82F1\u91CC\u6A21\u5757\u540D\u79F0"
spriteName:
@@ -1603,7 +1624,7 @@ ScriptedImporter:
mosaicPosition: {x: 0, y: 0}
flatten: 0
isImported: 0
isVisible: 1
isVisible: 0
- name: EXPRESION
spriteName: EXPRESION
isGroup: 0
@@ -1612,7 +1633,7 @@ ScriptedImporter:
layerID: 197
mosaicPosition: {x: 240, y: 7932}
flatten: 0
isImported: 1
isImported: 0
isVisible: 1
- name: 'LOGIC '
spriteName: 'LOGIC '
@@ -1622,7 +1643,7 @@ ScriptedImporter:
layerID: 196
mosaicPosition: {x: 302, y: 7448}
flatten: 0
isImported: 1
isImported: 0
isVisible: 1
- name: 'EMOT '
spriteName: 'EMOT '
@@ -1632,7 +1653,7 @@ ScriptedImporter:
layerID: 195
mosaicPosition: {x: 302, y: 7563}
flatten: 0
isImported: 1
isImported: 0
isVisible: 1
- name: MEMORY
spriteName: MEMORY
@@ -1642,7 +1663,7 @@ ScriptedImporter:
layerID: 194
mosaicPosition: {x: 302, y: 7382}
flatten: 0
isImported: 1
isImported: 0
isVisible: 1
- name: 'VISION '
spriteName: 'VISION '
@@ -1652,7 +1673,7 @@ ScriptedImporter:
layerID: 192
mosaicPosition: {x: 302, y: 7415}
flatten: 0
isImported: 1
isImported: 0
isVisible: 1
- name: EXTENSION
spriteName: EXTENSION
@@ -1662,7 +1683,7 @@ ScriptedImporter:
layerID: 191
mosaicPosition: {x: 240, y: 7899}
flatten: 0
isImported: 1
isImported: 0
isVisible: 1
- name: "\u82F1\u91CC\u63D2\u5B54"
spriteName:
@@ -1690,7 +1711,7 @@ ScriptedImporter:
parentIndex: 8
spriteID: 8ee1829f145adac4cada54af0898e927
layerID: 77
mosaicPosition: {x: 442, y: 7670}
mosaicPosition: {x: 2020, y: 6138}
flatten: 0
isImported: 1
isVisible: 1
@@ -1700,7 +1721,7 @@ ScriptedImporter:
parentIndex: 8
spriteID: 47f41d9c8ff3fe74b85fc28bbcb73708
layerID: 76
mosaicPosition: {x: 338, y: 7965}
mosaicPosition: {x: 1421, y: 5519}
flatten: 0
isImported: 1
isVisible: 1
@@ -1720,7 +1741,7 @@ ScriptedImporter:
parentIndex: 11
spriteID: 880150e9e43b11e4e80eb0f0e31d2d7b
layerID: 72
mosaicPosition: {x: 328, y: 7670}
mosaicPosition: {x: 1792, y: 6138}
flatten: 0
isImported: 1
isVisible: 1
@@ -1730,7 +1751,7 @@ ScriptedImporter:
parentIndex: 11
spriteID: 2ac67bad364284f40882e9f8f7317c31
layerID: 71
mosaicPosition: {x: 414, y: 7197}
mosaicPosition: {x: 1364, y: 5518}
flatten: 0
isImported: 1
isVisible: 1
@@ -1750,7 +1771,7 @@ ScriptedImporter:
parentIndex: 14
spriteID: a48543e6cca7c324888144d2dcf84484
layerID: 67
mosaicPosition: {x: 328, y: 7760}
mosaicPosition: {x: 1849, y: 6138}
flatten: 0
isImported: 1
isVisible: 1
@@ -1760,7 +1781,7 @@ ScriptedImporter:
parentIndex: 14
spriteID: aabe36443d7d4364491cc2fe72f7ece9
layerID: 66
mosaicPosition: {x: 414, y: 7287}
mosaicPosition: {x: 1364, y: 5608}
flatten: 0
isImported: 1
isVisible: 1
@@ -1780,7 +1801,7 @@ ScriptedImporter:
parentIndex: 17
spriteID: 085c33f36bebaa741be012c596e618fa
layerID: 62
mosaicPosition: {x: 442, y: 7759}
mosaicPosition: {x: 2077, y: 6138}
flatten: 0
isImported: 1
isVisible: 1
@@ -1790,7 +1811,7 @@ ScriptedImporter:
parentIndex: 17
spriteID: 42f26d908c37d454b9e983b63ef74953
layerID: 61
mosaicPosition: {x: 387, y: 7965}
mosaicPosition: {x: 1421, y: 5608}
flatten: 0
isImported: 1
isVisible: 1
@@ -1810,7 +1831,7 @@ ScriptedImporter:
parentIndex: 20
spriteID: 6bf14ad1201e0a444b4335a3e586b778
layerID: 57
mosaicPosition: {x: 385, y: 7670}
mosaicPosition: {x: 1906, y: 6138}
flatten: 0
isImported: 1
isVisible: 1
@@ -1820,7 +1841,7 @@ ScriptedImporter:
parentIndex: 20
spriteID: a81772844f9f7d7458a487ce9aac3bc5
layerID: 56
mosaicPosition: {x: 240, y: 7965}
mosaicPosition: {x: 1364, y: 5698}
flatten: 0
isImported: 1
isVisible: 1
@@ -1840,7 +1861,7 @@ ScriptedImporter:
parentIndex: 23
spriteID: 391befd4d6c68fa4c8137aea4fc0906a
layerID: 52
mosaicPosition: {x: 414, y: 7108}
mosaicPosition: {x: 1364, y: 5429}
flatten: 0
isImported: 1
isVisible: 1
@@ -1850,7 +1871,7 @@ ScriptedImporter:
parentIndex: 23
spriteID: 66812d7769a083f4d969c545d4741b76
layerID: 51
mosaicPosition: {x: 436, y: 7965}
mosaicPosition: {x: 1421, y: 5697}
flatten: 0
isImported: 1
isVisible: 1
@@ -1870,7 +1891,7 @@ ScriptedImporter:
parentIndex: 26
spriteID: fc8b43481499fbb42bdbc7fe3da8860d
layerID: 47
mosaicPosition: {x: 385, y: 7760}
mosaicPosition: {x: 1963, y: 6138}
flatten: 0
isImported: 1
isVisible: 1
@@ -1880,7 +1901,77 @@ ScriptedImporter:
parentIndex: 26
spriteID: 6ec3d202dbc4b924d979298a5d9a9162
layerID: 46
mosaicPosition: {x: 289, y: 7965}
mosaicPosition: {x: 1421, y: 5429}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u5C4F\u5E55\u80CC\u666F"
spriteName:
isGroup: 1
parentIndex: -1
spriteID: 6c684c46f61cf6a4e9fe178aefb36f91
layerID: 220
mosaicPosition: {x: 0, y: 0}
flatten: 0
isImported: 0
isVisible: 1
- name: "\u8868\u8FBE\u80CC\u666F"
spriteName: "\u8868\u8FBE\u80CC\u666F"
isGroup: 0
parentIndex: 29
spriteID: f83ccab486a753044aaea7ced26c7e5c
layerID: 219
mosaicPosition: {x: 1858, y: 4680}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u8BB0\u5FC6\u80CC\u666F"
spriteName: "\u8BB0\u5FC6\u80CC\u666F"
isGroup: 0
parentIndex: 29
spriteID: f2e87c161ca7592448ca53b02b4f34b4
layerID: 222
mosaicPosition: {x: 1929, y: 6047}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u601D\u7EF4\u80CC\u666F"
spriteName: "\u601D\u7EF4\u80CC\u666F"
isGroup: 0
parentIndex: 29
spriteID: 1dd2f0bb806a9d147b547afdda2b28eb
layerID: 223
mosaicPosition: {x: 1792, y: 6100}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u89C6\u89C9\u80CC\u666F"
spriteName: "\u89C6\u89C9\u80CC\u666F"
isGroup: 0
parentIndex: 29
spriteID: 10241bb3ac5f4b94cbe4ee6ee47efb8f
layerID: 224
mosaicPosition: {x: 1792, y: 6047}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u60C5\u7EEA\u80CC\u666F"
spriteName: "\u60C5\u7EEA\u80CC\u666F"
isGroup: 0
parentIndex: 29
spriteID: 5f163d43ad7427943b115f60eea853b3
layerID: 225
mosaicPosition: {x: 1936, y: 6100}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u62D3\u5C55\u80CC\u666F"
spriteName: "\u62D3\u5C55\u80CC\u666F"
isGroup: 0
parentIndex: 29
spriteID: 279ac1e75adc0e04191fcebfbfae499b
layerID: 226
mosaicPosition: {x: 1858, y: 4628}
flatten: 0
isImported: 1
isVisible: 1
@@ -1897,49 +1988,59 @@ ScriptedImporter:
- name: "\u82F1\u91CC\u8BB2\u8BDD\u6A21\u5757"
spriteName: "\u82F1\u91CC\u8BB2\u8BDD\u6A21\u5757"
isGroup: 0
parentIndex: 29
parentIndex: 36
spriteID: 77c7308e7564b164793c69ce83bed43f
layerID: 39
mosaicPosition: {x: 4, y: 7899}
mosaicPosition: {x: 1364, y: 5188}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u601D\u7EF4\u6A21\u5757"
spriteName: "\u601D\u7EF4\u6A21\u5757"
isGroup: 0
parentIndex: 29
parentIndex: 36
spriteID: c958339204034e94993b425f8e985352
layerID: 141
mosaicPosition: {x: 4, y: 7670}
mosaicPosition: {x: 1792, y: 5818}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u60C5\u7EEA\u6A21\u5757 "
spriteName: "\u60C5\u7EEA\u6A21\u5757 "
isGroup: 0
parentIndex: 29
parentIndex: 36
spriteID: cd023d13e1444754098eaa4c15a5e9f0
layerID: 140
mosaicPosition: {x: 4, y: 7382}
mosaicPosition: {x: 1858, y: 4340}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u8BB0\u5FC6\u6A21\u5757"
spriteName: "\u8BB0\u5FC6\u6A21\u5757"
isGroup: 0
parentIndex: 29
parentIndex: 36
spriteID: ea727aea94d983d4d984c7c066692c09
layerID: 139
mosaicPosition: {x: 4, y: 7108}
mosaicPosition: {x: 1732, y: 4754}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u82F1\u91CC \u5DE6\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
spriteName: "\u82F1\u91CC \u5DE6\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
isGroup: 0
parentIndex: 29
parentIndex: 36
spriteID: c88832e692a3cad499f6ac0e2c10e4a4
layerID: 18
mosaicPosition: {x: 1296, y: 5818}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
spriteName: "\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
isGroup: 0
parentIndex: 36
spriteID: d0db0450cb597b1448f8ddba68c69714
layerID: 228
mosaicPosition: {x: 4, y: 5818}
flatten: 0
isImported: 1
@@ -1947,20 +2048,20 @@ ScriptedImporter:
- name: "\u82F1\u91CC\u53F3\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
spriteName: "\u82F1\u91CC\u53F3\u89C6\u89C9\u6A21\u5757\u57FA\u5EA7"
isGroup: 0
parentIndex: 29
parentIndex: 36
spriteID: 30a8ad3fffe366549ab70802705a418d
layerID: 14
mosaicPosition: {x: 4, y: 6260}
mosaicPosition: {x: 1364, y: 4340}
flatten: 0
isImported: 1
isVisible: 1
- name: "\u82F1\u91CC\u4E2D\u95F4\u6A21\u5757\u57FA\u5EA7"
spriteName: "\u82F1\u91CC\u4E2D\u95F4\u6A21\u5757\u57FA\u5EA7"
isGroup: 0
parentIndex: 29
parentIndex: 36
spriteID: 190f2eb16fb613f45a88e7cefe3d7789
layerID: 10
mosaicPosition: {x: 4, y: 6674}
mosaicPosition: {x: 1364, y: 4754}
flatten: 0
isImported: 1
isVisible: 1
File diff suppressed because it is too large Load Diff
@@ -12,20 +12,17 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 75a50c7f91b54e07857c2b21e2e843c9, type: 3}
m_Name: LevelTest
m_EditorClassIdentifier:
nodes:
- command: 0
moduleName: Memory
flickerTime: 3
lightOnTime: 5
- command: 0
moduleName: Eye
flickerTime: 3
lightOnTime: 5
- command: 0
moduleName: Logic
flickerTime: 3
lightOnTime: 5
- command: 0
moduleName: Speak
flickerTime: 3
lightOnTime: 5
moleExistTime: 2.5
flickerFreq: 5
batchDuration: {x: 1, y: 2}
totalBatchNum: 5
batchGap: 1.5
batches:
- moleNum: 2
durationRange: {x: 5, y: 8}
- moleNum: 3
durationRange: {x: 5, y: 8}
- moleNum: 2
durationRange: {x: 5, y: 8}
- moleNum: 2
durationRange: {x: 5, y: 8}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4d0ebc436e03019448bb94173f1ebc8e
guid: 8660e6d22f000af47bb8ea1370343982
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
@@ -3,7 +3,6 @@ using UnityEngine.Localization.Settings;
using Yarn.Unity;
using AibisDream.Framework;
using AibisDream.Utility;
using UnityEngine;
namespace AibisDream
{
@@ -1,24 +1,40 @@
using UnityEngine;
using System;
using AibisDream.Kit;
using DG.Tweening;
using TMPro;
using UnityEngine;
namespace AibisDream.FixSystem
{
public class MoleModule : BodyModule
{
private static WhackMoleSystem WhackMoleSystem => FixSystemCenter.SystemDic.Get<WhackMoleSystem>();
#region
private Material _picMaterial;
private TMP_Text _screenText;
private SpriteRenderer _processBar;
#endregion
public bool isInMoleGame;
public bool isLightOn;
private static readonly int SineGlowFade = Shader.PropertyToID("_SineGlowFade");
private static readonly int AddColorFade = Shader.PropertyToID("_AddColorFade");
private static readonly int AddColorColor = Shader.PropertyToID("_AddColorColor");
private float _countDownPct;
private Tween _countDownTween;
public event Action<MoleModule, bool> OnLightMoleEnd;
protected override void InitReference()
{
base.InitReference();
_picMaterial = transform.Find("Module Pic").GetComponent<SpriteRenderer>().material;
_screenText = transform.Find("Screen Text").GetComponent<TMP_Text>();
_processBar = transform.Find("Process Bar").GetComponent<SpriteRenderer>();
}
// 重写PlugIn和PlugOut就好了
public override void PlugIn()
{
@@ -26,13 +42,13 @@ namespace AibisDream.FixSystem
{
base.PlugIn();
}
else
else if (isLightOn)
{
// 触发WhackMoleSystem的插入事件
WhackMoleSystem.OnPlugIn(data.moduleName);
// 打中了
HitMole();
}
}
public override void PlugOut()
{
// TODO 拔出来会有效果吗?存疑
@@ -42,23 +58,78 @@ namespace AibisDream.FixSystem
public void StartFlicker()
{
_screenText.text = "Checking...";
_picMaterial.SetFloat(SineGlowFade, 1);
}
public void StopFlicker()
{
_picMaterial.SetFloat(SineGlowFade, 0);
}
public void LightOn(Color color)
public void LightOn(float lightTime)
{
_picMaterial.SetColor(AddColorColor, color);
// 视觉部分
StartFlicker();
_picMaterial.SetColor(AddColorColor, Color.red);
_picMaterial.SetFloat(AddColorFade, 1);
_processBar.color = Color.red;
_processBar.transform.localScale = Vector3.one;
// 逻辑部分
isLightOn = true;
_countDownPct = 100;
_countDownTween = DOTween.To(() => _countDownPct, value => _countDownPct = value, 0, lightTime)
.OnUpdate(CountingDown)
.OnComplete(OverTime);
}
public void LightOff()
private void CountingDown()
{
// TODO 显示倒计时
_screenText.text = $"{_countDownPct:F1}%";
_processBar.transform.localScale = new Vector3(_countDownPct / 100, 1, 1);
}
private void OverTime()
{
// TODO 超时
isLightOn = false;
LightOff();
OnLightMoleEnd?.Invoke(this, false);
OnLightMoleEnd = null;
_countDownTween = null;
}
private void LightOff()
{
_picMaterial.SetFloat(AddColorFade, 0);
_processBar.color = Color.clear;
// TODO 继续闪烁
StartFlicker();
}
private void HitMole()
{
_countDownTween.Kill();
isLightOn = false;
// 命中后成功反馈
ActionKit.Sequence()
.Callback(() =>
{
if (ColorUtility.TryParseHtmlString("#67C23A", out var color))
{
_picMaterial.SetColor(AddColorColor, color);
}
})
.Callback(() => _processBar.color = Color.green)
.Callback(() => _screenText.text = "Success")
.Delay(0.7f)
.Callback(LightOff)
.Start(this);
OnLightMoleEnd?.Invoke(this, true);
OnLightMoleEnd = null;
}
#endregion
@@ -6,23 +6,26 @@ namespace AibisDream.FixSystem
[CreateAssetMenu(fileName = "WhackMoldData", menuName = "Level Data/WhackMoldData")]
public class WhackMoleData : ScriptableObject
{
public WhackMoleNode[] nodes;
[Header("基本参数")]
public float moleExistTime = 1f;
public int flickerFreq = 10;
public Vector2 batchDuration = new(2, 3);
public int totalBatchNum = 5;
public float batchGap = 1f;
[Header("批次序列")]
public WhackMoleBatch[] batches;
public WhackMoleBatch GetBatch(int index)
{
return index >= batches.Length ? batches[^1] : batches[index];
}
}
[Serializable]
public struct WhackMoleNode
public struct WhackMoleBatch
{
public WhackMoleCommand command;
public string moduleName;
public float flickerTime;
public float lightOnTime;
}
public enum WhackMoleCommand
{
SingleModuleLightOn,
MultipleModuleLightOn,
SingleModuleColorOn,
MultipleModuleColorOn
public int moleNum;
public Vector2 durationRange;
}
}
@@ -1,269 +1,166 @@
using System;
using System.Collections;
using System.Collections.Generic;
using AibisDream.Framework;
using AibisDream.Kit;
using UnityEngine;
using UnityEngine.Events;
using Random = UnityEngine.Random;
namespace AibisDream.FixSystem
{
public class WhackMoleHandler
{
private readonly MonoBehaviour _mono;
private AbsWhackMoleNodeHandler _nodeHandler;
private static readonly WhackMoleSystem WhackMoleSystem = FixSystemCenter.SystemDic.Get<WhackMoleSystem>();
public event Action<bool> OnGameEnd;
private readonly WhackMoleData _data;
private WhackMoleHandler(MonoBehaviour mono)
#region
private int _batchIdx;
private readonly Dictionary<string, MoleModule> _moleModules;
private readonly List<WhackMoleBatchHandler> _batchHandlers;
private WhackMoleRes _res;
public event Action<WhackMoleRes> OnGameEnd;
#endregion
public WhackMoleHandler(WhackMoleData data)
{
_mono = mono;
_data = data;
_batchIdx = 0;
_moleModules = WhackMoleSystem.MoleModules;
// 生成batch序列并链接
_batchHandlers = CreateBatchHandler(data);
// 统计一些基本数据
CalcBaseData();
}
public void OnPlugIn(string moduleName)
private void CalcBaseData()
{
_nodeHandler.OnPlugIn(moduleName);
}
public void OnPlugOut(string moduleName)
{
_nodeHandler.OnPlugOut(moduleName);
}
public void StartGame()
{
Handle();
}
private void Handle()
{
_nodeHandler.onHandleEnd.AddListener(OnHandleEnd);
_mono.StartCoroutine(_nodeHandler.Handle());
}
private void OnHandleEnd(bool isSuccess)
{
if (isSuccess)
_res.totalMoleBatch = _data.totalBatchNum;
for (int i = 0; i < _data.totalBatchNum; i++)
{
// TODO 进入下一关
_nodeHandler.onHandleEnd.RemoveAllListeners();
if (_nodeHandler.nextHandler != null)
{
_nodeHandler = _nodeHandler.nextHandler;
Handle();
}
else
{
OnGameEnd?.Invoke(true);
OnGameEnd = null;
}
}
else
{
// TODO 进入失败结局
OnGameEnd?.Invoke(false);
OnGameEnd = null;
_res.totalMoleNum += _data.GetBatch(i).moleNum;
}
}
public static WhackMoleHandler Create(WhackMoleData data, MonoBehaviour mono)
public void Start()
{
var res = new WhackMoleHandler(mono);
AbsWhackMoleNodeHandler lastHandler = null;
foreach (var node in data.nodes)
foreach (var mole in _moleModules.Values)
{
var handler = res.CreateNodeHandler(node);
res._nodeHandler ??= handler;
if (lastHandler != null)
{
lastHandler.nextHandler = handler;
}
mole.isInMoleGame = true;
}
WhackMoleSystem.StartAllFlicker();
ActionKit.Coroutine(_batchHandlers[_batchIdx].StartBatch).StartGlobal();
}
lastHandler = handler;
private List<WhackMoleBatchHandler> CreateBatchHandler(WhackMoleData data)
{
List<WhackMoleBatchHandler> res = new();
for (int i = 0; i < data.totalBatchNum; i++)
{
var curHandler = new WhackMoleBatchHandler(_moleModules.Values, data, i);
curHandler.OnBatchEnd += OnBatchEnd;
res.Add(curHandler);
}
return res;
}
private AbsWhackMoleNodeHandler CreateNodeHandler(WhackMoleNode node)
private void OnBatchEnd(int hitMoleNum)
{
AbsWhackMoleNodeHandler handler = node.command switch
_batchIdx++;
_res.hitMoleNum += hitMoleNum;
_res.passBatchNum++;
if (_batchIdx >= _data.totalBatchNum)
{
WhackMoleCommand.SingleModuleLightOn => new SingleModuleLightOnHandler(),
WhackMoleCommand.MultipleModuleLightOn => new MultipleModuleLightOnHandler(),
WhackMoleCommand.SingleModuleColorOn => new SingleModuleColorOnHandler(),
WhackMoleCommand.MultipleModuleColorOn => new MultipleModuleColorOnHandler(),
_ => throw new ArgumentOutOfRangeException()
};
handler.Init(node);
return handler;
WhackMoleSystem.StopAllFlicker();
OnGameEnd?.Invoke(_res);
return;
}
// 继续下一个批次,如果有中间状态就在这里处理
ActionKit.Sequence().Delay(_data.batchGap).Coroutine(_batchHandlers[_batchIdx].StartBatch).StartGlobal();
}
}
public abstract class AbsWhackMoleNodeHandler
public class WhackMoleBatchHandler
{
protected static WhackMoleSystem WhackMoleSystem => FixSystemCenter.SystemDic.Get<WhackMoleSystem>();
private readonly WhackMoleData _globalData;
protected WhackMoleNode node;
public AbsWhackMoleNodeHandler nextHandler;
private readonly ISelector<MoleModule> _moleSelector;
private readonly List<float> _lightGaps = new();
private readonly List<MoleModule> _lightingMoles = new();
public readonly UnityEvent<bool> onHandleEnd = new();
private bool _isBatchEnd;
private int _hitMoleNum;
public void Init(WhackMoleNode nodeData)
public event Action<int> OnBatchEnd;
public WhackMoleBatchHandler(IEnumerable<MoleModule> molesModules, WhackMoleData data, int index)
{
node = nodeData;
}
public IEnumerator Handle()
{
EnumEventSystem.Global.Send(WhackMoleState.BeforePlug);
yield return BeforePlug();
EnumEventSystem.Global.Send(WhackMoleState.WaitPlug, node.lightOnTime);
yield return WaitPlug();
EnumEventSystem.Global.Send(WhackMoleState.AfterPlug);
yield return AfterPlug();
}
protected virtual IEnumerator BeforePlug()
{
WhackMoleSystem.StartAllFlicker();
yield return new WaitForSeconds(node.flickerTime);
WhackMoleSystem.StopAllFlicker();
}
protected abstract IEnumerator WaitPlug();
protected abstract IEnumerator AfterPlug();
public abstract void OnPlugIn(string moduleName);
public abstract void OnPlugOut(string moduleName);
}
public class SingleModuleLightOnHandler : AbsWhackMoleNodeHandler
{
private bool _isPlugIn;
protected override IEnumerator WaitPlug()
{
Debug.Log("进入等待");
// 先等待
yield return new WaitForSeconds(1f);
_isPlugIn = false;
WhackMoleSystem.LightOnModule(node.moduleName);
// 进入循环等待插入事件,规定时间内未插入则进入失败结局
var waitTime = 0f;
while (!_isPlugIn && waitTime < node.lightOnTime)
_globalData = data;
var batchData = data.GetBatch(index);
// 创建选择器
_moleSelector = new LimitedSelector<MoleModule>(molesModules);
// 设置亮起时间间隔
for (var i = 0; i < batchData.moleNum; i++)
{
waitTime += Time.deltaTime;
var gap = Random.Range(batchData.durationRange.x, batchData.durationRange.y);
_lightGaps.Add(gap);
}
_lightGaps.Sort();
}
public IEnumerator StartBatch()
{
// 利用协程记时
float batchTime = 0f;
while (!_isBatchEnd)
{
OnUpdate(batchTime);
batchTime += Time.deltaTime;
yield return null;
EnumEventSystem.Global.Send(WhackMoleState.WaitPlug, node.lightOnTime - waitTime);
}
OnBatchEnd?.Invoke(_hitMoleNum);
OnBatchEnd = null;
}
private void OnUpdate(float batchTime)
{
// 点亮一些模块,其他的继续闪烁
while (_lightGaps.Count > 0 && _lightGaps[0] <= batchTime)
{
var lightOnMole = _moleSelector.Select();
lightOnMole.LightOn(_globalData.moleExistTime);
lightOnMole.OnLightMoleEnd += OnLightMoleEnd;
// 最后同步其他容器
_lightGaps.RemoveAt(0);
_lightingMoles.Add(lightOnMole);
}
}
protected override IEnumerator AfterPlug()
private void OnLightMoleEnd(MoleModule mole, bool isPlugin)
{
Debug.Log("进入后处理");
WhackMoleSystem.LightOffModule(node.moduleName);
if (_isPlugIn)
// 从亮起列表中移除
_lightingMoles.Remove(mole);
if (isPlugin) _hitMoleNum++;
// 当所有模块都熄灭的时候,游戏结束
if (_lightingMoles.Count <= 0 && _lightGaps.Count <= 0)
{
// TODO 正常插入,触发效果并进入下一个关卡
yield return new WaitForSeconds(1);
onHandleEnd?.Invoke(true);
}
else
{
// TODO 超时,触发失败结局
onHandleEnd?.Invoke(false);
}
}
public override void OnPlugIn(string moduleName)
{
if (moduleName == node.moduleName)
{
_isPlugIn = true;
}
}
public override void OnPlugOut(string moduleName)
{
if (moduleName == node.moduleName)
{
_isPlugIn = false;
_isBatchEnd = true;
}
}
}
public class MultipleModuleLightOnHandler : AbsWhackMoleNodeHandler
public struct WhackMoleRes
{
protected override IEnumerator WaitPlug()
{
// 等待插入
yield return new WaitUntil(() => false);
}
protected override IEnumerator AfterPlug()
{
throw new NotImplementedException();
}
public override void OnPlugIn(string moduleName)
{
}
public override void OnPlugOut(string moduleName)
{
throw new NotImplementedException();
}
}
public class SingleModuleColorOnHandler : AbsWhackMoleNodeHandler
{
protected override IEnumerator WaitPlug()
{
throw new NotImplementedException();
}
protected override IEnumerator AfterPlug()
{
throw new NotImplementedException();
}
public override void OnPlugIn(string moduleName)
{
}
public override void OnPlugOut(string moduleName)
{
throw new NotImplementedException();
}
}
public class MultipleModuleColorOnHandler : AbsWhackMoleNodeHandler
{
protected override IEnumerator WaitPlug()
{
throw new NotImplementedException();
}
protected override IEnumerator AfterPlug()
{
throw new NotImplementedException();
}
public override void OnPlugIn(string moduleName)
{
}
public override void OnPlugOut(string moduleName)
{
throw new NotImplementedException();
}
}
public enum WhackMoleState
{
BeforePlug,
WaitPlug,
AfterPlug,
public int totalMoleBatch;
public int failBatchNum;
public int passBatchNum;
public int totalMoleNum;
public int hitMoleNum;
}
}
@@ -1,3 +1,3 @@
fileFormatVersion: 2
guid: d1b796d518a64802a34ce6ad301b3a00
timeCreated: 1752129433
guid: a845f09d13dd4cb0b5f111d8fa2e40a4
timeCreated: 1753442701
@@ -1,57 +0,0 @@
using System;
using AibisDream.Framework;
using TMPro;
using UnityEngine;
namespace AibisDream.FixSystem
{
public class WhackMoleLog : MonoBehaviour
{
private TMP_Text _countDownText;
private TMP_Text _stateText;
private TMP_Text _resText;
private void Awake()
{
_countDownText = transform.Find("倒计时").GetComponent<TMP_Text>();
_stateText = transform.Find("当前状态").GetComponent<TMP_Text>();
_resText = transform.Find("结果").GetComponent<TMP_Text>();
EnumEventSystem.Global.Register(WhackMoleState.BeforePlug, OnBeforePlug);
EnumEventSystem.Global.Register<WhackMoleState, float>(WhackMoleState.WaitPlug, OnWaitPlug);
EnumEventSystem.Global.Register(WhackMoleState.AfterPlug, OnAfterPlug);
}
public void Init()
{
_countDownText.text = "倒计时:等待";
_stateText.text = "当前状态:开始";
_resText.text = "结果:等待";
}
private void OnBeforePlug()
{
_stateText.text = "当前状态:前置效果";
_countDownText.text = "倒计时:0";
}
private void OnWaitPlug(float time)
{
_stateText.text = "当前状态:插线倒计时";
_countDownText.text = $"倒计时:{time:F}";
}
private void OnAfterPlug()
{
_stateText.text = "当前状态:后置效果";
_countDownText.text = "倒计时:0";
}
public void OnGameEnd(bool isSuccess)
{
_stateText.text = "当前状态:游戏结束";
_countDownText.text = "倒计时:0";
_resText.text = "结果:" + (isSuccess ? "成功" : "失败");
}
}
}
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 1c60dc35d51a4c349889aa59f70a6442
timeCreated: 1753262821
@@ -1,6 +1,4 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Generic;
using AibisDream.Framework;
using UnityEngine;
using Yarn.Unity;
@@ -11,8 +9,6 @@ namespace AibisDream.FixSystem
public class WhackMoleSystem : MonoBehaviour
{
private BodyModuleSystem _bodyModuleSystem;
private WhackMoleHandler _handler;
private WhackMoleLog _log;
private Dictionary<string, MoleModule> _moleModules;
@@ -20,51 +16,26 @@ namespace AibisDream.FixSystem
{
_bodyModuleSystem = GetComponent<BodyModuleSystem>();
FixSystemCenter.SystemDic.Register(this);
_log = GetComponentInChildren<WhackMoleLog>();
}
#region
public void StartWhack(WhackMoleData levelData)
{
_handler = WhackMoleHandler.Create(levelData, this);
_handler.OnGameEnd += OnWhackEnd;
// 获取当前所有模块
_moleModules =
_bodyModuleSystem.BodyModules.ToDictionary(item => item.data.moduleName, item => item as MoleModule);
_moleModules.Values.ToList().ForEach(item => item.isInMoleGame = true);
_log.Init();
_handler.StartGame();
WhackMoleHandler handler = new WhackMoleHandler(levelData);
handler.OnGameEnd += OnGameEnd;
handler.Start();
}
private void OnWhackEnd(bool isSuccess)
private void OnGameEnd(WhackMoleRes res)
{
_moleModules.Values.ToList().ForEach(item => item.isInMoleGame = false);
// TODO 触发游戏结束
_log.OnGameEnd(isSuccess);
DialogController.Instance.StartDialogNode(isSuccess ? "打地鼠游戏通过" : "打地鼠游戏失败");
Debug.Log($"结果:共计{res.totalMoleNum}个,成功击中{res.hitMoleNum}个");
}
public void OnPlugIn(string moduleName)
{
_handler?.OnPlugIn(moduleName);
}
public void OnPlugOut(string moduleName)
{
_handler?.OnPlugOut(moduleName);
}
#endregion
#region , BodyModuleSystem实现
public IEnumerator RandomFlicker()
{
yield break;
}
public void StartAllFlicker()
{
foreach (var module in _moleModules.Values)
@@ -80,38 +51,34 @@ namespace AibisDream.FixSystem
module.StopFlicker();
}
}
public void LightOnModule(string moduleName)
public Dictionary<string, MoleModule> MoleModules
{
if (_moleModules.TryGetValue(moduleName, out var moleModule))
get
{
moleModule.LightOn(Color.red);
}
else
{
Debug.LogError($"没有找到模块:{moduleName}");
}
}
if (_moleModules == null)
{
_moleModules = new Dictionary<string, MoleModule>();
foreach (var module in _bodyModuleSystem.BodyModules)
{
if (module is MoleModule moleModule)
{
_moleModules.Add(moleModule.data.moduleName, moleModule);
}
}
}
public void LightOffModule(string moduleName)
{
if (_moleModules.TryGetValue(moduleName, out var moleModule))
{
moleModule.LightOff();
}
else
{
Debug.LogError($"没有找到模块:{moduleName}");
return _moleModules;
}
}
#endregion
}
public static class WholeMoleCommand
{
private static WhackMoleSystem WhackMoleSystem => FixSystemCenter.SystemDic.Get<WhackMoleSystem>();
[YarnCommand("start_whack_game")]
public static void StartWhack(string levelName)
{
@@ -1,5 +1,4 @@
using System;
using AibisDream.FixSystem;
using UnityEngine;
namespace AibisDream.Framework
@@ -0,0 +1,69 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace AibisDream.Framework
{
public class MultipleSelector<T> : IMultipleSelector<T>
{
private readonly List<T> _items;
private int _batchSize;
public MultipleSelector(IEnumerable<T> items, int batchSize)
{
_items = new List<T>(items);
_batchSize = batchSize;
}
public T[] Select()
{
int[] indexArray = IMultipleSelector<T>.MultiRange(0, Count - 1, _batchSize);
return indexArray.Select(index => _items[index]).ToArray();
}
public void RemoveItem(T item)
{
_items.Remove(item);
}
public void AddItem(T item)
{
_items.Add(item);
}
public void SetBatchSize(int batchSize)
{
_batchSize = batchSize;
}
public int Count => _items.Count;
}
public interface IMultipleSelector<T>
{
T[] Select();
void RemoveItem(T item);
void AddItem(T item);
int Count { get; }
static int[] MultiRange(int start, int end, int batchSize)
{
// 确保要求的数量不超过范围
if (batchSize > end - start + 1)
{
Debug.LogError("要求的数量超过了范围内的数字总数");
return default;
}
var uniqueNumbers = new HashSet<int>();
while (uniqueNumbers.Count < batchSize)
{
var number = Random.Range(start, end + 1);
uniqueNumbers.Add(number);
}
return uniqueNumbers.ToArray();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6409fbaa417b4c55841a8ca0abe16593
timeCreated: 1753859058
@@ -4,16 +4,30 @@ using System.Linq;
namespace AibisDream.Framework
{
public class RandomSelector<T> : ISelector<T>
public class SingleSelector<T> : ISelector<T>
{
private readonly List<T> _items;
private readonly List<int> _prefixSums;
private readonly int _totalWeight;
private readonly Random _random;
#region
public void AddItem(T item)
{
throw new NotImplementedException();
}
public void RemoveItem(T item)
{
throw new NotImplementedException();
}
public int Count => _items.Count;
public RandomSelector(IEnumerable<T> items, Func<T, int> weightSelector)
#endregion
public SingleSelector(IEnumerable<T> items, Func<T, int> weightSelector)
{
if (items == null) throw new ArgumentNullException(nameof(items));
if (weightSelector == null) throw new ArgumentNullException(nameof(weightSelector));
@@ -21,7 +35,7 @@ namespace AibisDream.Framework
var itemList = items.ToList();
_items = new List<T>(itemList.Count);
_prefixSums = new List<int>(itemList.Count);
int sum = 0;
foreach (var item in itemList)
{
@@ -40,7 +54,7 @@ namespace AibisDream.Framework
_totalWeight = sum;
_random = new Random();
}
public T Select()
{
if (_totalWeight == 0)
@@ -79,21 +93,35 @@ namespace AibisDream.Framework
private readonly List<int> _batchWeight;
private readonly int _totalWeight;
private readonly Random _random;
private int _currentWeight;
private List<int> _curBatchWeight;
#region
public void AddItem(T item)
{
throw new NotImplementedException();
}
public void RemoveItem(T item)
{
throw new NotImplementedException();
}
#endregion
public int Count => _totalWeight;
public BatchSelector(IEnumerable<T> items, Func<T, int> weightSelector)
{
{
if (items == null) throw new ArgumentNullException(nameof(items));
if (weightSelector == null) throw new ArgumentNullException(nameof(weightSelector));
var itemList = items.ToList();
_items = new List<T>(itemList.Count);
_batchWeight = new List<int>(itemList.Count);
int sum = 0;
foreach (var item in itemList)
{
@@ -110,7 +138,7 @@ namespace AibisDream.Framework
}
_curBatchWeight = new List<int>(_batchWeight);
_totalWeight = sum;
_currentWeight = sum;
_random = new Random();
@@ -129,14 +157,14 @@ namespace AibisDream.Framework
{
ResetSelector();
}
int randomValue = _random.Next(0, _currentWeight);
int index = BinarySearch(randomValue);
// 选择后减去权重
_currentWeight -= 1;
_curBatchWeight[index] -= 1;
return _items[index];
}
@@ -162,6 +190,64 @@ namespace AibisDream.Framework
}
}
public class LimitedSelector<T> : ISelector<T>
{
private readonly List<T> _items;
private readonly Random _random;
public LimitedSelector(IEnumerable<T> items)
{
_items = items.ToList();
_random = new Random();
}
public T Select()
{
if (_items.Count == 0)
{
throw new InvalidOperationException("Selector is Empty");
}
var res = _items[_random.Next(0, _items.Count)];
_items.Remove(res);
return res;
}
public int Count => _items.Count;
}
public class UnRepeatSelector<T> : ISelector<T>
{
private readonly List<T> _items;
private readonly Random _random;
private T _lastCache;
public int Count => _items.Count;
public UnRepeatSelector(IEnumerable<T> items)
{
_items = items.ToList();
_random = new Random();
}
public T Select()
{
if (_items.Count == 0)
{
throw new InvalidOperationException("Selector is Empty");
}
T res;
do
{
res = _items[_random.Next(0, _items.Count)];
} while (Equals(res, _lastCache));
_lastCache = res;
return res;
}
}
public interface ISelector<out T>
{
T Select();
@@ -74,7 +74,7 @@ namespace AibisDream
protected virtual ISelector<MobileObjectData> CreateSelector(IEnumerable<MobileObjectData> datas)
{
return new RandomSelector<MobileObjectData>(datas, data => data.weight);
return new SingleSelector<MobileObjectData>(datas, data => data.weight);
}
private List<MobileObjectData> SetPublicVariable()