Merge branch 'develop' into feature/yingli1fic

This commit is contained in:
Ovid
2025-08-02 18:02:30 +08:00
26 changed files with 3123 additions and 2891 deletions
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -19,32 +19,22 @@ MonoBehaviour:
m_Key: line:0559767
m_Metadata:
m_Items:
- rid: 2067218750140055568
- m_Id: 25787459508899840
- rid: 2067218753147109378
- m_Id: 26134354672488448
m_Key: line:02365db
m_Metadata:
m_Items:
- rid: 2067218750140055559
- m_Id: 25787459513094144
- rid: 2067218753147109379
- m_Id: 26134354676682752
m_Key: line:0ee9c21
m_Metadata:
m_Items:
- rid: 2067218750140055560
- m_Id: 25787459513094145
- rid: 2067218753147109380
- m_Id: 26134354676682753
m_Key: line:003a5c5
m_Metadata:
m_Items:
- rid: 2067218750140055561
- m_Id: 25790418418405376
m_Key: line:b755d841
m_Metadata:
m_Items:
- rid: 2067218750140055569
- m_Id: 25790418418405377
m_Key: line:8d9eba9e
m_Metadata:
m_Items:
- rid: 2067218750140055570
- rid: 2067218753147109381
m_Metadata:
m_Items: []
m_KeyGenerator:
@@ -56,32 +46,22 @@ MonoBehaviour:
type: {class: DistributedUIDGenerator, ns: UnityEngine.Localization.Tables, asm: Unity.Localization}
data:
m_CustomEpoch: 1747199431587
- rid: 2067218750140055559
- rid: 2067218753147109378
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: Start
tags: []
- rid: 2067218750140055560
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: "\u6253\u5730\u9F20\u6E38\u620F\u901A\u8FC7"
tags: []
- rid: 2067218750140055561
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: "\u6253\u5730\u9F20\u6E38\u620F\u5931\u8D25"
tags: []
- rid: 2067218750140055568
- rid: 2067218753147109379
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: Start
tags: []
- rid: 2067218750140055569
- rid: 2067218753147109380
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: "\u6253\u5730\u9F20\u6E38\u620F\u901A\u8FC7"
tags: []
- rid: 2067218750140055570
- rid: 2067218753147109381
type: {class: LineMetadata, ns: Yarn.Unity.UnityLocalization, asm: YarnSpinner.Unity}
data:
nodeName: "\u6253\u5730\u9F20\u6E38\u620F\u5931\u8D25"
+3 -11
View File
@@ -22,23 +22,15 @@ MonoBehaviour:
m_Localized: "me: \u6253\u5730\u9F20\u6D4B\u8BD5"
m_Metadata:
m_Items: []
- m_Id: 25787459508899840
- m_Id: 26134354672488448
m_Localized: "me: \u6D4B\u8BD5[[size]]\u53D8\u5927[[/size]]\u6B63\u5E38"
m_Metadata:
m_Items: []
- m_Id: 25787459513094144
- m_Id: 26134354676682752
m_Localized: "me: \u6210\u529F"
m_Metadata:
m_Items: []
- m_Id: 25787459513094145
m_Localized: "me: \u5931\u8D25"
m_Metadata:
m_Items: []
- m_Id: 25790418418405376
m_Localized: "me: \u6210\u529F"
m_Metadata:
m_Items: []
- m_Id: 25790418418405377
- m_Id: 26134354676682753
m_Localized: "me: \u5931\u8D25"
m_Metadata:
m_Items: []
+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
+3 -2
View File
@@ -4,6 +4,7 @@ tags:
<<fade_out>>
<<switch_fix_system_to BodyModule "Head">>
<<DropCable>>
me: 测试[[size]]变大[[/size]]正常 #line:02365db
me: 打地鼠测试 #line:0559767
<<start_whack_game "LevelTest">>
===
@@ -11,11 +12,11 @@ me: 打地鼠测试 #line:0559767
title: 打地鼠游戏通过
tags:
---
me: 成功
me: 成功 #line:0ee9c21
===
title: 打地鼠游戏失败
tags:
---
me: 失败
me: 失败 #line:003a5c5
===
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,5 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using AibisDream.Framework;
using UnityEngine;
using Yarn.Unity;
@@ -10,8 +9,6 @@ namespace AibisDream.FixSystem
public class WhackMoleSystem : MonoBehaviour
{
private BodyModuleSystem _bodyModuleSystem;
private WhackMoleHandler _handler;
private WhackMoleLog _log;
private Dictionary<string, MoleModule> _moleModules;
@@ -19,41 +16,22 @@ 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实现
@@ -73,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()