diff --git a/Assets/000_assets/material/M_SquareFrame 1.mat b/Assets/000_assets/material/M_SquareFrame 1.mat
index 3d5cdd3f..37ec1c29 100644
--- a/Assets/000_assets/material/M_SquareFrame 1.mat
+++ b/Assets/000_assets/material/M_SquareFrame 1.mat
@@ -213,7 +213,7 @@ Material:
- _Dst: 10
- _DstBlend: 0
- _DstBlendAlpha: 0
- - _EdgeValue: 0.92061317
+ - _EdgeValue: 0.4454634
- _EnvironmentReflections: 1
- _FNLfanxiangkaiguan: 0
- _Face: 1
@@ -258,7 +258,7 @@ Material:
- _Mask_scale: 1
- _Metallic: 0
- _OcclusionStrength: 1
- - _Opacity: 0.07938683
+ - _Opacity: 0.5545366
- _Parallax: 0.005
- _Pass: 0
- _QueueOffset: 0
diff --git a/Assets/AddressableAssetsData/Android/addressables_content_state.bin b/Assets/AddressableAssetsData/Android/addressables_content_state.bin
index 625c3b8d..10c8306a 100644
Binary files a/Assets/AddressableAssetsData/Android/addressables_content_state.bin and b/Assets/AddressableAssetsData/Android/addressables_content_state.bin differ
diff --git a/Assets/AmplifyShaderEditor/Examples/Built-In Samples.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/Built-In Samples.unitypackage.meta
new file mode 100644
index 00000000..d97f4fc6
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/Built-In Samples.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e00e6f90ab8233e46a41c5e33917c642
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 10x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 10x.unitypackage.meta
new file mode 100644
index 00000000..d4db3873
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 10x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9da5530d5ebfab24c8ecad68795e720f
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 12x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 12x.unitypackage.meta
new file mode 100644
index 00000000..c3c98f27
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 12x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: aa102d640b98b5d4781710a3a3dd6983
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 14x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 14x.unitypackage.meta
new file mode 100644
index 00000000..ba827d29
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 14x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7a0bb33169d95ec499136d59cb25918b
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 15x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 15x.unitypackage.meta
new file mode 100644
index 00000000..3c5ca728
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 15x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 641c955d37d2fac4f87e00ac5c9d9bd8
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 16x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 16x.unitypackage.meta
new file mode 100644
index 00000000..249f4ab1
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 16x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2690f45490c175045bbdc63395bf6278
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.0.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.0.unitypackage.meta
new file mode 100644
index 00000000..3ee0254d
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.0.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fbd1fd9b3a70fad429d1eaaa5799c2a5
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.1.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.1.unitypackage.meta
new file mode 100644
index 00000000..4557a1b4
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.1.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3579d9cf4b75c564faa8fffc58a9f3f6
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.2.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.2.unitypackage.meta
new file mode 100644
index 00000000..677da0f0
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples 17.2.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0023a0858ba124646a55dfcb7231ed46
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples.unitypackage.meta
new file mode 100644
index 00000000..872a1e1a
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d1c0b77896049554fa4b635531caf741
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/Sample Resources.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/Sample Resources.unitypackage.meta
new file mode 100644
index 00000000..9d944382
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/Sample Resources.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c0a0a980c9ba86345bc15411db88d34f
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 10x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 10x.unitypackage.meta
new file mode 100644
index 00000000..819d3c7d
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 10x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2edbf4a9b9544774bbef617e92429664
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 12x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 12x.unitypackage.meta
new file mode 100644
index 00000000..9c0d665d
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 12x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 13ab599a7bda4e54fba3e92a13c9580a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 14x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 14x.unitypackage.meta
new file mode 100644
index 00000000..624d8621
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 14x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f6f268949ccf3f34fa4d18e92501ed82
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 15x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 15x.unitypackage.meta
new file mode 100644
index 00000000..7e2a8a41
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 15x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 69bc3229216b1504ea3e28b5820bbb0d
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 16x.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 16x.unitypackage.meta
new file mode 100644
index 00000000..9d2cb068
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 16x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4f665a06c5a2aa5499fa1c79ac058999
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 17.0.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 17.0.unitypackage.meta
new file mode 100644
index 00000000..aa70a0f5
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 17.0.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8a87ed432fe2d97498c0de5fae312e35
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 17.1.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 17.1.unitypackage.meta
new file mode 100644
index 00000000..013c35c6
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 17.1.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7c3bfbbeb9427b94099254e2e2768ad4
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples 17.2.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples 17.2.unitypackage.meta
new file mode 100644
index 00000000..42051740
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples 17.2.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c5303861611f41c438a30be552da5de4
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples.unitypackage.meta
new file mode 100644
index 00000000..da8ce241
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Examples/URP Samples.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a9d68dd8913f05d4d9ce75e7b40c6044
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 10x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 10x.unitypackage.meta
new file mode 100644
index 00000000..602bd09a
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 10x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2243c8b4e1ab6914995699133f67ab5a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 12x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 12x.unitypackage.meta
new file mode 100644
index 00000000..e51ee6d4
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 12x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9a5e61a8b3421b944863d0946e32da0a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 14x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 14x.unitypackage.meta
new file mode 100644
index 00000000..82a2ab0e
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 14x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 89f0b84148d149d4d96b838d7ef60e92
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 15x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 15x.unitypackage.meta
new file mode 100644
index 00000000..54836f2b
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 15x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 19939ee2cdb76e0489b1b8cd4bed7f3d
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 16x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 16x.unitypackage.meta
new file mode 100644
index 00000000..65b98bd3
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 16x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 70777e8ce9f3c8d4a8182ca2f965cdb2
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.0.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.0.unitypackage.meta
new file mode 100644
index 00000000..c32e9f8f
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.0.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ba281a1a00c8ac54c914e0763299f637
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.1.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.1.unitypackage.meta
new file mode 100644
index 00000000..0a18ad9c
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.1.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e6fc8948257acee42b666d0bfe1d782c
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.2.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.2.unitypackage.meta
new file mode 100644
index 00000000..314aa79b
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDRP 17.2.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4b5cb8698f2d9c14fadf8e2383441d37
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 10x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 10x.unitypackage.meta
new file mode 100644
index 00000000..34f23836
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 10x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b460b52e6c1feae45b70b7ddc2c45bd6
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 12x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 12x.unitypackage.meta
new file mode 100644
index 00000000..04c4f886
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 12x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 57fcea0ed8b5eb347923c4c21fa31b57
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 14x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 14x.unitypackage.meta
new file mode 100644
index 00000000..d5cd3087
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 14x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2e9da72e7e3196146bf7d27450013734
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 15x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 15x.unitypackage.meta
new file mode 100644
index 00000000..0b6cd6d0
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 15x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0904cdf24ddcd5042b024326476220d5
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 16x.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 16x.unitypackage.meta
new file mode 100644
index 00000000..2b33d7ab
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 16x.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 929783250050f8a448821b6ca1f2c578
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.0.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.0.unitypackage.meta
new file mode 100644
index 00000000..e0b5ad87
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.0.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fcc4d2eb0af82e546ae75506872cf092
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.1.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.1.unitypackage.meta
new file mode 100644
index 00000000..6338d388
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.1.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cd0a0171c5157b748afe763b89f71211
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.2.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.2.unitypackage.meta
new file mode 100644
index 00000000..47f972a0
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/URP 17.2.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f4990f6ace6142c4bbbf41cdd80b0bd3
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Built-in Pipeline.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Built-in Pipeline.unitypackage.meta
new file mode 100644
index 00000000..d4c3ffb4
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Built-in Pipeline.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1782b72cd0e99a54fac09382c482e3db
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 2022.3+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 2022.3+.unitypackage.meta
new file mode 100644
index 00000000..378f3f8d
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 2022.3+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 49d5bcbbd4cbd754b98cf3200197b0f1
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.0+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.0+.unitypackage.meta
new file mode 100644
index 00000000..2d5423a9
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.0+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: eefe45a405f061045be947217e30ed10
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.1+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.1+.unitypackage.meta
new file mode 100644
index 00000000..ccb4a903
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.1+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2e995dfe11e22d34d92432383d15c067
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.2+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.2+.unitypackage.meta
new file mode 100644
index 00000000..03ead5d2
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.2+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ec984c51d4ae2504184eeb292734c672
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.3+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.3+.unitypackage.meta
new file mode 100644
index 00000000..767ec46b
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/High Definition 6000.3+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e447b3d7d913d694ca35f74e30581840
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 2022.3+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 2022.3+.unitypackage.meta
new file mode 100644
index 00000000..3502d9ed
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 2022.3+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 6584a66582083a1459dcf5e4e87f6d62
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.0+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.0+.unitypackage.meta
new file mode 100644
index 00000000..615e9057
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.0+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0190b8bde50f12943926613d9a63c89a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.1+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.1+.unitypackage.meta
new file mode 100644
index 00000000..9835f913
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.1+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ae2ce8ad295486349839288636aed1ed
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.2+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.2+.unitypackage.meta
new file mode 100644
index 00000000..1002df1c
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.2+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d69745226619e3241a8e04ce86aee6a6
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.3+.unitypackage.meta b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.3+.unitypackage.meta
new file mode 100644
index 00000000..98204661
--- /dev/null
+++ b/Assets/External VFXs/BOXOPHOBIC/Atmospheric Height Fog/Core/Pipelines/Universal 6000.3+.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 37e6a9374416bc946a55779c58d0d984
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/FR2_Cache.asset b/Assets/FR2_Cache.asset
index 64d29bb6..dd456632 100644
--- a/Assets/FR2_Cache.asset
+++ b/Assets/FR2_Cache.asset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:472940ffbedddbf2a552dcb0ced09e9d387065de82da99292e785f4e0612b931
-size 8790986
+oid sha256:ac074a55a668cbd73b8aee7e3a71d869ea31e32879b34e54d7b7ff6783398995
+size 8836868
diff --git a/Assets/Le Tai's Asset/TranslucentImage/URP support.unitypackage.meta b/Assets/Le Tai's Asset/TranslucentImage/URP support.unitypackage.meta
new file mode 100644
index 00000000..9e552100
--- /dev/null
+++ b/Assets/Le Tai's Asset/TranslucentImage/URP support.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e45363610a59a4543a9793b3bf2be4aa
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Localization/Story/Chapter0_Lines Shared Data.asset b/Assets/Localization/Story/Chapter0_Lines Shared Data.asset
index 9d81ebf6..52faea22 100644
--- a/Assets/Localization/Story/Chapter0_Lines Shared Data.asset
+++ b/Assets/Localization/Story/Chapter0_Lines Shared Data.asset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:965e2068ef83fa994f9b4d26b0baf3d95c6cc8b040bb9827eb291d1c0d6481e4
-size 10132
+oid sha256:375d6452c1e1396b107cd1559ecd0f531d4bf9b0a3009d0b7c1584d9c5c48080
+size 20064
diff --git a/Assets/Localization/Story/Chapter0_Lines_en.asset b/Assets/Localization/Story/Chapter0_Lines_en.asset
index f10a9f75..0a210997 100644
--- a/Assets/Localization/Story/Chapter0_Lines_en.asset
+++ b/Assets/Localization/Story/Chapter0_Lines_en.asset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6c329b8e8bfa65c4fc4e2cec27e81588784fc73678a0cd20455c390860f19a18
-size 5998
+oid sha256:dd906c2a281779e8e45ec8be4599b16c8d00eba5642115f2e00baffb1b3e319a
+size 12414
diff --git a/Assets/Plugins/Easy Save 3/Editor/ES3Asmdefs.unitypackage.meta b/Assets/Plugins/Easy Save 3/Editor/ES3Asmdefs.unitypackage.meta
new file mode 100644
index 00000000..550f254c
--- /dev/null
+++ b/Assets/Plugins/Easy Save 3/Editor/ES3Asmdefs.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: de41a70ead12af544a4e99a925b269d2
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Sirenix/Demos/Custom Attribute Processors.unitypackage.meta b/Assets/Plugins/Sirenix/Demos/Custom Attribute Processors.unitypackage.meta
new file mode 100644
index 00000000..1eadf09a
--- /dev/null
+++ b/Assets/Plugins/Sirenix/Demos/Custom Attribute Processors.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f597f19f656ba56eae4f6a3a7cc528f4
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Sirenix/Demos/Custom Drawers.unitypackage.meta b/Assets/Plugins/Sirenix/Demos/Custom Drawers.unitypackage.meta
new file mode 100644
index 00000000..f073d2ab
--- /dev/null
+++ b/Assets/Plugins/Sirenix/Demos/Custom Drawers.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 48e08dc33330d11e9d4a1b246c52e4f6
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows.unitypackage.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows.unitypackage.meta
new file mode 100644
index 00000000..130722af
--- /dev/null
+++ b/Assets/Plugins/Sirenix/Demos/Editor Windows.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ed09910c0094cb27be8f3ca264680da3
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Sirenix/Demos/Sample - RPG Editor.unitypackage.meta b/Assets/Plugins/Sirenix/Demos/Sample - RPG Editor.unitypackage.meta
new file mode 100644
index 00000000..f9b8ed82
--- /dev/null
+++ b/Assets/Plugins/Sirenix/Demos/Sample - RPG Editor.unitypackage.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cc355dd4cf1e6173beaeb22c2858cbe1
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/Menu/ChapterSelection/ChapterSelection.prefab b/Assets/Prefabs/Menu/ChapterSelection/ChapterSelection.prefab
index 56a56e86..3654ee0e 100644
--- a/Assets/Prefabs/Menu/ChapterSelection/ChapterSelection.prefab
+++ b/Assets/Prefabs/Menu/ChapterSelection/ChapterSelection.prefab
@@ -17,7 +17,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
- m_IsActive: 1
+ m_IsActive: 0
--- !u!224 &4551339722402108901
RectTransform:
m_ObjectHideFlags: 0
@@ -376,20 +376,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -710,20 +713,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -920,20 +926,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -968,7 +977,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
- m_IsActive: 1
+ m_IsActive: 0
--- !u!224 &3053449365611135054
RectTransform:
m_ObjectHideFlags: 0
@@ -1129,20 +1138,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -1339,20 +1351,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -1473,20 +1488,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -1773,20 +1791,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -1947,20 +1968,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -2082,20 +2106,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -2333,20 +2360,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -2468,20 +2498,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -2603,20 +2636,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -3019,20 +3055,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -3327,20 +3366,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -4045,20 +4087,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -4145,6 +4190,7 @@ MonoBehaviour:
enterSongSelectionButton: {fileID: 5935354699868473682}
connectedChapter: {fileID: 0}
chapterName:
+ isLocked: 0
isExpanded: 0
isDuringAnimation: 0
bottomTip: {fileID: 3369054462927452463}
@@ -4477,20 +4523,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -4694,20 +4743,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -5137,20 +5189,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
+ m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
- m_enableWordWrapping: 1
+ m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
+ m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
+ m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
diff --git a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CompletedImportantTextBlock.prefab b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CompletedImportantTextBlock.prefab
index 9de632c3..df992eda 100644
--- a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CompletedImportantTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CompletedImportantTextBlock.prefab
@@ -101,7 +101,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
diff --git a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CurrentImportantTextBlock.prefab b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CurrentImportantTextBlock.prefab
index 41cceaf2..741e9535 100644
--- a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CurrentImportantTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/CurrentImportantTextBlock.prefab
@@ -101,7 +101,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
@@ -116,7 +116,7 @@ MonoBehaviour:
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
- m_TargetGraphic: {fileID: 1269722336407503250}
+ m_TargetGraphic: {fileID: 0}
m_OnClick:
m_PersistentCalls:
m_Calls: []
diff --git a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ForbiddenImportantTextBlock.prefab b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ForbiddenImportantTextBlock.prefab
index 1779aa85..57655c6e 100644
--- a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ForbiddenImportantTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ForbiddenImportantTextBlock.prefab
@@ -101,7 +101,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
diff --git a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ImportantTextBlockUI.prefab b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ImportantTextBlockUI.prefab
index 11db0e98..c5b5ba06 100644
--- a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ImportantTextBlockUI.prefab
+++ b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/ImportantTextBlockUI.prefab
@@ -11,6 +11,7 @@ GameObject:
- component: {fileID: 7895181244729415272}
- component: {fileID: 5622993008979475129}
- component: {fileID: 7873337981602853883}
+ - component: {fileID: 3155030838568361280}
m_Layer: 5
m_Name: Text (TMP) (1)
m_TagString: Untagged
@@ -138,6 +139,18 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!225 &3155030838568361280
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1266875872687906005}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 0
+ m_IgnoreParentGroups: 0
--- !u!1 &2549272938280010857
GameObject:
m_ObjectHideFlags: 0
@@ -182,126 +195,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2549272938280010857}
m_CullTransparentMesh: 1
---- !u!1 &2947357181438598616
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 808855937929311006}
- - component: {fileID: 3938143345111524688}
- - component: {fileID: 1269722336407503250}
- - component: {fileID: 3931523710101296998}
- m_Layer: 5
- m_Name: Image
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 0
---- !u!224 &808855937929311006
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 5350638854831129010}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 0, y: 0}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!222 &3938143345111524688
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_CullTransparentMesh: 1
---- !u!114 &1269722336407503250
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 21300000, guid: ba2e784cfa5cc0549bf66051f872367c, type: 3}
- m_Type: 0
- m_PreserveAspect: 0
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!114 &3931523710101296998
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Navigation:
- m_Mode: 3
- m_WrapAround: 0
- m_SelectOnUp: {fileID: 0}
- m_SelectOnDown: {fileID: 0}
- m_SelectOnLeft: {fileID: 0}
- m_SelectOnRight: {fileID: 0}
- m_Transition: 1
- m_Colors:
- m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
- m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
- m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
- m_ColorMultiplier: 1
- m_FadeDuration: 0.1
- m_SpriteState:
- m_HighlightedSprite: {fileID: 0}
- m_PressedSprite: {fileID: 0}
- m_SelectedSprite: {fileID: 0}
- m_DisabledSprite: {fileID: 0}
- m_AnimationTriggers:
- m_NormalTrigger: Normal
- m_HighlightedTrigger: Highlighted
- m_PressedTrigger: Pressed
- m_SelectedTrigger: Selected
- m_DisabledTrigger: Disabled
- m_Interactable: 1
- m_TargetGraphic: {fileID: 1269722336407503250}
- m_OnClick:
- m_PersistentCalls:
- m_Calls: []
--- !u!1 &5694744930588099522
GameObject:
m_ObjectHideFlags: 0
@@ -357,6 +250,7 @@ GameObject:
- component: {fileID: 9095470796084918386}
- component: {fileID: 606259940963463531}
- component: {fileID: 8391808794720387191}
+ - component: {fileID: 8456607026273325819}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
@@ -484,6 +378,18 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!225 &8456607026273325819
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7991069327751894070}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 0
+ m_IgnoreParentGroups: 0
--- !u!1 &8279096577214194803
GameObject:
m_ObjectHideFlags: 0
@@ -514,7 +420,6 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- - {fileID: 808855937929311006}
- {fileID: 9095470796084918386}
- {fileID: 7895181244729415272}
- {fileID: 5784757909052703056}
@@ -638,6 +543,6 @@ MonoBehaviour:
blockRect: {fileID: 5350638854831129010}
inPort: {fileID: 5784757909052703056}
outPort: {fileID: 4937946904652960982}
- button: {fileID: 3931523710101296998}
+ button: {fileID: 0}
storyIdText: {fileID: 8391808794720387191}
titleText: {fileID: 8391808794720387191}
diff --git a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/LockedImportantTextBlock.prefab b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/LockedImportantTextBlock.prefab
index f8b7d167..ce2540f1 100644
--- a/Assets/Prefabs/Story/Blocks/ImportantTextBlock/LockedImportantTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/ImportantTextBlock/LockedImportantTextBlock.prefab
@@ -101,7 +101,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
diff --git a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/CurrentSecondaryTextBlock.prefab b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/CurrentSecondaryTextBlock.prefab
index d0d7a415..d1ff249f 100644
--- a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/CurrentSecondaryTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/CurrentSecondaryTextBlock.prefab
@@ -101,7 +101,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
@@ -116,7 +116,7 @@ MonoBehaviour:
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
- m_TargetGraphic: {fileID: 1269722336407503250}
+ m_TargetGraphic: {fileID: 0}
m_OnClick:
m_PersistentCalls:
m_Calls: []
diff --git a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/FinishedSecondaryTextBlock.prefab b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/FinishedSecondaryTextBlock.prefab
index b0bd47ed..a0d6b631 100644
--- a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/FinishedSecondaryTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/FinishedSecondaryTextBlock.prefab
@@ -101,7 +101,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
diff --git a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/ForbiddenSecondaryTextBlock.prefab b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/ForbiddenSecondaryTextBlock.prefab
index bb75ea17..57098022 100644
--- a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/ForbiddenSecondaryTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/ForbiddenSecondaryTextBlock.prefab
@@ -221,7 +221,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
diff --git a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/LockedSecondaryTextBlock.prefab b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/LockedSecondaryTextBlock.prefab
index b547c3af..0f2122f1 100644
--- a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/LockedSecondaryTextBlock.prefab
+++ b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/LockedSecondaryTextBlock.prefab
@@ -101,7 +101,7 @@ MonoBehaviour:
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
diff --git a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/SecondaryTextBlockUI.prefab b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/SecondaryTextBlockUI.prefab
index 44602d7f..27c8e76c 100644
--- a/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/SecondaryTextBlockUI.prefab
+++ b/Assets/Prefabs/Story/Blocks/SecondaryTextBlock/SecondaryTextBlockUI.prefab
@@ -150,126 +150,6 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
---- !u!1 &2947357181438598616
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 808855937929311006}
- - component: {fileID: 464408401004507889}
- - component: {fileID: 5684991247721594449}
- - component: {fileID: 3931523710101296998}
- m_Layer: 5
- m_Name: Button
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &808855937929311006
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 5350638854831129010}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 0, y: 0}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!222 &464408401004507889
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_CullTransparentMesh: 1
---- !u!114 &5684991247721594449
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 0}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 0}
- m_Type: 0
- m_PreserveAspect: 0
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!114 &3931523710101296998
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2947357181438598616}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Navigation:
- m_Mode: 3
- m_WrapAround: 0
- m_SelectOnUp: {fileID: 0}
- m_SelectOnDown: {fileID: 0}
- m_SelectOnLeft: {fileID: 0}
- m_SelectOnRight: {fileID: 0}
- m_Transition: 1
- m_Colors:
- m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
- m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
- m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
- m_ColorMultiplier: 1
- m_FadeDuration: 0.1
- m_SpriteState:
- m_HighlightedSprite: {fileID: 0}
- m_PressedSprite: {fileID: 0}
- m_SelectedSprite: {fileID: 0}
- m_DisabledSprite: {fileID: 0}
- m_AnimationTriggers:
- m_NormalTrigger: Normal
- m_HighlightedTrigger: Highlighted
- m_PressedTrigger: Pressed
- m_SelectedTrigger: Selected
- m_DisabledTrigger: Disabled
- m_Interactable: 1
- m_TargetGraphic: {fileID: 5684991247721594449}
- m_OnClick:
- m_PersistentCalls:
- m_Calls: []
--- !u!1 &3472041800732464321
GameObject:
m_ObjectHideFlags: 0
@@ -281,6 +161,7 @@ GameObject:
- component: {fileID: 6776097071409445873}
- component: {fileID: 5860881451225714455}
- component: {fileID: 4081607830298877796}
+ - component: {fileID: 5567213864031973997}
m_Layer: 5
m_Name: TitleText
m_TagString: Untagged
@@ -408,6 +289,18 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!225 &5567213864031973997
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3472041800732464321}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 0
+ m_IgnoreParentGroups: 0
--- !u!1 &7991069327751894070
GameObject:
m_ObjectHideFlags: 0
@@ -419,6 +312,7 @@ GameObject:
- component: {fileID: 9095470796084918386}
- component: {fileID: 606259940963463531}
- component: {fileID: 8391808794720387191}
+ - component: {fileID: 7157907970610375421}
m_Layer: 5
m_Name: StoryIdText
m_TagString: Untagged
@@ -546,6 +440,18 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!225 &7157907970610375421
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7991069327751894070}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 0
+ m_IgnoreParentGroups: 0
--- !u!1 &8279096577214194803
GameObject:
m_ObjectHideFlags: 0
@@ -580,7 +486,6 @@ RectTransform:
- {fileID: 6776097071409445873}
- {fileID: 8088187650405042001}
- {fileID: 5120337310990590007}
- - {fileID: 808855937929311006}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
@@ -687,6 +592,6 @@ MonoBehaviour:
blockRect: {fileID: 5350638854831129010}
inPort: {fileID: 8088187650405042001}
outPort: {fileID: 5120337310990590007}
- button: {fileID: 3931523710101296998}
+ button: {fileID: 0}
storyIdText: {fileID: 8391808794720387191}
titleText: {fileID: 4081607830298877796}
diff --git a/Assets/Prefabs/Story/Blocks/SongBlockUI.prefab b/Assets/Prefabs/Story/Blocks/SongBlockUI.prefab
index 1b551e86..e34cf6c2 100644
--- a/Assets/Prefabs/Story/Blocks/SongBlockUI.prefab
+++ b/Assets/Prefabs/Story/Blocks/SongBlockUI.prefab
@@ -1,94 +1,5 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
---- !u!1 &629758055316317495
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 5620483555661743440}
- - component: {fileID: 808211794615970900}
- - component: {fileID: 1717850242396468755}
- m_Layer: 5
- m_Name: Button
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &5620483555661743440
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 629758055316317495}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 5350638854831129010}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 2.75, y: -1}
- m_SizeDelta: {x: -25.5, y: -22}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!222 &808211794615970900
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 629758055316317495}
- m_CullTransparentMesh: 1
---- !u!114 &1717850242396468755
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 629758055316317495}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Navigation:
- m_Mode: 3
- m_WrapAround: 0
- m_SelectOnUp: {fileID: 0}
- m_SelectOnDown: {fileID: 0}
- m_SelectOnLeft: {fileID: 0}
- m_SelectOnRight: {fileID: 0}
- m_Transition: 0
- m_Colors:
- m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
- m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
- m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
- m_ColorMultiplier: 1
- m_FadeDuration: 0.1
- m_SpriteState:
- m_HighlightedSprite: {fileID: 0}
- m_PressedSprite: {fileID: 0}
- m_SelectedSprite: {fileID: 0}
- m_DisabledSprite: {fileID: 0}
- m_AnimationTriggers:
- m_NormalTrigger: Normal
- m_HighlightedTrigger: Highlighted
- m_PressedTrigger: Pressed
- m_SelectedTrigger: Selected
- m_DisabledTrigger: Disabled
- m_Interactable: 1
- m_TargetGraphic: {fileID: 0}
- m_OnClick:
- m_PersistentCalls:
- m_Calls: []
--- !u!1 &847642077185086423
GameObject:
m_ObjectHideFlags: 0
@@ -257,6 +168,7 @@ GameObject:
- component: {fileID: 1824825661128247125}
- component: {fileID: 6839066121088903434}
- component: {fileID: 4619121194727073750}
+ - component: {fileID: 6000241608163664205}
m_Layer: 5
m_Name: Mask
m_TagString: Untagged
@@ -335,6 +247,50 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Mask
m_ShowMaskGraphic: 0
+--- !u!114 &6000241608163664205
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2685032725291833036}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 5963302735353550978}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
--- !u!1 &2947357181438598616
GameObject:
m_ObjectHideFlags: 0
@@ -1053,7 +1009,6 @@ RectTransform:
- {fileID: 530893922272850372}
- {fileID: 5732796955640118753}
- {fileID: 4908100188787544557}
- - {fileID: 5620483555661743440}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
@@ -1095,7 +1050,7 @@ MonoBehaviour:
blockRect: {fileID: 5350638854831129010}
inPort: {fileID: 5732796955640118753}
outPort: {fileID: 4908100188787544557}
- button: {fileID: 1717850242396468755}
+ button: {fileID: 6000241608163664205}
illustrationImage: {fileID: 5963302735353550978}
illustrationRect: {fileID: 4492029902276622460}
songNameText: {fileID: 8391808794720387191}
diff --git a/Assets/Prefabs/Story/Blocks/TutorialBlockUI.prefab b/Assets/Prefabs/Story/Blocks/TutorialBlockUI.prefab
index 6e48164a..ec4357b5 100644
--- a/Assets/Prefabs/Story/Blocks/TutorialBlockUI.prefab
+++ b/Assets/Prefabs/Story/Blocks/TutorialBlockUI.prefab
@@ -55,6 +55,7 @@ GameObject:
- component: {fileID: 808855937929311006}
- component: {fileID: 3938143345111524688}
- component: {fileID: 1269722336407503250}
+ - component: {fileID: 2589979841992238672}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
@@ -119,63 +120,18 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
---- !u!1 &2971854550119419744
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 6723909345398867291}
- - component: {fileID: 1883720140888459607}
- - component: {fileID: 1506827284251123157}
- m_Layer: 5
- m_Name: Button
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &6723909345398867291
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2971854550119419744}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 5350638854831129010}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 0.5, y: -7.5}
- m_SizeDelta: {x: -31, y: -29}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!222 &1883720140888459607
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2971854550119419744}
- m_CullTransparentMesh: 1
---- !u!114 &1506827284251123157
+--- !u!114 &2589979841992238672
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2971854550119419744}
+ m_GameObject: {fileID: 2947357181438598616}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
- m_EditorClassIdentifier:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -183,7 +139,7 @@ MonoBehaviour:
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
- m_Transition: 0
+ m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
@@ -204,7 +160,7 @@ MonoBehaviour:
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
- m_TargetGraphic: {fileID: 0}
+ m_TargetGraphic: {fileID: 1269722336407503250}
m_OnClick:
m_PersistentCalls:
m_Calls: []
@@ -263,6 +219,7 @@ GameObject:
- component: {fileID: 9095470796084918386}
- component: {fileID: 606259940963463531}
- component: {fileID: 8391808794720387191}
+ - component: {fileID: 2409804111795149599}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
@@ -390,6 +347,18 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!225 &2409804111795149599
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7991069327751894070}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 0
+ m_IgnoreParentGroups: 0
--- !u!1 &8279096577214194803
GameObject:
m_ObjectHideFlags: 0
@@ -424,7 +393,6 @@ RectTransform:
- {fileID: 9095470796084918386}
- {fileID: 5784757909052703056}
- {fileID: 4937946904652960982}
- - {fileID: 6723909345398867291}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
@@ -466,5 +434,5 @@ MonoBehaviour:
blockRect: {fileID: 5350638854831129010}
inPort: {fileID: 5784757909052703056}
outPort: {fileID: 4937946904652960982}
- button: {fileID: 1506827284251123157}
+ button: {fileID: 2589979841992238672}
tutorialNameText: {fileID: 8391808794720387191}
diff --git a/Assets/Prefabs/Story/Dialog/HistoryText.prefab b/Assets/Prefabs/Story/Dialog/HistoryText.prefab
new file mode 100644
index 00000000..7a596c3c
--- /dev/null
+++ b/Assets/Prefabs/Story/Dialog/HistoryText.prefab
@@ -0,0 +1,407 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &65537282130585173
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1643897006236830438}
+ - component: {fileID: 6202551277621388703}
+ - component: {fileID: 6295076540922261237}
+ m_Layer: 5
+ m_Name: Speaker
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1643897006236830438
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 65537282130585173}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5159032239856795640}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 0, y: 0.5}
+ m_AnchoredPosition: {x: 225, y: 0}
+ m_SizeDelta: {x: 250, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6202551277621388703
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 65537282130585173}
+ m_CullTransparentMesh: 1
+--- !u!114 &6295076540922261237
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 65537282130585173}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: "Speaker: \n"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
+ m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
+ type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 42
+ m_fontSizeBase: 42
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 1
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_characterHorizontalScale: 1
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &1609519350888832602
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4891349041236814278}
+ - component: {fileID: 4388088537228770510}
+ - component: {fileID: 5176135775194928437}
+ m_Layer: 5
+ m_Name: Content
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4891349041236814278
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1609519350888832602}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5159032239856795640}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 1, y: 0.5}
+ m_AnchoredPosition: {x: 175.00002, y: 0}
+ m_SizeDelta: {x: -349.99997, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4388088537228770510
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1609519350888832602}
+ m_CullTransparentMesh: 1
+--- !u!114 &5176135775194928437
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1609519350888832602}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: Content
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
+ m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
+ type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 42
+ m_fontSizeBase: 42
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 1
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_characterHorizontalScale: 1
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &3327801269455335983
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5159032239856795640}
+ - component: {fileID: 5965612576668694196}
+ m_Layer: 5
+ m_Name: HistoryText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5159032239856795640
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3327801269455335983}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1643897006236830438}
+ - {fileID: 4891349041236814278}
+ - {fileID: 572619156665643296}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 2560, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &5965612576668694196
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3327801269455335983}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: eaf151163c994d31bfabde12ede0fa98, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.UI.DialogueHistoryEntryView
+ speakerText: {fileID: 6295076540922261237}
+ contentText: {fileID: 5176135775194928437}
+ choiceIndicator: {fileID: 4440795975948891807}
+--- !u!1 &4440795975948891807
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 572619156665643296}
+ - component: {fileID: 7654607494418361635}
+ - component: {fileID: 4823002412552371432}
+ m_Layer: 5
+ m_Name: ChoiceIndicator
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &572619156665643296
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4440795975948891807}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5159032239856795640}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 0, y: 0.5}
+ m_AnchoredPosition: {x: 50, y: 0}
+ m_SizeDelta: {x: 25, y: 25}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7654607494418361635
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4440795975948891807}
+ m_CullTransparentMesh: 1
+--- !u!114 &4823002412552371432
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4440795975948891807}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
diff --git a/Assets/Prefabs/Story/Dialog/HistoryText.prefab.meta b/Assets/Prefabs/Story/Dialog/HistoryText.prefab.meta
new file mode 100644
index 00000000..444efdf3
--- /dev/null
+++ b/Assets/Prefabs/Story/Dialog/HistoryText.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 75e7242449b105748a3d9a0864ce1391
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/Story/HelperTalk.prefab b/Assets/Prefabs/Story/HelperTalk.prefab
new file mode 100644
index 00000000..217a9c6b
--- /dev/null
+++ b/Assets/Prefabs/Story/HelperTalk.prefab
@@ -0,0 +1,387 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1508090727333609782
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4686535100579303134}
+ - component: {fileID: 287764825431730093}
+ - component: {fileID: 604884221485964818}
+ - component: {fileID: -2678516924990041575}
+ - component: {fileID: 4403268097300063903}
+ m_Layer: 5
+ m_Name: HelperTalk
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4686535100579303134
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1508090727333609782}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 7502641187092686647}
+ - {fileID: 3218827982254574115}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 700, y: 270}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &287764825431730093
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1508090727333609782}
+ m_CullTransparentMesh: 1
+--- !u!114 &604884221485964818
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1508090727333609782}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 8746c977baa2dfb42a2e1acd589d3c5b, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 1
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!225 &-2678516924990041575
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1508090727333609782}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 1
+ m_IgnoreParentGroups: 0
+--- !u!114 &4403268097300063903
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1508090727333609782}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e8bca20cc0f14b97944b95bdcf47d506, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.StoryHelperTalk
+ speakerText: {fileID: 966082263634710134}
+ contentText: {fileID: 5450284912810547205}
+ showDuration: 0.18
+ visibleDuration: 4.5
+ hideDuration: 0.16
+ initialScaleMultiplier: 0.92
+--- !u!1 &3587908678025149924
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3218827982254574115}
+ - component: {fileID: 904411096527340721}
+ - component: {fileID: 5450284912810547205}
+ m_Layer: 5
+ m_Name: HelperText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3218827982254574115
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3587908678025149924}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4686535100579303134}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 17.5, y: -7.5}
+ m_SizeDelta: {x: -85, y: -165}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &904411096527340721
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3587908678025149924}
+ m_CullTransparentMesh: 1
+--- !u!114 &5450284912810547205
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3587908678025149924}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: "\u95F9\u9EBB\u4E86"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 73f9a9bb620a2b040ab7347b390452fe, type: 2}
+ m_sharedMaterial: {fileID: 1291443754377433884, guid: 73f9a9bb620a2b040ab7347b390452fe,
+ type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 32
+ m_fontSizeBase: 32
+ m_fontWeight: 400
+ m_enableAutoSizing: 1
+ m_fontSizeMin: 18
+ m_fontSizeMax: 32
+ m_fontStyle: 0
+ m_HorizontalAlignment: 1
+ m_VerticalAlignment: 256
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_characterHorizontalScale: 1
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7936195258843532652
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7502641187092686647}
+ - component: {fileID: 5167521932169979174}
+ - component: {fileID: 966082263634710134}
+ m_Layer: 5
+ m_Name: HelperName
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7502641187092686647
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7936195258843532652}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4686535100579303134}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 200, y: -55}
+ m_SizeDelta: {x: 300, y: 45}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5167521932169979174
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7936195258843532652}
+ m_CullTransparentMesh: 1
+--- !u!114 &966082263634710134
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7936195258843532652}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: "\u95F9\u9EBB\u4E86"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 73f9a9bb620a2b040ab7347b390452fe, type: 2}
+ m_sharedMaterial: {fileID: 1291443754377433884, guid: 73f9a9bb620a2b040ab7347b390452fe,
+ type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 37.2
+ m_fontSizeBase: 32
+ m_fontWeight: 400
+ m_enableAutoSizing: 1
+ m_fontSizeMin: 18
+ m_fontSizeMax: 42
+ m_fontStyle: 0
+ m_HorizontalAlignment: 1
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_characterHorizontalScale: 1
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 1
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Prefabs/Story/HelperTalk.prefab.meta b/Assets/Prefabs/Story/HelperTalk.prefab.meta
new file mode 100644
index 00000000..2c7232cf
--- /dev/null
+++ b/Assets/Prefabs/Story/HelperTalk.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 40df11d39d80e2f4785e492c3b1d1a10
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/Story/StoryTimelineMarker.prefab b/Assets/Prefabs/Story/StoryTimelineMarker.prefab
index 7cc0009a..1cb5fd66 100644
--- a/Assets/Prefabs/Story/StoryTimelineMarker.prefab
+++ b/Assets/Prefabs/Story/StoryTimelineMarker.prefab
@@ -10,6 +10,7 @@ GameObject:
m_Component:
- component: {fileID: 4290474858249249208}
- component: {fileID: 483471027588563956}
+ - component: {fileID: 6009244213662721001}
m_Layer: 5
m_Name: StoryTimelineMarker
m_TagString: Untagged
@@ -48,10 +49,55 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5fa49b969e984456985eec86f0275d7d, type: 3}
- m_Name:
+ m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.UI.StoryTimelineMarkerView
markerRect: {fileID: 4290474858249249208}
labelText: {fileID: 3350283590570236064}
+ button: {fileID: 6009244213662721001}
+--- !u!114 &6009244213662721001
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1574009245387883632}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name: ""
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 0
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 1, g: 1, b: 1, a: 1}
+ m_PressedColor: {r: 1, g: 1, b: 1, a: 1}
+ m_SelectedColor: {r: 1, g: 1, b: 1, a: 1}
+ m_DisabledColor: {r: 1, g: 1, b: 1, a: 0.5}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 940605879243566513}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
--- !u!1 &4209846266689669036
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes
index 0e797e6d..145d4d17 100644
Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/Beatmap.bytes differ
diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes
index b254fa90..0080eaa5 100644
Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/CommandScripts.bytes differ
diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes
index f021318f..da170462 100644
Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/ProjectInfo.bytes differ
diff --git a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes
index d3fb91de..0c833f01 100644
Binary files a/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes and b/Assets/Resources/Beatmaps/Chapter0/Space Rain/Special/SongInfo.bytes differ
diff --git a/Assets/Scenes/MenuScene.unity b/Assets/Scenes/MenuScene.unity
index 60997155..83a07ae3 100644
--- a/Assets/Scenes/MenuScene.unity
+++ b/Assets/Scenes/MenuScene.unity
@@ -859,6 +859,7 @@ GameObject:
- component: {fileID: 39339086}
- component: {fileID: 39339088}
- component: {fileID: 39339087}
+ - component: {fileID: 39339089}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
@@ -923,6 +924,19 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 39339085}
m_CullTransparentMesh: 1
+--- !u!114 &39339089
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 39339085}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: c31f8bd5e6ca44399645c4f7cb21e0ad, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.StaticStoryHelperVisualPresenter
+ portraitImage: {fileID: 39339087}
--- !u!1 &48744551
GameObject:
m_ObjectHideFlags: 0
@@ -2010,7 +2024,7 @@ MonoBehaviour:
columnStep: 720
rowStep: 525
marginLeft: 50
- helperReservedLeftSpace: 400
+ helperReservedLeftSpace: 1600
marginRight: 50
marginTop: 50
marginBottom: 50
@@ -3102,83 +3116,6 @@ CanvasGroup:
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
---- !u!1 &179146692
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 179146693}
- - component: {fileID: 179146695}
- - component: {fileID: 179146694}
- m_Layer: 5
- m_Name: HelperTalk
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &179146693
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 179146692}
- m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children:
- - {fileID: 822876208}
- - {fileID: 1047641975}
- m_Father: {fileID: 1119493264}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0.5, y: 0.5}
- m_AnchorMax: {x: 0.5, y: 0.5}
- m_AnchoredPosition: {x: 0, y: 149.99997}
- m_SizeDelta: {x: 700, y: 270}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &179146694
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 179146692}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 21300000, guid: 8746c977baa2dfb42a2e1acd589d3c5b, type: 3}
- m_Type: 0
- m_PreserveAspect: 1
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!222 &179146695
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 179146692}
- m_CullTransparentMesh: 1
--- !u!1 &190695849
GameObject:
m_ObjectHideFlags: 0
@@ -3597,81 +3534,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 212689266}
m_CullTransparentMesh: 1
---- !u!1 &213267826
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 213267827}
- - component: {fileID: 213267829}
- - component: {fileID: 213267828}
- m_Layer: 5
- m_Name: SampleImage
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 0
---- !u!224 &213267827
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 213267826}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 6347218673911890593}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 0, y: 0}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &213267828
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 213267826}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 21300000, guid: 6e71ed9739e49af48a43129d9e16dc6f, type: 3}
- m_Type: 0
- m_PreserveAspect: 0
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!222 &213267829
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 213267826}
- m_CullTransparentMesh: 1
--- !u!1 &217492843
GameObject:
m_ObjectHideFlags: 0
@@ -3892,7 +3754,7 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 265943988}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
@@ -3903,7 +3765,7 @@ RectTransform:
- {fileID: 600935697}
- {fileID: 314360845}
- {fileID: 761436471}
- m_Father: {fileID: 1365808733}
+ m_Father: {fileID: 708872017}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -4414,16 +4276,16 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 290007303}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 1365808733}
+ m_Father: {fileID: 708872017}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0.5, y: 0.5}
- m_AnchorMax: {x: 0.5, y: 0.5}
- m_AnchoredPosition: {x: 0, y: -650}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 70}
m_SizeDelta: {x: 1000, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &290007305
@@ -4712,7 +4574,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 200, y: 50}
+ m_AnchoredPosition: {x: 200, y: -150}
m_SizeDelta: {x: 328, y: 192}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &314360846
@@ -7413,6 +7275,9 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.Dialogue.StoryDialogueController
dialogueRunner: {fileID: 449802389}
storyUIPage: {fileID: 78737089}
+ yarnLinesTable:
+ m_TableReference:
+ m_TableCollectionName:
--- !u!114 &449802391
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -8273,7 +8138,7 @@ GameObject:
- component: {fileID: 490649580}
- component: {fileID: 490649579}
m_Layer: 5
- m_Name: SkipButton
+ m_Name: FastButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -8406,17 +8271,17 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 491543717}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 1365808733}
+ m_Father: {fileID: 708872017}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: -0.68322754}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &491543719
MonoBehaviour:
@@ -8808,7 +8673,6 @@ MonoBehaviour:
mainCanvasGroup: {fileID: 1296688837}
chapterContainer: {fileID: 3166036863631877736}
containerLayoutGroup: {fileID: 3166036863631877740}
- settingsButton: {fileID: 1937063705}
chapterSelectionUIPrefab: {fileID: 7049295459616353709, guid: f536078f3fe8e764aba92be12b81c2c4,
type: 3}
--- !u!1 &520601618
@@ -9355,144 +9219,6 @@ MonoBehaviour:
mGUI_ShowCallback: 0
mLocalizeTarget: {fileID: 1567730149}
mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
---- !u!1 &582350574
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 582350575}
- - component: {fileID: 582350577}
- - component: {fileID: 582350576}
- m_Layer: 5
- m_Name: Text (TMP)
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &582350575
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 582350574}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 1129805216}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0.5, y: 0.5}
- m_AnchorMax: {x: 0.5, y: 0.5}
- m_AnchoredPosition: {x: 0, y: -25}
- m_SizeDelta: {x: 200, y: 20}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &582350576
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 582350574}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_text: -Settings-
- m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: 19a92ec938f7b364dad1975875f9fe3a, type: 2}
- m_sharedMaterial: {fileID: -5812992765432063453, guid: 19a92ec938f7b364dad1975875f9fe3a,
- type: 2}
- m_fontSharedMaterials: []
- m_fontMaterial: {fileID: 0}
- m_fontMaterials: []
- m_fontColor32:
- serializedVersion: 2
- rgba: 4294967295
- m_fontColor: {r: 1, g: 1, b: 1, a: 1}
- m_enableVertexGradient: 0
- m_colorMode: 3
- m_fontColorGradient:
- topLeft: {r: 1, g: 1, b: 1, a: 1}
- topRight: {r: 1, g: 1, b: 1, a: 1}
- bottomLeft: {r: 1, g: 1, b: 1, a: 1}
- bottomRight: {r: 1, g: 1, b: 1, a: 1}
- m_fontColorGradientPreset: {fileID: 0}
- m_spriteAsset: {fileID: 0}
- m_tintAllSprites: 0
- m_StyleSheet: {fileID: 0}
- m_TextStyleHashCode: -1183493901
- m_overrideHtmlColors: 0
- m_faceColor:
- serializedVersion: 2
- rgba: 4294967295
- m_fontSize: 24
- m_fontSizeBase: 24
- m_fontWeight: 400
- m_enableAutoSizing: 0
- m_fontSizeMin: 18
- m_fontSizeMax: 72
- m_fontStyle: 0
- m_HorizontalAlignment: 2
- m_VerticalAlignment: 512
- m_textAlignment: 65535
- m_characterSpacing: 10
- m_characterHorizontalScale: 1
- m_wordSpacing: 0
- m_lineSpacing: 0
- m_lineSpacingMax: 0
- m_paragraphSpacing: 0
- m_charWidthMaxAdj: 0
- m_TextWrappingMode: 1
- m_wordWrappingRatios: 0.4
- m_overflowMode: 0
- m_linkedTextComponent: {fileID: 0}
- parentLinkedComponent: {fileID: 0}
- m_enableKerning: 1
- m_ActiveFontFeatures: 6e72656b
- m_enableExtraPadding: 0
- checkPaddingRequired: 0
- m_isRichText: 1
- m_EmojiFallbackSupport: 1
- m_parseCtrlCharacters: 1
- m_isOrthographic: 1
- m_isCullingEnabled: 0
- m_horizontalMapping: 0
- m_verticalMapping: 0
- m_uvLineOffset: 0
- m_geometrySortingOrder: 0
- m_IsTextObjectScaleStatic: 0
- m_VertexBufferAutoSizeReduction: 0
- m_useMaxVisibleDescender: 1
- m_pageToDisplay: 1
- m_margin: {x: 0, y: 0, z: 0, w: 0}
- m_isUsingLegacyAnimationComponent: 0
- m_isVolumetricText: 0
- m_hasFontAssetChanged: 0
- m_baseMaterial: {fileID: 0}
- m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
---- !u!222 &582350577
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 582350574}
- m_CullTransparentMesh: 1
--- !u!1 &600935696
GameObject:
m_ObjectHideFlags: 0
@@ -9528,7 +9254,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
- m_AnchoredPosition: {x: 200, y: -50}
+ m_AnchoredPosition: {x: 200, y: 150}
m_SizeDelta: {x: 328, y: 192}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &600935698
@@ -9611,12 +9337,13 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
- m_Children: []
+ m_Children:
+ - {fileID: 1657412686}
m_Father: {fileID: 1672615611}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
- m_AnchoredPosition: {x: 200, y: 0}
+ m_AnchoredPosition: {x: 600, y: 0}
m_SizeDelta: {x: 235, y: 1080}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &603195650
@@ -10204,81 +9931,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 5151cbfb4a7c39c4599fb711d3332cbd, type: 3}
m_Name:
m_EditorClassIdentifier:
---- !u!1 &621188556
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 621188557}
- - component: {fileID: 621188559}
- - component: {fileID: 621188558}
- m_Layer: 5
- m_Name: Image
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 0
---- !u!224 &621188557
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 621188556}
- m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 869340149}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0.5, y: 0.5}
- m_AnchorMax: {x: 0.5, y: 0.5}
- m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 2560, y: 1440}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &621188558
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 621188556}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 0.105882354}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 21300000, guid: a5742c5f03bacf94c8a95659f8f36466, type: 3}
- m_Type: 0
- m_PreserveAspect: 0
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!222 &621188559
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 621188556}
- m_CullTransparentMesh: 1
--- !u!1 &631888791
GameObject:
m_ObjectHideFlags: 0
@@ -10430,7 +10082,7 @@ MonoBehaviour:
m_text:
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
- m_sharedMaterial: {fileID: -5812992765432063453, guid: 19a92ec938f7b364dad1975875f9fe3a,
+ m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -10478,7 +10130,7 @@ MonoBehaviour:
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
- m_ActiveFontFeatures: 00000000
+ m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
@@ -10497,7 +10149,7 @@ MonoBehaviour:
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
- m_hasFontAssetChanged: 1
+ m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &642366237
@@ -11775,7 +11427,7 @@ MonoBehaviour:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
- m_ReferenceResolution: {x: 1920, y: 1080}
+ m_ReferenceResolution: {x: 2560, y: 1440}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
@@ -11818,8 +11470,13 @@ RectTransform:
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- - {fileID: 1364566253}
+ - {fileID: 1028956953}
+ - {fileID: 265943989}
+ - {fileID: 1424785511}
+ - {fileID: 290007304}
+ - {fileID: 1672615611}
- {fileID: 1365808733}
+ - {fileID: 491543718}
- {fileID: 1589396086}
m_Father: {fileID: 1998834542}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -12570,7 +12227,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: -200, y: 50}
+ m_AnchoredPosition: {x: -200, y: -150}
m_SizeDelta: {x: 328, y: 192}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &761436472
@@ -13869,144 +13526,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 820445455}
m_CullTransparentMesh: 1
---- !u!1 &822876207
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 822876208}
- - component: {fileID: 822876210}
- - component: {fileID: 822876209}
- m_Layer: 5
- m_Name: HelperName
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &822876208
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 822876207}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 179146693}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 1}
- m_AnchorMax: {x: 0, y: 1}
- m_AnchoredPosition: {x: 200, y: -55}
- m_SizeDelta: {x: 300, y: 45}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &822876209
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 822876207}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_text: "\u95F9\u9EBB\u4E86"
- m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: 73f9a9bb620a2b040ab7347b390452fe, type: 2}
- m_sharedMaterial: {fileID: 1291443754377433884, guid: 73f9a9bb620a2b040ab7347b390452fe,
- type: 2}
- m_fontSharedMaterials: []
- m_fontMaterial: {fileID: 0}
- m_fontMaterials: []
- m_fontColor32:
- serializedVersion: 2
- rgba: 4294967295
- m_fontColor: {r: 1, g: 1, b: 1, a: 1}
- m_enableVertexGradient: 0
- m_colorMode: 3
- m_fontColorGradient:
- topLeft: {r: 1, g: 1, b: 1, a: 1}
- topRight: {r: 1, g: 1, b: 1, a: 1}
- bottomLeft: {r: 1, g: 1, b: 1, a: 1}
- bottomRight: {r: 1, g: 1, b: 1, a: 1}
- m_fontColorGradientPreset: {fileID: 0}
- m_spriteAsset: {fileID: 0}
- m_tintAllSprites: 0
- m_StyleSheet: {fileID: 0}
- m_TextStyleHashCode: -1183493901
- m_overrideHtmlColors: 0
- m_faceColor:
- serializedVersion: 2
- rgba: 4294967295
- m_fontSize: 37.2
- m_fontSizeBase: 32
- m_fontWeight: 400
- m_enableAutoSizing: 1
- m_fontSizeMin: 18
- m_fontSizeMax: 42
- m_fontStyle: 0
- m_HorizontalAlignment: 1
- m_VerticalAlignment: 512
- m_textAlignment: 65535
- m_characterSpacing: 0
- m_characterHorizontalScale: 1
- m_wordSpacing: 0
- m_lineSpacing: 0
- m_lineSpacingMax: 0
- m_paragraphSpacing: 0
- m_charWidthMaxAdj: 0
- m_TextWrappingMode: 1
- m_wordWrappingRatios: 0.4
- m_overflowMode: 0
- m_linkedTextComponent: {fileID: 0}
- parentLinkedComponent: {fileID: 0}
- m_enableKerning: 1
- m_ActiveFontFeatures: 6e72656b
- m_enableExtraPadding: 0
- checkPaddingRequired: 0
- m_isRichText: 1
- m_EmojiFallbackSupport: 1
- m_parseCtrlCharacters: 1
- m_isOrthographic: 1
- m_isCullingEnabled: 0
- m_horizontalMapping: 0
- m_verticalMapping: 0
- m_uvLineOffset: 0
- m_geometrySortingOrder: 0
- m_IsTextObjectScaleStatic: 0
- m_VertexBufferAutoSizeReduction: 0
- m_useMaxVisibleDescender: 1
- m_pageToDisplay: 1
- m_margin: {x: 0, y: 0, z: 0, w: 0}
- m_isUsingLegacyAnimationComponent: 0
- m_isVolumetricText: 0
- m_hasFontAssetChanged: 0
- m_baseMaterial: {fileID: 0}
- m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
---- !u!222 &822876210
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 822876207}
- m_CullTransparentMesh: 1
--- !u!114 &834685805
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -14024,6 +13543,83 @@ MonoBehaviour:
mAlignment_LTR: 514
mAlignmentWasRTL: 0
mInitializeAlignment: 0
+--- !u!1 &845689279
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 845689280}
+ - component: {fileID: 845689282}
+ - component: {fileID: 845689281}
+ m_Layer: 5
+ m_Name: Content
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &845689280
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 845689279}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1549490742}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: -1439.9999}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &845689281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 845689279}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter
+ m_HorizontalFit: 0
+ m_VerticalFit: 2
+--- !u!114 &845689282
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 845689279}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup
+ m_Padding:
+ m_Left: 0
+ m_Right: 0
+ m_Top: 0
+ m_Bottom: 0
+ m_ChildAlignment: 1
+ m_Spacing: 0
+ m_ChildForceExpandWidth: 0
+ m_ChildForceExpandHeight: 0
+ m_ChildControlWidth: 0
+ m_ChildControlHeight: 0
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+ m_ReverseArrangement: 0
--- !u!1001 &846975560
PrefabInstance:
m_ObjectHideFlags: 0
@@ -14272,7 +13868,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
- m_IsActive: 1
+ m_IsActive: 0
--- !u!224 &859038602
RectTransform:
m_ObjectHideFlags: 0
@@ -14733,8 +14329,7 @@ RectTransform:
- {fileID: 909563967}
- {fileID: 1091682062}
- {fileID: 1457573152}
- - {fileID: 1129805216}
- - {fileID: 621188557}
+ - {fileID: 1635704381}
- {fileID: 1519945292}
- {fileID: 1371572583}
- {fileID: 1119493264}
@@ -15281,6 +14876,32 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 400, y: 306}
m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &909090005
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635704380}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9fad765e8a5d4c47a434e22e06254b7e, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::Ichni.Menu.SettingsButton
+ sourcePage: {fileID: 78737089}
+--- !u!114 &909090006
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1937063703}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9fad765e8a5d4c47a434e22e06254b7e, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::Ichni.Menu.SettingsButton
+ sourcePage: {fileID: 512486724}
--- !u!1 &909563966
GameObject:
m_ObjectHideFlags: 0
@@ -16260,17 +15881,17 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1028956952}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 1365808733}
+ m_Father: {fileID: 708872017}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 2560, y: 1439.9996}
+ m_SizeDelta: {x: 3424, y: 1926}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1028956954
MonoBehaviour:
@@ -16385,7 +16006,7 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1032070286}
m_CullTransparentMesh: 1
---- !u!1 &1047641974
+--- !u!1 &1033442781
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -16393,42 +16014,82 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- - component: {fileID: 1047641975}
- - component: {fileID: 1047641977}
- - component: {fileID: 1047641976}
+ - component: {fileID: 1033442782}
+ - component: {fileID: 1033442785}
+ - component: {fileID: 1033442784}
+ - component: {fileID: 1033442783}
m_Layer: 5
- m_Name: HelperText
+ m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
---- !u!224 &1047641975
+--- !u!224 &1033442782
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1047641974}
+ m_GameObject: {fileID: 1033442781}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 179146693}
+ m_Father: {fileID: 1635704381}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 17.5, y: -7.5}
- m_SizeDelta: {x: -85, y: -165}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -25}
+ m_SizeDelta: {x: 200, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &1047641976
+--- !u!114 &1033442783
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1047641974}
+ m_GameObject: {fileID: 1033442781}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 344445a89b4f74a0e9a0a766903df87e, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ mTerm: Menu UI/Settings
+ mTermSecondary:
+ PrimaryTermModifier: 0
+ SecondaryTermModifier: 0
+ TermPrefix:
+ TermSuffix:
+ LocalizeOnAwake: 1
+ IgnoreRTL: 0
+ MaxCharactersInRTL: 0
+ IgnoreNumbersInRTL: 1
+ CorrectAlignmentForRTL: 1
+ AddSpacesToJoinedLanguages: 0
+ AllowLocalizedParameters: 1
+ AllowParameters: 1
+ TranslatedObjects: []
+ LocalizeEvent:
+ m_PersistentCalls:
+ m_Calls: []
+ AlwaysForceLocalize: 0
+ LocalizeCallBack:
+ Target: {fileID: 0}
+ MethodName:
+ mGUI_ShowReferences: 0
+ mGUI_ShowTems: 1
+ mGUI_ShowCallback: 0
+ mLocalizeTarget: {fileID: 864604141}
+ mLocalizeTargetName: I2.Loc.LocalizeTarget_TextMeshPro_UGUI
+--- !u!114 &1033442784
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1033442781}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
@@ -16442,10 +16103,10 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
- m_text: "\u95F9\u9EBB\u4E86"
+ m_text:
m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: 73f9a9bb620a2b040ab7347b390452fe, type: 2}
- m_sharedMaterial: {fileID: 1291443754377433884, guid: 73f9a9bb620a2b040ab7347b390452fe,
+ m_fontAsset: {fileID: 11400000, guid: 87c1b020037c81841b3d98dd497cbdeb, type: 2}
+ m_sharedMaterial: {fileID: -5812992765432063453, guid: 87c1b020037c81841b3d98dd497cbdeb,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
@@ -16470,17 +16131,17 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
- m_fontSize: 32
- m_fontSizeBase: 32
+ m_fontSize: 24
+ m_fontSizeBase: 24
m_fontWeight: 400
- m_enableAutoSizing: 1
+ m_enableAutoSizing: 0
m_fontSizeMin: 18
- m_fontSizeMax: 32
+ m_fontSizeMax: 72
m_fontStyle: 0
- m_HorizontalAlignment: 1
- m_VerticalAlignment: 256
+ m_HorizontalAlignment: 2
+ m_VerticalAlignment: 512
m_textAlignment: 65535
- m_characterSpacing: 0
+ m_characterSpacing: 10
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
@@ -16515,13 +16176,13 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
---- !u!222 &1047641977
+--- !u!222 &1033442785
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1047641974}
+ m_GameObject: {fileID: 1033442781}
m_CullTransparentMesh: 1
--- !u!1 &1055026777
GameObject:
@@ -17685,8 +17346,10 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 1119493264}
+ - component: {fileID: 1119493266}
+ - component: {fileID: 1119493265}
m_Layer: 5
- m_Name: Avatar
+ m_Name: Helper
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -17706,7 +17369,7 @@ RectTransform:
m_Children:
- {fileID: 39339086}
- {fileID: 1294456583}
- - {fileID: 179146693}
+ - {fileID: 1999011946555502230}
m_Father: {fileID: 869340149}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -17714,6 +17377,75 @@ RectTransform:
m_AnchoredPosition: {x: 400, y: 250}
m_SizeDelta: {x: 800, y: 1200}
m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1119493265
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1119493263}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8e3e75d25eea4224a487c9de56d5a91c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.StoryHelperController
+ helperButton: {fileID: 1119493266}
+ visualPresenter: {fileID: 39339089}
+ helperTalkPrefab: {fileID: 4403268097300063903, guid: 40df11d39d80e2f4785e492c3b1d1a10,
+ type: 3}
+ helperTalkContainer: {fileID: 1999011946555502230}
+ idleRoot: {fileID: 39339086}
+ clickRoot: {fileID: 39339086}
+ idleFloatDistance: 8
+ idleHalfDuration: 1.35
+ clickPunchDuration: 0.2
+ clickPunchScale: 0.035
+ clickPunchOffset: 5
+ clickCooldown: 0.3
+--- !u!114 &1119493266
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1119493263}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 0
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 0}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
--- !u!1001 &1127235732
PrefabInstance:
m_ObjectHideFlags: 0
@@ -17855,127 +17587,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f7db12c4a04bb4249a4916541b6d0e5d, type: 3}
m_Name:
m_EditorClassIdentifier:
---- !u!1 &1129805215
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 1129805216}
- - component: {fileID: 1129805219}
- - component: {fileID: 1129805218}
- - component: {fileID: 1129805217}
- m_Layer: 5
- m_Name: Settings
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &1129805216
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1129805215}
- m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children:
- - {fileID: 582350575}
- m_Father: {fileID: 869340149}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0.5, y: 0}
- m_AnchorMax: {x: 0.5, y: 0}
- m_AnchoredPosition: {x: 0, y: 40}
- m_SizeDelta: {x: 310, y: 80}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &1129805217
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1129805215}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Navigation:
- m_Mode: 3
- m_WrapAround: 0
- m_SelectOnUp: {fileID: 0}
- m_SelectOnDown: {fileID: 0}
- m_SelectOnLeft: {fileID: 0}
- m_SelectOnRight: {fileID: 0}
- m_Transition: 2
- m_Colors:
- m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
- m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
- m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
- m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
- m_ColorMultiplier: 1
- m_FadeDuration: 0.1
- m_SpriteState:
- m_HighlightedSprite: {fileID: 0}
- m_PressedSprite: {fileID: 21300000, guid: a9b93dba6435cd54b963b1b5ef4e2c50, type: 3}
- m_SelectedSprite: {fileID: 0}
- m_DisabledSprite: {fileID: 0}
- m_AnimationTriggers:
- m_NormalTrigger: Normal
- m_HighlightedTrigger: Highlighted
- m_PressedTrigger: Pressed
- m_SelectedTrigger: Selected
- m_DisabledTrigger: Disabled
- m_Interactable: 1
- m_TargetGraphic: {fileID: 1129805218}
- m_OnClick:
- m_PersistentCalls:
- m_Calls: []
---- !u!114 &1129805218
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1129805215}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 21300000, guid: 97384a959c9b0e546bdfc9cc9931a7d9, type: 3}
- m_Type: 0
- m_PreserveAspect: 0
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!222 &1129805219
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1129805215}
- m_CullTransparentMesh: 1
--- !u!1 &1132246363
GameObject:
m_ObjectHideFlags: 0
@@ -18006,12 +17617,13 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: -1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
- m_Children: []
+ m_Children:
+ - {fileID: 1293033760}
m_Father: {fileID: 1672615611}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
- m_AnchoredPosition: {x: -200, y: 0}
+ m_AnchoredPosition: {x: -600, y: 0}
m_SizeDelta: {x: 235, y: 1080}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1132246365
@@ -19917,16 +19529,16 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1293033759}
- m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalRotation: {x: -0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: -1, y: 1, z: 1}
+ m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 1672615611}
+ m_Father: {fileID: 1132246364}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
- m_AnchoredPosition: {x: -135, y: 0}
+ m_AnchoredPosition: {x: -182.49998, y: 0}
m_SizeDelta: {x: 213, y: 1080}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1293033761
@@ -20163,9 +19775,9 @@ MonoBehaviour:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
- m_ReferenceResolution: {x: 1920, y: 1080}
+ m_ReferenceResolution: {x: 2560, y: 1440}
m_ScreenMatchMode: 0
- m_MatchWidthOrHeight: 1
+ m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
@@ -20202,9 +19814,9 @@ CanvasGroup:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1296688832}
m_Enabled: 1
- m_Alpha: 0
- m_Interactable: 0
- m_BlocksRaycasts: 0
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!114 &1299562985 stripped
MonoBehaviour:
@@ -20746,81 +20358,6 @@ MonoBehaviour:
mAlignment_LTR: 513
mAlignmentWasRTL: 0
mInitializeAlignment: 1
---- !u!1 &1364566252
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 1364566253}
- - component: {fileID: 1364566255}
- - component: {fileID: 1364566254}
- m_Layer: 5
- m_Name: Background
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &1364566253
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1364566252}
- m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 708872017}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
- m_AnchorMin: {x: 0, y: 0}
- m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 0, y: 0}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &1364566254
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1364566252}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 0, g: 0, b: 0, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 0}
- m_Type: 0
- m_PreserveAspect: 0
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!222 &1364566255
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1364566252}
- m_CullTransparentMesh: 1
--- !u!1 &1365808732
GameObject:
m_ObjectHideFlags: 0
@@ -20849,23 +20386,17 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- - {fileID: 1028956953}
- - {fileID: 265943989}
- {fileID: 932247137}
- {fileID: 673579561}
- - {fileID: 1424785511}
- {fileID: 217492844}
- {fileID: 61907791}
- - {fileID: 290007304}
- - {fileID: 1672615611}
- {fileID: 2009017381}
- - {fileID: 491543718}
m_Father: {fileID: 708872017}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
- m_SizeDelta: {x: 1920, y: 1080}
+ m_SizeDelta: {x: 2560, y: 1440}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &1371572582
GameObject:
@@ -21454,16 +20985,16 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1424785510}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 1365808733}
+ m_Father: {fileID: 708872017}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
- m_AnchoredPosition: {x: 0, y: 539.9999}
+ m_AnchoredPosition: {x: 0, y: 720.3416}
m_SizeDelta: {x: 2560, y: 1440}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1424785512
@@ -21832,6 +21363,76 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 33444f8904d91374fb31960969da96ed, type: 3}
m_Name:
m_EditorClassIdentifier:
+--- !u!1 &1440954338
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1440954339}
+ - component: {fileID: 1440954341}
+ - component: {fileID: 1440954340}
+ m_Layer: 5
+ m_Name: DialogHistoryPanel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1440954339
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1440954338}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1558066970}
+ - {fileID: 1549490742}
+ - {fileID: 2063684405}
+ m_Father: {fileID: 6347218673911890593}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1440954340
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1440954338}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b01a0f4f2bd84076a5fa1e6c43a21d47, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::Ichni.Story.UI.DialogueHistoryPage
+ canvasGroup: {fileID: 1440954341}
+ scrollRect: {fileID: 1549490743}
+ entryContainer: {fileID: 845689280}
+ entryPrefab: {fileID: 5965612576668694196, guid: 75e7242449b105748a3d9a0864ce1391,
+ type: 3}
+ closeButton: {fileID: 2063684406}
+--- !u!225 &1440954341
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1440954338}
+ m_Enabled: 1
+ m_Alpha: 0
+ m_Interactable: 0
+ m_BlocksRaycasts: 0
+ m_IgnoreParentGroups: 0
--- !u!1 &1442275325
GameObject:
m_ObjectHideFlags: 0
@@ -23268,7 +22869,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
- m_AnchoredPosition: {x: -200, y: -50}
+ m_AnchoredPosition: {x: -200, y: 150}
m_SizeDelta: {x: 328, y: 192}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1521593246
@@ -23518,6 +23119,73 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1534639413}
m_CullTransparentMesh: 1
+--- !u!1 &1549490741
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1549490742}
+ - component: {fileID: 1549490743}
+ m_Layer: 5
+ m_Name: Viewport
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1549490742
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549490741}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 845689280}
+ m_Father: {fileID: 1440954339}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1549490743
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549490741}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ScrollRect
+ m_Content: {fileID: 845689280}
+ m_Horizontal: 0
+ m_Vertical: 1
+ m_MovementType: 1
+ m_Elasticity: 0.1
+ m_Inertia: 1
+ m_DecelerationRate: 0.135
+ m_ScrollSensitivity: 1
+ m_Viewport: {fileID: 0}
+ m_HorizontalScrollbar: {fileID: 0}
+ m_VerticalScrollbar: {fileID: 0}
+ m_HorizontalScrollbarVisibility: 0
+ m_VerticalScrollbarVisibility: 0
+ m_HorizontalScrollbarSpacing: 0
+ m_VerticalScrollbarSpacing: 0
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls: []
--- !u!1 &1550903663
GameObject:
m_ObjectHideFlags: 0
@@ -23713,6 +23381,81 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1555496268}
m_CullTransparentMesh: 1
+--- !u!1 &1558066969
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1558066970}
+ - component: {fileID: 1558066972}
+ - component: {fileID: 1558066971}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1558066970
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1558066969}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1440954339}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1558066971
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1558066969}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.5019608}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1558066972
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1558066969}
+ m_CullTransparentMesh: 1
--- !u!114 &1567730149
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -24031,7 +23774,7 @@ CanvasGroup:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1589396085}
m_Enabled: 1
- m_Alpha: 0
+ m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
@@ -24189,7 +23932,7 @@ GameObject:
- component: {fileID: 1617002815}
- component: {fileID: 1617002814}
m_Layer: 5
- m_Name: ShowFramesButton
+ m_Name: ShowHistoryButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -24582,6 +24325,128 @@ SpriteRenderer:
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
+--- !u!1 &1635704380
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1635704381}
+ - component: {fileID: 1635704384}
+ - component: {fileID: 1635704383}
+ - component: {fileID: 1635704382}
+ - component: {fileID: 909090005}
+ m_Layer: 5
+ m_Name: Settings
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1635704381
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635704380}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1033442782}
+ m_Father: {fileID: 869340149}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 40}
+ m_SizeDelta: {x: 310, y: 80}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1635704382
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635704380}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 2
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 21300000, guid: a9b93dba6435cd54b963b1b5ef4e2c50, type: 3}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1635704383}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &1635704383
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635704380}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 97384a959c9b0e546bdfc9cc9931a7d9, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1635704384
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1635704380}
+ m_CullTransparentMesh: 1
--- !u!1 &1637111142
GameObject:
m_ObjectHideFlags: 0
@@ -24827,11 +24692,11 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 1672615611}
+ m_Father: {fileID: 603195649}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
- m_AnchoredPosition: {x: 135, y: 0}
+ m_AnchoredPosition: {x: 52.500008, y: 0}
m_SizeDelta: {x: 213, y: 1080}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1657412687
@@ -25096,16 +24961,14 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1672615610}
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 603195649}
- - {fileID: 1657412686}
- {fileID: 1132246364}
- - {fileID: 1293033760}
- m_Father: {fileID: 1365808733}
+ m_Father: {fileID: 708872017}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -27920,6 +27783,7 @@ GameObject:
- component: {fileID: 1937063707}
- component: {fileID: 1937063706}
- component: {fileID: 1937063705}
+ - component: {fileID: 909090006}
m_Layer: 5
m_Name: Settings
m_TagString: Untagged
@@ -28619,7 +28483,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
- m_IsActive: 0
+ m_IsActive: 1
--- !u!4 &1998834542
Transform:
m_ObjectHideFlags: 0
@@ -34139,6 +34003,126 @@ RectTransform:
m_AnchoredPosition: {x: 207.5, y: -160}
m_SizeDelta: {x: 415, y: 116}
m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &2063684404
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2063684405}
+ - component: {fileID: 2063684408}
+ - component: {fileID: 2063684407}
+ - component: {fileID: 2063684406}
+ m_Layer: 5
+ m_Name: BackButton (1)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2063684405
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2063684404}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1440954339}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 126, y: -112}
+ m_SizeDelta: {x: 116, y: 111}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2063684406
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2063684404}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 2063684407}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &2063684407
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2063684404}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 31ad2ac42b911b6418a7bbca874277e9, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &2063684408
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2063684404}
+ m_CullTransparentMesh: 1
--- !u!1 &2066043556
GameObject:
m_ObjectHideFlags: 0
@@ -34588,7 +34572,7 @@ MonoBehaviour:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
- m_ReferenceResolution: {x: 1920, y: 1080}
+ m_ReferenceResolution: {x: 2560, y: 1440}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
@@ -35890,6 +35874,18 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2146211968}
m_CullTransparentMesh: 1
+--- !u!225 &29272425175118417
+CanvasGroup:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5645772956766953854}
+ m_Enabled: 1
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 1
+ m_IgnoreParentGroups: 0
--- !u!1001 &1790733586872878389
PrefabInstance:
m_ObjectHideFlags: 0
@@ -36075,6 +36071,25 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 63ac87ec6c134804c9cd877b8820d283, type: 3}
m_Name:
m_EditorClassIdentifier:
+--- !u!224 &1999011946555502230
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5645772956766953854}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1119493264}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 149.99997}
+ m_SizeDelta: {x: 700, y: 270}
+ m_Pivot: {x: 0.5, y: 0.5}
--- !u!1001 &2004387430697357062
PrefabInstance:
m_ObjectHideFlags: 0
@@ -36512,6 +36527,24 @@ GameObject:
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
+--- !u!1 &5645772956766953854
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1999011946555502230}
+ - component: {fileID: 6434052342951954405}
+ - component: {fileID: 29272425175118417}
+ m_Layer: 5
+ m_Name: HelperTalkContainer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
--- !u!1 &5686664992784830960
GameObject:
m_ObjectHideFlags: 0
@@ -36586,7 +36619,7 @@ MonoBehaviour:
treeController: {fileID: 78737090}
storyUIPage: {fileID: 78737089}
characterRegistry: {fileID: 11400000, guid: cb28799b724eb714aa0cc820b36a8b5f, type: 2}
- helperData: {fileID: 0}
+ helperData: {fileID: 11400000, guid: 9be0d59b81017ab4b93df6ea9eace6fe, type: 2}
--- !u!4 &5788293620442285278
Transform:
m_ObjectHideFlags: 0
@@ -36640,6 +36673,9 @@ MonoBehaviour:
speakerText: {fileID: 1870072472}
advanceButton: {fileID: 776434468}
fastForwardButton: {fileID: 490649579}
+ backButton: {fileID: 1908680556}
+ showHistoryButton: {fileID: 1617002814}
+ dialogueHistoryPage: {fileID: 1440954340}
choiceFrame: {fileID: 234096306}
choiceButtons:
- {fileID: 190695854}
@@ -36710,7 +36746,7 @@ RectTransform:
- {fileID: 1908680555}
- {fileID: 490649578}
- {fileID: 1617002813}
- - {fileID: 213267827}
+ - {fileID: 1440954339}
m_Father: {fileID: 5788293620442285278}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -36718,6 +36754,14 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
+--- !u!222 &6434052342951954405
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5645772956766953854}
+ m_CullTransparentMesh: 1
--- !u!225 &6759614698927231795
CanvasGroup:
m_ObjectHideFlags: 0
@@ -36726,9 +36770,9 @@ CanvasGroup:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918997816214783523}
m_Enabled: 1
- m_Alpha: 0
- m_Interactable: 0
- m_BlocksRaycasts: 0
+ m_Alpha: 1
+ m_Interactable: 1
+ m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!1001 &6776602870058590884
PrefabInstance:
diff --git a/Assets/Scripts/Menu/InformationTransistor.cs b/Assets/Scripts/Menu/InformationTransistor.cs
index 47b08915..35bd3f96 100644
--- a/Assets/Scripts/Menu/InformationTransistor.cs
+++ b/Assets/Scripts/Menu/InformationTransistor.cs
@@ -2,6 +2,7 @@ using System.Collections;
using System.Collections.Generic;
using AK.Wwise;
using Ichni.Menu;
+using Ichni.Story;
using UnityEngine;
using UnityEngine.Serialization;
@@ -28,6 +29,12 @@ namespace Ichni
///
public MenuReturnDestination menuReturnDestination;
+ ///
+ /// 由剧情 SongBlock 发起的单次选曲上下文。它是运行时路由数据,不属于玩家存档;
+ /// 仅用于校验目标歌曲、决定返回页面并还原剧情树浏览位置。
+ ///
+ [System.NonSerialized] public StorySongEntryContext storySongEntryContext = new StorySongEntryContext();
+
public ChapterSelectionUnit chapter;
public SongItemData song;
public DifficultyData difficulty;
@@ -57,7 +64,12 @@ namespace Ichni
{
// 保留旧入口,供现有选曲流程在播放过场前预先写入歌曲信息。
// 真正进入 GameScene 时,MenuManager.EnterGame 会补充 SongSelection 返回目标。
- PrepareGameLaunch(chapter, song, difficulty, MenuReturnDestination.None);
+ if (PrepareGameLaunch(chapter, song, difficulty, MenuReturnDestination.None))
+ {
+ // 只有玩家真正确认“进入游戏”且命中剧情目标歌曲时,才完成对应 SongBlock。
+ // 单纯从剧情打开选曲、浏览其它歌曲或返回菜单都不会写入剧情进度。
+ StoryManager.instance?.HandleSongSelectionConfirmed(chapter, song);
+ }
}
///
@@ -79,6 +91,10 @@ namespace Ichni
chapterSwitch = chapter.chapterSwitch;
songSwitch = song.songSwitch;
menuReturnDestination = returnDestination;
+
+ // “确认进入游戏”是歌曲尝试的统一边界。无论入口来自普通选曲、Story SongBlock 或教程,
+ // 都由 SongSaves 记录这一次尝试;StoryTree 会在构建/返回时据此同步 SongBlock 完成状态。
+ GameSaveManager.instance?.SongSaveModule?.MarkSongTried(song.songName);
return true;
}
diff --git a/Assets/Scripts/Menu/MenuManager.cs b/Assets/Scripts/Menu/MenuManager.cs
index 3ab17271..bcf7f6db 100644
--- a/Assets/Scripts/Menu/MenuManager.cs
+++ b/Assets/Scripts/Menu/MenuManager.cs
@@ -81,6 +81,7 @@ namespace Ichni
// 不能依赖旧场景中残留的 Block 实例。
StoryManager.instance?.OpenChapter(ChapterSelectionManager.instance.currentChapter.chapterIndex);
storyUIPage.FadeIn();
+ StoryManager.instance?.RestoreStoryAfterGameReturn();
}
// 返回目标是一次性运行态信息。无论是否能恢复页面,都不能让它在下次重进菜单时重复生效。
@@ -96,7 +97,14 @@ namespace Ichni
{
public void EnterGame()
{
- EnterGame(MenuReturnDestination.SongSelection);
+ // 剧情 SongBlock 仅在玩家确认进入指定目标歌曲后才要求返回剧情;
+ // 普通选曲与从剧情入口改选其它歌曲都继续返回选曲页。
+ StorySongEntryContext context = InformationTransistor.instance?.storySongEntryContext;
+ MenuReturnDestination destination = context != null && context.isActive &&
+ context.returnToStoryAfterGame
+ ? MenuReturnDestination.Story
+ : MenuReturnDestination.SongSelection;
+ EnterGame(destination);
}
///
diff --git a/Assets/Scripts/NewStorySystem/Data/CharacterData.cs b/Assets/Scripts/NewStorySystem/Data/CharacterData.cs
index aa8e81fd..de4d89e5 100644
--- a/Assets/Scripts/NewStorySystem/Data/CharacterData.cs
+++ b/Assets/Scripts/NewStorySystem/Data/CharacterData.cs
@@ -40,14 +40,14 @@ namespace Ichni.Story
[LabelText("Emotion Sprites")]
[ShowIf("portraitStyle", PortraitStyle.Sprite)]
[DictionaryDrawerSettings(KeyLabel = "Emotion Name", ValueLabel = "Sprite")]
- [InfoBox("Key 为情绪名(如 normal / happy / angry),Value 为对应 Sprite 资产。")]
+ [Tooltip("Key 为情绪名(如 normal / happy / angry),Value 为对应 Sprite 资产。")]
public Dictionary emotionSprites = new Dictionary();
// ── Dynamic (Live2D / Spine) ─────────────────────────────────────────────
[LabelText("Dynamic Portrait Prefab")]
[ShowIf("IsDynamicPortrait")]
- [InfoBox("Live2D / Spine 立绘预制体,需挂载实现 IPortraitRenderer 接口的组件(阶段 3 制作)。")]
+ [Tooltip("Live2D / Spine 立绘预制体,需挂载实现 IPortraitRenderer 接口的组件。")]
public GameObject dynamicPortraitPrefab;
private bool IsDynamicPortrait => portraitStyle == PortraitStyle.Live2D || portraitStyle == PortraitStyle.Spine;
diff --git a/Assets/Scripts/NewStorySystem/Data/CharacterRegistry.cs b/Assets/Scripts/NewStorySystem/Data/CharacterRegistry.cs
index 68c3731c..4e00ff23 100644
--- a/Assets/Scripts/NewStorySystem/Data/CharacterRegistry.cs
+++ b/Assets/Scripts/NewStorySystem/Data/CharacterRegistry.cs
@@ -14,7 +14,7 @@ namespace Ichni.Story
{
[LabelText("Characters")]
[ListDrawerSettings(ShowFoldout = true, DraggableItems = true)]
- [InfoBox("将所有角色的 CharacterData 资产拖入此列表,系统运行时会自动按 characterId 建立索引。")]
+ [Tooltip("将所有角色的 CharacterData 资产拖入此列表,系统运行时会自动按 characterId 建立索引。")]
public List characters = new List();
// 运行时缓存,首次 TryGet 时延迟构建
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryBlockDefinition.cs b/Assets/Scripts/NewStorySystem/Data/StoryBlockDefinition.cs
index d4a620e1..561c1af6 100644
--- a/Assets/Scripts/NewStorySystem/Data/StoryBlockDefinition.cs
+++ b/Assets/Scripts/NewStorySystem/Data/StoryBlockDefinition.cs
@@ -26,6 +26,25 @@ namespace Ichni.Story
Tutorial
}
+ ///
+ /// 一个 Block 如何自动处理指向它的直接连接线。
+ /// 连接线表达基础流程关系,因此默认要求所有直接前置 Block 都已完成;该结果会与
+ /// 按 AND 合并。
+ /// 路线汇合时应使用 ;仅用于视觉连线、
+ /// 不应影响可用性的连接则使用 。
+ ///
+ public enum ConnectedBlockUnlockRule
+ {
+ /// 默认值:全部直接前置 Block 都必须完成。
+ RequireAllDirectPredecessors = 0,
+
+ /// 至少一个直接前置 Block 完成即可,适用于互斥分支的汇合节点。
+ RequireAnyDirectPredecessor = 1,
+
+ /// 忽略连接线,只按手写 Unlock Condition 判断。
+ IgnoreConnections = 2
+ }
+
///
/// TextBlock 的叙事层级。层级只决定剧情树中的视觉样式和 checkpoint 候选资格,
/// 不会自行改变 Block 的解锁条件或 Yarn 执行逻辑。
@@ -53,34 +72,59 @@ namespace Ichni.Story
/// 故事树中单个 block 的完整数据定义,由 持有。
///
[InlineProperty]
+ [HideReferenceObjectPicker]
[Serializable]
public class StoryBlockDefinition
{
- [FoldoutGroup("$blockId", false)]
- [LabelText("Block ID")]
+ // 仅用于 Odin Inspector 的动态折叠标题,不参与序列化或运行时状态推导。
+ // 在列表中即可识别 Block 的身份、类型与布局位置,减少频繁展开确认的需要。
+ private string EditorHeader => string.IsNullOrWhiteSpace(blockId)
+ ? "New Block"
+ : $"{blockId} · {blockType} · C{gridColumn:0.##} / R{gridRow:0.##}";
+
+ [FoldoutGroup("$EditorHeader", false)]
+ [HorizontalGroup("$EditorHeader/Identity", 0.58f)]
+ [LabelText("ID")]
+ [Tooltip("Block 的稳定唯一 ID。连接、条件、Timeline Marker 与存档均依赖该值;建议使用英文、数字和下划线。")]
public string blockId;
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader")]
+ [HorizontalGroup("$EditorHeader/Identity")]
[LabelText("Type")]
+ [Tooltip("决定该 Block 的运行时入口与下方显示的专属配置。")]
public StoryBlockType blockType;
- [FoldoutGroup("$blockId")]
- [LabelText("Grid Column")]
+ [FoldoutGroup("$EditorHeader")]
+ [HorizontalGroup("$EditorHeader/Layout")]
+ [LabelText("Column")]
[Tooltip("故事树网格中的列:向右为正,(0,0) 位于容器左侧中部。可为负数与小数(用于微调)。")]
public float gridColumn;
- [FoldoutGroup("$blockId")]
- [LabelText("Grid Row")]
+ [FoldoutGroup("$EditorHeader")]
+ [HorizontalGroup("$EditorHeader/Layout")]
+ [LabelText("Row")]
[Tooltip("故事树网格中的行:向下为正、向上为负,0 对应垂直中线。可为小数(用于微调)。")]
public float gridRow;
- [FoldoutGroup("$blockId")]
- [LabelText("Next Block IDs")]
+ [FoldoutGroup("$EditorHeader/Flow", false)]
+ [LabelText("Next Blocks")]
+ [Tooltip("从本 Block 指向的后续 Block ID。该列表既决定连接线,也会成为后续 Block 的自动前置条件来源。")]
+ [ListDrawerSettings(ShowFoldout = true, DefaultExpandedState = false, ShowItemCount = true)]
public List nextBlockIds = new List();
- [FoldoutGroup("$blockId")]
- [LabelText("Unlock Condition")]
- [InfoBox("留空表示无条件解锁(章节起始即可用)。")]
+ ///
+ /// 自动把所有指向本 Block 的直接连接线转化为基础解锁条件。
+ /// 没有前置连接线的章节起始 Block 不受此字段限制;默认“全部前置完成”再与手写条件按 AND 合并。
+ ///
+ [FoldoutGroup("$EditorHeader/Flow")]
+ [LabelText("Connected Rule")]
+ [Tooltip("默认 Require All:所有直接前置 Block 完成后才可用。互斥路线汇合使用 Require Any;纯视觉连接使用 Ignore。")]
+ public ConnectedBlockUnlockRule connectedBlockUnlockRule =
+ ConnectedBlockUnlockRule.RequireAllDirectPredecessors;
+
+ [FoldoutGroup("$EditorHeader/Rules", false)]
+ [LabelText("Unlock")]
+ [Tooltip("可选的额外可用条件;它与 Connected Rule 按 AND 合并。没有前置连接的起始 Block 通常留空即可。")]
public StoryCondition unlockCondition = new StoryCondition();
///
@@ -88,38 +132,41 @@ namespace Ichni.Story
/// 因而可直接使用剧情变量、Block 完成状态及 AND / OR / NOT 组合。
/// 条件满足时,该 Block 的状态固定为 Forbidden,且优先于 Completed / Current / Locked。
///
- [FoldoutGroup("$blockId")]
- [LabelText("Forbidden Condition")]
- [InfoBox("可选。留空表示此 Block 不会被条件禁用;满足时显示为 Forbidden 且不可点击。")]
+ [FoldoutGroup("$EditorHeader/Rules")]
+ [LabelText("Forbidden")]
+ [Tooltip("可选。满足时该 Block 固定显示为 Forbidden 且不可点击;留空表示不会被条件禁用。")]
public StoryCondition forbiddenCondition = new StoryCondition();
// ── Text Block ──────────────────────────────────────────────────────────
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Text Content", false)]
[ShowIf("blockType", StoryBlockType.Text)]
- [LabelText("Yarn Node Name")]
+ [LabelText("Yarn Node")]
+ [Tooltip("点击 TextBlock 后由 Yarn Spinner 开始执行的节点名。")]
public string yarnNodeName;
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Text Content")]
[ShowIf("blockType", StoryBlockType.Text)]
- [LabelText("Title Key (Localization)")]
+ [LabelText("Title Key")]
+ [Tooltip("该 TextBlock 标题使用的 Unity Localization Entry Key;留空时视觉层可使用 Block ID 作为开发阶段回退。")]
public string titleKey;
///
/// TextBlock 的视觉和叙事层级。Important 用于主线转折与后续 checkpoint;
/// Secondary 用于支线或补充剧情。默认 Important,以保持现有 TextBlock 的呈现语义。
///
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Text Content")]
[ShowIf("blockType", StoryBlockType.Text)]
- [LabelText("Text Importance")]
+ [LabelText("Importance")]
+ [Tooltip("Important 用于主线转折与后续 Checkpoint;Secondary 用于支线或补充剧情,并决定对应的 Block Prefab。")]
public TextBlockImportance textImportance = TextBlockImportance.Important;
// ── Song Block ──────────────────────────────────────────────────────────
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Song Content", false)]
[ShowIf("blockType", StoryBlockType.Song)]
- [LabelText("Song Name (Stable ID)")]
- [InfoBox("对应 ChapterSelectionUnit 中 SongItemData.songName 的稳定歌曲标识。它用于查找歌曲资料与进入选曲,不能填写 displaySongName、翻译文本或作曲者名称。")]
+ [LabelText("Song ID")]
+ [Tooltip("对应 ChapterSelectionUnit 中 SongItemData.songName 的稳定歌曲标识。不能填写 displaySongName、翻译文本或作曲者名称。")]
public string songName;
///
@@ -127,18 +174,19 @@ namespace Ichni.Story
/// Mask 可视区域固定为当前 Prefab 的尺寸;在不露出上下空白的前提下,安全范围为 -74.25 到 74.25。
/// 该值是最终坐标而非偏移量:0 表示居中,负值向下移动,正值向上移动。
///
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Song Content")]
[ShowIf("blockType", StoryBlockType.Song)]
- [LabelText("Illustration Local Y")]
+ [LabelText("Illustration Y")]
[Range(-74.25f, 74.25f)]
- [InfoBox("用于微调 16:9 插画在 SongBlock Mask 中的纵向裁切。请保持 SongBlockUI 的 Illustration 尺寸为 400 x 225。")]
+ [Tooltip("微调 16:9 插画在 SongBlock Mask 中的纵向裁切。SongBlockUI 的 Illustration 尺寸应保持为 400 × 225。")]
public float illustrationLocalY;
// ── Tutorial Block ──────────────────────────────────────────────────────
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Tutorial Content", false)]
[ShowIf("blockType", StoryBlockType.Tutorial)]
- [LabelText("Tutorial Name")]
+ [LabelText("Display Name")]
+ [Tooltip("仅用于 StoryBlock 的显示与编辑识别,不参与教程查找。")]
public string tutorialName;
///
@@ -146,29 +194,32 @@ namespace Ichni.Story
/// 只用于运行时查找,不使用展示名称或章节名称作为逻辑匹配条件。
/// 命名统一使用小写英文、数字和下划线,例如 chapter0_intro。
///
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Tutorial Content")]
[ShowIf("blockType", StoryBlockType.Tutorial)]
[LabelText("Tutorial Key")]
+ [Tooltip("TutorialCollection 中的稳定 Key。使用小写英文、数字和下划线,例如 chapter0_intro。")]
public string tutorialKey;
///
- /// 教程被玩家选择“游玩”或“跳过”后写入的全局剧情变量。
+ /// 教程被玩家选择“游玩”或“跳过”后写入的当前章节剧情变量。
/// 后续 Block 应通过 检查该变量是否等于 1 来解锁。
/// 命名统一使用小写英文、数字和下划线,例如
/// story_tutorial_chapter0_intro_resolved。
///
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Tutorial Content")]
[ShowIf("blockType", StoryBlockType.Tutorial)]
[LabelText("Progress Variable")]
+ [Tooltip("玩家选择游玩或跳过教程后写入 true 的章节剧情变量;后续 Block 可通过条件检查它。")]
public string tutorialProgressVariable;
///
/// 要启动的教程难度的稳定存档 ID,对应 。
/// 不使用难度列表下标,避免调整难度排列后教程进入错误谱面。
///
- [FoldoutGroup("$blockId")]
+ [FoldoutGroup("$EditorHeader/Tutorial Content")]
[ShowIf("blockType", StoryBlockType.Tutorial)]
- [LabelText("Tutorial Difficulty Save ID")]
+ [LabelText("Difficulty Save ID")]
+ [Tooltip("要启动教程谱面的 DifficultyData.saveDifficultyId。不要使用难度列表下标,以免排序变化后指向错误谱面。")]
public int tutorialDifficultySaveId = -1;
///
@@ -196,12 +247,13 @@ namespace Ichni.Story
/// 例如 unlockCondition 留空即允许,而 forbiddenCondition 留空即不禁用。
///
[InlineProperty]
+ [HideReferenceObjectPicker]
[Serializable]
public class StoryCondition
{
[HideLabel]
[SerializeReference]
- [InfoBox("留空表示未配置条件。可选择 All Of(AND) / Any Of(OR) / Not 复合节点进行任意嵌套。")]
+ [Tooltip("留空表示未配置条件。可选择 All Of(AND) / Any Of(OR) / Not 复合节点进行任意嵌套。")]
public StoryConditionNode root;
///
@@ -219,5 +271,15 @@ namespace Ichni.Story
{
return root != null && root.Evaluate(getVariable, isBlockCompleted);
}
+
+#if UNITY_EDITOR
+ ///
+ /// Odin 条件 Drawer 使用的只读摘要;不参与运行时求值和序列化。
+ ///
+ public string GetEditorSummary()
+ {
+ return root == null ? "None" : root.GetEditorSummary();
+ }
+#endif
}
}
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryConditionNode.cs b/Assets/Scripts/NewStorySystem/Data/StoryConditionNode.cs
index 77617084..323b705e 100644
--- a/Assets/Scripts/NewStorySystem/Data/StoryConditionNode.cs
+++ b/Assets/Scripts/NewStorySystem/Data/StoryConditionNode.cs
@@ -19,6 +19,13 @@ namespace Ichni.Story
/// 按变量名返回其整型值的委托。
/// 按 blockId 判断该 Block 是否已完成的委托。
public abstract bool Evaluate(Func getVariable, Func isBlockCompleted);
+
+#if UNITY_EDITOR
+ ///
+ /// 返回 Inspector 中使用的紧凑摘要。条件编辑器只读取该文本,不影响运行时求值逻辑。
+ ///
+ public virtual string GetEditorSummary() => GetType().Name;
+#endif
}
///
@@ -43,6 +50,10 @@ namespace Ichni.Story
return true;
}
+
+#if UNITY_EDITOR
+ public override string GetEditorSummary() => $"All Of ({conditions?.Count ?? 0})";
+#endif
}
///
@@ -70,6 +81,10 @@ namespace Ichni.Story
return false;
}
+
+#if UNITY_EDITOR
+ public override string GetEditorSummary() => $"Any Of ({conditions?.Count ?? 0})";
+#endif
}
///
@@ -87,6 +102,10 @@ namespace Ichni.Story
{
return condition == null || !condition.Evaluate(getVariable, isBlockCompleted);
}
+
+#if UNITY_EDITOR
+ public override string GetEditorSummary() => $"Not ({condition?.GetEditorSummary() ?? "None"})";
+#endif
}
///
@@ -97,12 +116,20 @@ namespace Ichni.Story
public class BlockCompletedCondition : StoryConditionNode
{
[LabelText("Block ID")]
+ [LabelWidth(50)]
+ [Tooltip("必须已完成的 StoryBlock ID。可用于表达显式前置条件;通常连接关系已由 Connected Rule 自动处理。")]
public string blockId;
public override bool Evaluate(Func getVariable, Func isBlockCompleted)
{
return !string.IsNullOrEmpty(blockId) && isBlockCompleted(blockId);
}
+
+#if UNITY_EDITOR
+ public override string GetEditorSummary() => string.IsNullOrWhiteSpace(blockId)
+ ? "Block Completed: "
+ : $"Block Completed: {blockId}";
+#endif
}
///
@@ -113,13 +140,22 @@ namespace Ichni.Story
[LabelText("Variable Compare")]
public class VariableCondition : StoryConditionNode
{
- [LabelText("Variable Name")]
+ [HorizontalGroup("VariableComparison", 0.50f)]
+ [LabelText("Var")]
+ [LabelWidth(24)]
+ [Tooltip("章节剧情变量名。使用小写英文、数字和下划线;可由 Yarn 的 set_* 指令写入。")]
public string variableName;
- [LabelText("Comparison")]
+ [HorizontalGroup("VariableComparison", 0.22f)]
+ [LabelText("Op")]
+ [LabelWidth(20)]
+ [Tooltip("变量值与目标值之间的比较方式。")]
public VariableComparison comparison;
+ [HorizontalGroup("VariableComparison")]
[LabelText("Value")]
+ [LabelWidth(35)]
+ [Tooltip("用于比较的整数目标值。Bool 条件使用 0 / 1。")]
public int value;
public override bool Evaluate(Func getVariable, Func isBlockCompleted)
@@ -136,5 +172,67 @@ namespace Ichni.Story
_ => false
};
}
+
+#if UNITY_EDITOR
+ public override string GetEditorSummary()
+ {
+ string variable = string.IsNullOrWhiteSpace(variableName) ? "" : variableName;
+ string operation = comparison switch
+ {
+ VariableComparison.Equal => "==",
+ VariableComparison.NotEqual => "!=",
+ VariableComparison.Greater => ">",
+ VariableComparison.GreaterOrEqual => ">=",
+ VariableComparison.Less => "<",
+ VariableComparison.LessOrEqual => "<=",
+ _ => "?"
+ };
+ return $"{variable} {operation} {value}";
+ }
+#endif
}
}
+
+#if UNITY_EDITOR
+namespace Ichni.Story.Editor
+{
+ ///
+ /// 通用 StoryCondition 的 Odin Inspector Drawer。
+ /// Unlock、Forbidden 与 Helper Availability 共用同一条件模型;此 Drawer 只改变编辑器中的
+ /// 折叠呈现方式,不修改条件树的序列化结构或运行时求值结果。
+ /// 默认仅显示可读摘要。需要调整条件时再展开,避免 SerializeReference 条件树长期占据 Block 的编辑空间。
+ ///
+ public class StoryConditionDrawer : Sirenix.OdinInspector.Editor.OdinValueDrawer
+ {
+ private bool _isExpanded;
+
+ protected override void DrawPropertyLayout(UnityEngine.GUIContent label)
+ {
+ StoryCondition condition = ValueEntry.SmartValue;
+ string summary = condition == null ? "None" : condition.GetEditorSummary();
+
+ // 父属性若保留了简短标签(例如 Helper 的 Availability),则与摘要合并显示;
+ // StoryBlock 中使用 HideLabel 时只保留摘要,避免重复占用左侧标签列。
+ string prefix = label == null || string.IsNullOrWhiteSpace(label.text)
+ ? string.Empty
+ : $"{label.text}: ";
+
+ UnityEngine.GUIContent foldoutLabel = new UnityEngine.GUIContent(
+ prefix + summary,
+ "留空表示未配置条件。展开后可选择 All Of (AND)、Any Of (OR)、Not、Block Completed 或 Variable Compare。"
+ );
+
+ _isExpanded = UnityEditor.EditorGUILayout.Foldout(_isExpanded, foldoutLabel, true);
+ if (!_isExpanded)
+ {
+ return;
+ }
+
+ UnityEditor.EditorGUI.indentLevel++;
+ // 继续调用 Odin 的默认 SerializeReference 绘制链,使类型选择、嵌套条件和 Undo 行为保持原样。
+ CallNextDrawer(UnityEngine.GUIContent.none);
+ UnityEditor.EditorGUI.indentLevel--;
+ }
+ }
+}
+#endif
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs b/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs
new file mode 100644
index 00000000..f602c941
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs
@@ -0,0 +1,780 @@
+#if UNITY_EDITOR
+using System.Collections.Generic;
+using System.Linq;
+using Sirenix.OdinInspector;
+using UnityEditor;
+using UnityEngine;
+
+namespace Ichni.Story
+{
+ ///
+ /// StoryData 的编辑器扩展:集中存放只读 Validation 与故事树 Preview。
+ /// 与运行时数据查询拆分后,修改剧情结构时无需在同一文件中穿过大量 Inspector 绘制代码。
+ ///
+ public partial class StoryData
+ {
+ private enum StoryPreviewMode { Detailed, Simple }
+
+ // 编辑器 UI 临时状态(不参与序列化)
+ [System.NonSerialized] private StoryPreviewMode _previewMode = StoryPreviewMode.Detailed;
+ [System.NonSerialized] private Vector2 _previewPan;
+ [System.NonSerialized] private bool _isPanningPreview;
+ [System.NonSerialized] private bool _isPreviewExpanded;
+ [System.NonSerialized] private bool _requestPreviewFit;
+
+ private const float PreviewViewportHeight = 380f;
+ private const float PreviewPaddingLeft = 24f;
+
+ // 预览与运行时共用同一套“列 / 行代表 Block 中心点”的布局语义。
+ // 这里的尺寸直接对应当前四种 Block Prefab 的设计尺寸;若未来修改 Prefab 尺寸,必须同步更新本组常量。
+ private const float ImportantBlockWidth = 600f;
+ private const float ImportantBlockHeight = 375f;
+ private const float SecondaryBlockWidth = 400f;
+ private const float SecondaryBlockHeight = 200f;
+ private const float SongBlockWidth = 400f;
+ private const float SongBlockHeight = 100f;
+ private const float TutorialBlockWidth = 400f;
+ private const float TutorialBlockHeight = 100f;
+
+ // 与 StoryTreeController 默认 columnStep / rowStep 保持比例一致,
+ // 因而预览中的相邻列、行间距也能反映运行时的实际布局关系。
+ private const float RuntimeColumnStep = 720f;
+ private const float RuntimeRowStep = 525f;
+ private const float DetailedPreviewScale = 0.25f;
+ private const float SimplePreviewScale = 0.10f;
+
+ [PropertyOrder(-9)]
+ [Button("Validate Story Data", ButtonSizes.Medium)]
+ [Tooltip("只读检查当前 StoryData 的引用、ID 与必要字段,不会自动修改资产,也不会检查歌曲/谱面的导入内容。")]
+ private void ValidateStoryData()
+ {
+ List issues = new List();
+ HashSet blockIds = new HashSet();
+ HashSet variableKeys = new HashSet();
+ HashSet markerIds = new HashSet();
+
+ if (string.IsNullOrWhiteSpace(chapterIndex))
+ {
+ issues.Add("[Error] Chapter Index 为空。");
+ }
+
+ if (yarnProject == null)
+ {
+ issues.Add("[Warning] Yarn Project 未配置;TextBlock 无法开始对应的 Yarn 节点。");
+ }
+
+ foreach (StoryVariableDefinition variable in initialVariables)
+ {
+ if (variable == null)
+ {
+ issues.Add("[Warning] Initial Variables 中存在空项。");
+ continue;
+ }
+
+ if (!IsValidStableKey(variable.key))
+ {
+ issues.Add($"[Warning] Initial Variable Key '{variable.key}' 为空或不符合小写英文、数字、下划线的命名规则。");
+ continue;
+ }
+
+ if (!variableKeys.Add(variable.key))
+ {
+ issues.Add($"[Error] Initial Variable Key '{variable.key}' 重复。");
+ }
+ }
+
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (block == null)
+ {
+ issues.Add("[Warning] Blocks 中存在空项。");
+ continue;
+ }
+
+ if (string.IsNullOrWhiteSpace(block.blockId))
+ {
+ issues.Add("[Error] 存在未填写 Block ID 的 Block。");
+ continue;
+ }
+
+ if (!blockIds.Add(block.blockId))
+ {
+ issues.Add($"[Error] Block ID '{block.blockId}' 重复。");
+ }
+ }
+
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (block == null || string.IsNullOrWhiteSpace(block.blockId))
+ {
+ continue;
+ }
+
+ ValidateBlock(block, blockIds, issues);
+ ValidateCondition(block.unlockCondition, $"Block '{block.blockId}' Unlock Condition", blockIds, issues);
+ ValidateCondition(block.forbiddenCondition, $"Block '{block.blockId}' Forbidden Condition", blockIds, issues);
+ }
+
+ ValidateTextBlockYarnNodes(issues);
+ HashSet reachableBlockIds = ValidateStoryGraph(blockIds, issues);
+
+ foreach (StoryTimelineMarkerDefinition marker in timelineMarkers)
+ {
+ if (marker == null)
+ {
+ issues.Add("[Warning] Timeline Markers 中存在空项。");
+ continue;
+ }
+
+ if (!IsValidStableKey(marker.markerId))
+ {
+ issues.Add($"[Error] Timeline Marker ID '{marker.markerId}' 为空或不符合命名规则。");
+ }
+ else if (!markerIds.Add(marker.markerId))
+ {
+ issues.Add($"[Error] Timeline Marker ID '{marker.markerId}' 重复。");
+ }
+
+ StoryBlockDefinition anchor = GetBlock(marker.anchorBlockId);
+ if (anchor == null)
+ {
+ issues.Add($"[Error] Timeline Marker '{marker.markerId}' 指向不存在的 Anchor Block '{marker.anchorBlockId}'。");
+ }
+ else if (anchor.blockType != StoryBlockType.Text)
+ {
+ issues.Add($"[Error] Timeline Marker '{marker.markerId}' 的 Anchor Block '{marker.anchorBlockId}' 不是 TextBlock。");
+ }
+
+ if (string.IsNullOrWhiteSpace(marker.labelKey))
+ {
+ issues.Add($"[Warning] Timeline Marker '{marker.markerId}' 未配置 Label Key。");
+ }
+ }
+
+ ValidateTimelineMarkerAnchors(reachableBlockIds, issues);
+ ValidateExclusiveRouteGroups(blockIds, issues);
+ ValidateLegacyYarnSyntax(issues);
+
+ if (issues.Count == 0)
+ {
+ Debug.Log($"[StoryData] '{name}' validation passed.", this);
+ }
+ else
+ {
+ // Unity Console 的折叠列表不会为单条日志中的换行自动增加行高,
+ // 把整份报告拼成多行字符串会导致文本重叠。摘要与每个问题分别输出,
+ // 既保持 Console 可读,也能让使用者逐条双击定位所属 StoryData。
+ Debug.LogWarning($"[StoryData] '{name}' validation found {issues.Count} issue(s). See the following entries.", this);
+ for (int index = 0; index < issues.Count; index++)
+ {
+ string issue = issues[index];
+ string message = $"[StoryData] '{name}' [{index + 1}/{issues.Count}] {issue}";
+ if (issue.StartsWith("[Error]"))
+ Debug.LogError(message, this);
+ else
+ Debug.LogWarning(message, this);
+ }
+ }
+ }
+
+ ///
+ /// 检查单个 Block 的必要配置。该方法只报告明确会导致运行时入口失效的字段,
+ /// 不检查歌曲或谱面导入结果,以免把内容制作流程变成阻断式校验。
+ ///
+ private static void ValidateBlock(StoryBlockDefinition block, HashSet blockIds, List issues)
+ {
+ HashSet nextIds = new HashSet();
+ foreach (string nextId in block.nextBlockIds)
+ {
+ if (string.IsNullOrWhiteSpace(nextId))
+ {
+ issues.Add($"[Warning] Block '{block.blockId}' 的 Next Blocks 中存在空 ID。");
+ }
+ else if (!blockIds.Contains(nextId))
+ {
+ issues.Add($"[Error] Block '{block.blockId}' 指向不存在的 Next Block '{nextId}'。");
+ }
+ else if (!nextIds.Add(nextId))
+ {
+ issues.Add($"[Warning] Block '{block.blockId}' 重复指向 Next Block '{nextId}'。");
+ }
+ }
+
+ switch (block.blockType)
+ {
+ case StoryBlockType.Text when string.IsNullOrWhiteSpace(block.yarnNodeName):
+ issues.Add($"[Warning] TextBlock '{block.blockId}' 未配置 Yarn Node。");
+ break;
+ case StoryBlockType.Song when string.IsNullOrWhiteSpace(block.songName):
+ issues.Add($"[Warning] SongBlock '{block.blockId}' 未配置 Song ID。");
+ break;
+ case StoryBlockType.Tutorial:
+ if (string.IsNullOrWhiteSpace(block.tutorialKey))
+ issues.Add($"[Warning] TutorialBlock '{block.blockId}' 未配置 Tutorial Key。");
+ if (string.IsNullOrWhiteSpace(block.tutorialProgressVariable))
+ issues.Add($"[Warning] TutorialBlock '{block.blockId}' 未配置 Progress Variable。");
+ if (block.tutorialDifficultySaveId < 0)
+ issues.Add($"[Warning] TutorialBlock '{block.blockId}' 未配置有效的 Difficulty Save ID。");
+ break;
+ }
+ }
+
+ ///
+ /// 校验 TextBlock 的 Yarn 节点是否真实存在于已编译的 YarnProject,及是否被多个 Block 共用。
+ /// 后者并非必然错误,但通常意味着复制 Block 后忘记替换 Node,因此仅报告 Warning。
+ ///
+ private void ValidateTextBlockYarnNodes(List issues)
+ {
+ if (yarnProject?.Program == null)
+ return;
+
+ Dictionary> blockIdsByNode = new Dictionary>();
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (block == null || block.blockType != StoryBlockType.Text || string.IsNullOrWhiteSpace(block.yarnNodeName))
+ continue;
+
+ if (!yarnProject.Program.Nodes.ContainsKey(block.yarnNodeName))
+ issues.Add($"[Error] TextBlock '{block.blockId}' 指向的 Yarn Node '{block.yarnNodeName}' 不存在于当前 Yarn Project。" );
+
+ if (!blockIdsByNode.TryGetValue(block.yarnNodeName, out List referencedBlocks))
+ {
+ referencedBlocks = new List();
+ blockIdsByNode[block.yarnNodeName] = referencedBlocks;
+ }
+
+ referencedBlocks.Add(block.blockId);
+ }
+
+ foreach (KeyValuePair> pair in blockIdsByNode)
+ {
+ if (pair.Value.Count > 1)
+ issues.Add($"[Warning] Yarn Node '{pair.Key}' 被多个 TextBlock 共用:{string.Join(", ", pair.Value)}。确认这是有意复用,而非遗漏修改 Node。" );
+ }
+ }
+
+ ///
+ /// 对 StoryData 的连接图做只读的结构检查:入口、不可达 Block、环路、非向前连接与终点。
+ /// 这些检查不评价具体剧情质量,只定位最容易造成“永远无法游玩”或“无法结束章节”的配置问题。
+ ///
+ private HashSet ValidateStoryGraph(HashSet blockIds, List issues)
+ {
+ Dictionary> adjacency = new Dictionary>();
+ Dictionary indegree = new Dictionary();
+ foreach (string id in blockIds)
+ {
+ adjacency[id] = new List();
+ indegree[id] = 0;
+ }
+
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (block == null || !blockIds.Contains(block.blockId))
+ continue;
+
+ foreach (string nextId in block.nextBlockIds.Where(id => !string.IsNullOrWhiteSpace(id) && blockIds.Contains(id)).Distinct())
+ {
+ adjacency[block.blockId].Add(nextId);
+ indegree[nextId]++;
+
+ StoryBlockDefinition next = GetBlock(nextId);
+ if (next != null && next.gridColumn <= block.gridColumn)
+ issues.Add($"[Warning] Block '{block.blockId}' -> '{nextId}' 没有指向更靠后的 Column;请确认这不是意外的回退连接或循环。" );
+ }
+ }
+
+ List entries = indegree.Where(pair => pair.Value == 0).Select(pair => pair.Key).ToList();
+ if (entries.Count == 0 && blockIds.Count > 0)
+ issues.Add("[Error] 剧情连接图没有入口 Block(所有 Block 都存在前置连接)。");
+ else if (entries.Count > 1)
+ issues.Add($"[Warning] 剧情连接图存在 {entries.Count} 个入口 Block:{string.Join(", ", entries)}。确认它们均由条件或设计意图控制。" );
+
+ HashSet reachable = new HashSet();
+ Stack pending = new Stack(entries);
+ while (pending.Count > 0)
+ {
+ string current = pending.Pop();
+ if (!reachable.Add(current))
+ continue;
+
+ foreach (string next in adjacency[current])
+ pending.Push(next);
+ }
+
+ foreach (string id in blockIds.Where(id => !reachable.Contains(id)))
+ issues.Add($"[Warning] Block '{id}' 从任何入口都不可达;若依赖纯变量条件进入,请确认存在外部入口。" );
+
+ List terminalBlocks = adjacency.Where(pair => pair.Value.Count == 0).Select(pair => pair.Key).ToList();
+ if (blockIds.Count > 0 && terminalBlocks.Count == 0)
+ issues.Add("[Warning] 剧情连接图不存在终点 Block;请确认循环路线可以按预期结束。" );
+
+ HashSet visiting = new HashSet();
+ HashSet visited = new HashSet();
+ foreach (string entry in entries)
+ DetectCycle(entry, adjacency, visiting, visited, issues);
+
+ return reachable;
+ }
+
+ private static void DetectCycle(string blockId, Dictionary> adjacency,
+ HashSet visiting, HashSet visited, List issues)
+ {
+ if (visited.Contains(blockId))
+ return;
+
+ if (!visiting.Add(blockId))
+ {
+ issues.Add($"[Warning] 剧情连接图检测到包含 Block '{blockId}' 的循环。请确认该循环有明确的变量出口。" );
+ return;
+ }
+
+ foreach (string next in adjacency[blockId])
+ DetectCycle(next, adjacency, visiting, visited, issues);
+
+ visiting.Remove(blockId);
+ visited.Add(blockId);
+ }
+
+ /// 检查多个 Marker 是否锚定到同一 Block;通常表示重复配置,不阻止特殊的多标签时间点。
+ private void ValidateTimelineMarkerAnchors(HashSet reachableBlockIds, List issues)
+ {
+ foreach (IGrouping group in timelineMarkers
+ .Where(marker => marker != null && !string.IsNullOrWhiteSpace(marker.anchorBlockId))
+ .GroupBy(marker => marker.anchorBlockId))
+ {
+ if (group.Count() > 1)
+ issues.Add($"[Warning] 多个 Timeline Marker 锚定到 Block '{group.Key}':{string.Join(", ", group.Select(marker => marker.markerId))}。确认这是有意的多标签时间点。" );
+
+ if (!reachableBlockIds.Contains(group.Key))
+ issues.Add($"[Warning] Timeline Marker 锚定的 Block '{group.Key}' 从任何入口都不可达,Marker 将永远不会按正常流程显示。" );
+ }
+ }
+
+ ///
+ /// 检查互斥结局的编辑期声明。由于 Forbidden Condition 可以是任意变量表达式,
+ /// 自检无法数学证明条件完全互斥;它只检查显式分组、引用、终点形态和最基本的禁用条件覆盖。
+ ///
+ private void ValidateExclusiveRouteGroups(HashSet blockIds, List issues)
+ {
+ HashSet groupIds = new HashSet();
+ foreach (StoryRouteValidationGroup group in exclusiveRouteGroups)
+ {
+ if (group == null)
+ {
+ issues.Add("[Warning] Exclusive Route Groups 中存在空项。");
+ continue;
+ }
+
+ if (!IsValidStableKey(group.groupId))
+ issues.Add($"[Error] Exclusive Route Group ID '{group.groupId}' 为空或不符合命名规则。" );
+ else if (!groupIds.Add(group.groupId))
+ issues.Add($"[Error] Exclusive Route Group ID '{group.groupId}' 重复。" );
+
+ if (group.terminalBlockIds == null || group.terminalBlockIds.Count < 2)
+ {
+ issues.Add($"[Warning] Exclusive Route Group '{group.groupId}' 至少应包含两个互斥终点 Block。" );
+ continue;
+ }
+
+ HashSet seenTerminalIds = new HashSet();
+ foreach (string terminalId in group.terminalBlockIds)
+ {
+ if (!seenTerminalIds.Add(terminalId))
+ {
+ issues.Add($"[Warning] Exclusive Route Group '{group.groupId}' 重复包含 Block '{terminalId}'。" );
+ continue;
+ }
+
+ StoryBlockDefinition terminal = GetBlock(terminalId);
+ if (terminal == null || !blockIds.Contains(terminalId))
+ {
+ issues.Add($"[Error] Exclusive Route Group '{group.groupId}' 引用了不存在的 Block '{terminalId}'。" );
+ continue;
+ }
+
+ if (terminal.nextBlockIds.Any(id => !string.IsNullOrWhiteSpace(id)))
+ issues.Add($"[Warning] Exclusive Route Group '{group.groupId}' 的终点 Block '{terminalId}' 仍配置了 Next Block。" );
+
+ if (terminal.forbiddenCondition == null || !terminal.forbiddenCondition.IsConfigured)
+ issues.Add($"[Warning] 互斥终点 Block '{terminalId}' 未配置 Forbidden Condition;请人工确认其它路线完成后会禁用它。" );
+ }
+ }
+ }
+
+ ///
+ /// 侦测已废弃的 Yarn 临时变量语法。新台本应只使用项目提供的 set_* / get_* 永久变量命令;
+ /// C0 旧台本仍可能保留历史语法,故当前只输出 Warning,不自动修改任何文本资产。
+ ///
+ private void ValidateLegacyYarnSyntax(List issues)
+ {
+ if (yarnProject == null)
+ return;
+
+ string projectPath = AssetDatabase.GetAssetPath(yarnProject);
+ foreach (string path in AssetDatabase.GetDependencies(projectPath, true).Where(path => path.EndsWith(".yarn")))
+ {
+ TextAsset yarnSource = AssetDatabase.LoadAssetAtPath(path);
+ if (yarnSource == null)
+ continue;
+
+ string[] lines = yarnSource.text.Split('\n');
+ for (int index = 0; index < lines.Length; index++)
+ {
+ string line = lines[index].TrimStart();
+ if (line.StartsWith("<
+ /// 遍历通用条件树,检查会造成条件无法按预期求值的空引用或不存在 Block 引用。
+ /// VariableCondition 只检查变量名是否为空:未在 Initial Variables 声明的变量允许由 Yarn 在运行时首次写入。
+ ///
+ private static void ValidateCondition(StoryCondition condition, string owner, HashSet blockIds, List issues)
+ {
+ if (condition?.root != null)
+ {
+ ValidateConditionNode(condition.root, owner, blockIds, issues);
+ }
+ }
+
+ private static void ValidateConditionNode(StoryConditionNode node, string owner, HashSet blockIds, List issues)
+ {
+ switch (node)
+ {
+ case AllOfCondition allOf:
+ if (allOf.conditions == null || allOf.conditions.Count == 0)
+ issues.Add($"[Warning] {owner} 的 All Of 没有子条件,会恒为 true。");
+ else
+ ValidateConditionChildren(allOf.conditions, owner, blockIds, issues);
+ break;
+ case AnyOfCondition anyOf:
+ if (anyOf.conditions == null || anyOf.conditions.Count == 0)
+ issues.Add($"[Warning] {owner} 的 Any Of 没有子条件,会恒为 false。");
+ else
+ ValidateConditionChildren(anyOf.conditions, owner, blockIds, issues);
+ break;
+ case NotCondition not:
+ if (not.condition == null)
+ issues.Add($"[Warning] {owner} 的 Not 没有子条件,会恒为 true。");
+ else
+ ValidateConditionNode(not.condition, owner, blockIds, issues);
+ break;
+ case BlockCompletedCondition blockCompleted:
+ if (string.IsNullOrWhiteSpace(blockCompleted.blockId) || !blockIds.Contains(blockCompleted.blockId))
+ issues.Add($"[Error] {owner} 引用了不存在的 Block Completed ID '{blockCompleted.blockId}'。");
+ break;
+ case VariableCondition variable when string.IsNullOrWhiteSpace(variable.variableName):
+ issues.Add($"[Error] {owner} 存在未填写 Variable Name 的 Variable Compare。");
+ break;
+ case null:
+ issues.Add($"[Warning] {owner} 包含空条件节点。");
+ break;
+ }
+ }
+
+ private static void ValidateConditionChildren(List children, string owner, HashSet blockIds, List issues)
+ {
+ foreach (StoryConditionNode child in children)
+ {
+ ValidateConditionNode(child, owner, blockIds, issues);
+ }
+ }
+
+ private static bool IsValidStableKey(string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return false;
+ }
+
+ foreach (char character in value)
+ {
+ if (!(character is >= 'a' and <= 'z') &&
+ !(character is >= '0' and <= '9') &&
+ character != '_')
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ ///
+ /// 在 Inspector 顶部绘制只读的故事树结构预览(流程图样式,连线左右相连)。
+ /// 提供"详细 / 简略"两种可拖拽平移的视图;按 (gridColumn, gridRow) 摆放 block。
+ /// 每个 Block 使用其运行时 Prefab 尺寸按统一比例缩放后的矩形,且列坐标始终代表 Block 的中心点,
+ /// 从而让 Important / Secondary / Song / Tutorial 的体积与连线端点关系尽量接近游戏内画面。
+ ///
+ [PropertyOrder(-10)]
+ [OnInspectorGUI]
+ private void DrawStoryPreview()
+ {
+ _isPreviewExpanded = EditorGUILayout.Foldout(
+ _isPreviewExpanded,
+ new GUIContent(
+ "Story Tree Preview",
+ "只读预览:按 StoryData 的 Column / Row、连接关系和当前 Block 尺寸约定绘制。展开后可拖动平移视图。"
+ ),
+ true
+ );
+ if (!_isPreviewExpanded)
+ {
+ return;
+ }
+
+ if (blocks == null || blocks.Count == 0)
+ {
+ EditorGUILayout.HelpBox("尚未定义任何 block。", MessageType.Info);
+ return;
+ }
+
+ // 顶部工具条:模式切换 + 复位视图
+ EditorGUILayout.BeginHorizontal();
+ _previewMode = (StoryPreviewMode)GUILayout.Toolbar(
+ (int)_previewMode, new[] { "Detailed", "Simple" }, GUILayout.Height(20f));
+ if (GUILayout.Button("Fit View", GUILayout.Width(80f), GUILayout.Height(20f)))
+ _requestPreviewFit = true;
+ if (GUILayout.Button("Reset", GUILayout.Width(60f), GUILayout.Height(20f)))
+ _previewPan = Vector2.zero;
+ EditorGUILayout.EndHorizontal();
+
+ bool simple = _previewMode == StoryPreviewMode.Simple;
+ float previewScale = simple ? SimplePreviewScale : DetailedPreviewScale;
+ float stepX = RuntimeColumnStep * previewScale;
+ float stepY = RuntimeRowStep * previewScale;
+
+ Rect area = GUILayoutUtility.GetRect(0f, PreviewViewportHeight, GUILayout.ExpandWidth(true));
+ // 工具栏按钮在取得最终 Preview 区域后才可执行精确 Fit;用当前 Event 的热键标记延迟到这里处理。
+ if (_requestPreviewFit)
+ {
+ FitPreviewView(area, previewScale);
+ _requestPreviewFit = false;
+ }
+ EditorGUI.DrawRect(area, new Color(0.12f, 0.12f, 0.14f, 1f));
+
+ HandlePreviewPanning(area);
+
+ // 裁剪到预览区,超出部分(平移后)不外溢到其它 Inspector 元素
+ GUI.BeginClip(area);
+ {
+ // (0,0) 是 Block 的逻辑中心点。为避免第一列 Important Block 被左侧裁掉,
+ // 初始视图预留半个最大 Block 宽度;这不改变 StoryData 的坐标语义。
+ float originX = PreviewPaddingLeft + ImportantBlockWidth * previewScale * 0.5f + _previewPan.x;
+ float originY = area.height * 0.5f + _previewPan.y;
+
+ // 计算各 Block 的实际比例矩形。运行时同样以中心 Pivot 放置,因此 gridColumn / gridRow
+ // 在预览中也对应矩形中心,而不是左边缘。
+ Dictionary cellRects = new Dictionary();
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (!HasPreviewableBlockId(block)) continue;
+
+ Vector2 blockSize = GetPreviewBlockSize(block, previewScale);
+ float px = originX + block.gridColumn * stepX; // 列向右为正(可负、可小数)
+ float py = originY + block.gridRow * stepY; // 行向下为正、向上为负
+ cellRects[block.blockId] = new Rect(
+ px - blockSize.x * 0.5f,
+ py - blockSize.y * 0.5f,
+ blockSize.x,
+ blockSize.y);
+ }
+
+ // 先画连线:与 BlockConnectorView 相同,起点右中 → 以两个 Block 中心的中点列折线 → 终点左中。
+ // 不使用端口中点作为转折列,避免不同宽度 Block 在同一列时出现不一致的转折位置。
+ Handles.BeginGUI();
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (!HasPreviewableBlockId(block) || !cellRects.TryGetValue(block.blockId, out Rect fromRect)) continue;
+
+ foreach (string nextId in block.nextBlockIds)
+ {
+ if (string.IsNullOrEmpty(nextId) || !cellRects.TryGetValue(nextId, out Rect toRect)) continue;
+
+ Vector3 start = new Vector3(fromRect.xMax, fromRect.center.y, 0f);
+ Vector3 end = new Vector3(toRect.xMin, toRect.center.y, 0f);
+ float midX = (fromRect.center.x + toRect.center.x) * 0.5f;
+ Vector3 mid1 = new Vector3(midX, start.y, 0f);
+ Vector3 mid2 = new Vector3(midX, end.y, 0f);
+
+ Handles.color = new Color(0.82f, 0.82f, 0.88f, 1f);
+ Handles.DrawAAPolyLine(simple ? 2f : 3f, start, mid1, mid2, end);
+ }
+ }
+ Handles.EndGUI();
+
+ // 再画 block 方块
+ GUIStyle labelStyle = new GUIStyle(EditorStyles.boldLabel)
+ {
+ alignment = TextAnchor.MiddleCenter,
+ wordWrap = true,
+ richText = false,
+ fontSize = simple ? 9 : 11,
+ normal = { textColor = Color.white }
+ };
+
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (!HasPreviewableBlockId(block) || !cellRects.TryGetValue(block.blockId, out Rect rect)) continue;
+
+ EditorGUI.DrawRect(rect, GetTypeColor(block.blockType));
+ string label = GetPreviewLabel(block, simple, rect.height);
+ GUI.Label(rect, label, labelStyle);
+ }
+ }
+ GUI.EndClip();
+
+ }
+
+ ///
+ /// 返回一个 Block 在 Inspector 预览中的尺寸。所有类型使用同一缩放比例,
+ /// 因而宽高比及不同 Block 之间的体积关系与运行时 Prefab 保持一致。
+ ///
+ private static Vector2 GetPreviewBlockSize(StoryBlockDefinition block, float previewScale)
+ {
+ Vector2 runtimeSize = block.blockType switch
+ {
+ StoryBlockType.Text when block.textImportance == TextBlockImportance.Important =>
+ new Vector2(ImportantBlockWidth, ImportantBlockHeight),
+ StoryBlockType.Text => new Vector2(SecondaryBlockWidth, SecondaryBlockHeight),
+ StoryBlockType.Song => new Vector2(SongBlockWidth, SongBlockHeight),
+ StoryBlockType.Tutorial => new Vector2(TutorialBlockWidth, TutorialBlockHeight),
+ _ => Vector2.zero
+ };
+
+ return runtimeSize * previewScale;
+ }
+
+ ///
+ /// 将当前 StoryData 的真实预览边界居中到可视区域。
+ /// 只修改 Inspector 的临时平移量,不会修改任何 Block 的 gridColumn / gridRow。
+ ///
+ private void FitPreviewView(Rect area, float previewScale)
+ {
+ if (blocks == null || blocks.Count == 0)
+ {
+ _previewPan = Vector2.zero;
+ return;
+ }
+
+ float stepX = RuntimeColumnStep * previewScale;
+ float stepY = RuntimeRowStep * previewScale;
+ float minX = float.PositiveInfinity;
+ float maxX = float.NegativeInfinity;
+ float minY = float.PositiveInfinity;
+ float maxY = float.NegativeInfinity;
+
+ foreach (StoryBlockDefinition block in blocks)
+ {
+ if (!HasPreviewableBlockId(block))
+ {
+ continue;
+ }
+
+ Vector2 size = GetPreviewBlockSize(block, previewScale);
+ float centerX = block.gridColumn * stepX;
+ float centerY = block.gridRow * stepY;
+ minX = Mathf.Min(minX, centerX - size.x * 0.5f);
+ maxX = Mathf.Max(maxX, centerX + size.x * 0.5f);
+ minY = Mathf.Min(minY, centerY - size.y * 0.5f);
+ maxY = Mathf.Max(maxY, centerY + size.y * 0.5f);
+ }
+
+ if (float.IsPositiveInfinity(minX))
+ {
+ _previewPan = Vector2.zero;
+ return;
+ }
+
+ // DrawStoryPreview 的初始原点位于左侧 Padding + 半个最大 Block 宽度;
+ // 此处只补偿该基础原点与内容包围盒中心之间的差值。
+ float baseOriginX = PreviewPaddingLeft + ImportantBlockWidth * previewScale * 0.5f;
+ _previewPan = new Vector2(
+ area.width * 0.5f - baseOriginX - (minX + maxX) * 0.5f,
+ -(minY + maxY) * 0.5f
+ );
+ }
+
+ ///
+ /// 根据可用高度选择预览标签密度。Song / Tutorial 的真实比例高度较小,
+ /// 因此只显示 Block ID,避免文字撑破矩形而掩盖实际体积关系。
+ ///
+ private static string GetPreviewLabel(StoryBlockDefinition block, bool simple, float blockHeight)
+ {
+ if (simple || blockHeight < 32f)
+ {
+ return block.blockId;
+ }
+
+ if (blockHeight < 60f)
+ {
+ return $"{block.blockId}\n[{block.blockType}]";
+ }
+
+ return $"{block.blockId}\n[{block.blockType}]\n{block.GetDisplayTitle()}";
+ }
+
+ ///
+ /// 处理预览区内的鼠标拖拽平移。
+ ///
+ private void HandlePreviewPanning(Rect area)
+ {
+ Event e = Event.current;
+ switch (e.type)
+ {
+ case EventType.MouseDown:
+ if (area.Contains(e.mousePosition))
+ {
+ _isPanningPreview = true;
+ e.Use();
+ }
+ break;
+ case EventType.MouseDrag:
+ if (_isPanningPreview)
+ {
+ _previewPan += e.delta;
+ GUI.changed = true;
+ e.Use();
+ }
+ break;
+ case EventType.MouseUp:
+ if (_isPanningPreview)
+ {
+ _isPanningPreview = false;
+ e.Use();
+ }
+ break;
+ }
+ }
+
+ ///
+ /// 判断 Block 能否参与 Inspector 中的故事树预览。
+ /// 新增 Block 时,Odin 会先创建一个尚未填写 blockId 的临时数据项;它还不能作为
+ /// Dictionary 的 Key,也不应在预览中显示或连接。统一在三个预览阶段过滤,避免后续
+ /// Draw / TryGetValue 阶段再次把空引用传入 Dictionary。
+ ///
+ private static bool HasPreviewableBlockId(StoryBlockDefinition block)
+ {
+ return block != null && !string.IsNullOrWhiteSpace(block.blockId);
+ }
+
+ ///
+ /// 预览中不同 block 类型的填充色。
+ ///
+ private static Color GetTypeColor(StoryBlockType type)
+ {
+ return type switch
+ {
+ StoryBlockType.Text => new Color(0.20f, 0.42f, 0.72f, 1f), // 蓝
+ StoryBlockType.Song => new Color(0.62f, 0.30f, 0.66f, 1f), // 紫
+ StoryBlockType.Tutorial => new Color(0.28f, 0.56f, 0.36f, 1f), // 绿
+ _ => new Color(0.4f, 0.4f, 0.4f, 1f)
+ };
+ }
+ }
+}
+#endif
+
+
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs.meta b/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs.meta
new file mode 100644
index 00000000..7553f786
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Data/StoryData.Editor.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 93a8de9ae74f4e8784af656377c443be
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryData.cs b/Assets/Scripts/NewStorySystem/Data/StoryData.cs
index 7e947394..a114c322 100644
--- a/Assets/Scripts/NewStorySystem/Data/StoryData.cs
+++ b/Assets/Scripts/NewStorySystem/Data/StoryData.cs
@@ -2,10 +2,6 @@ using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
using Yarn.Unity;
-#if UNITY_EDITOR
-using UnityEditor;
-using Sirenix.Utilities.Editor;
-#endif
namespace Ichni.Story
{
@@ -14,17 +10,30 @@ namespace Ichni.Story
/// 布局完全由每个 block 的 (gridColumn, gridRow) 静态决定,运行时全量展示。
///
[CreateAssetMenu(fileName = "StoryData", menuName = "Ichni/Story/New/StoryData")]
- public class StoryData : SerializedScriptableObject
+ public partial class StoryData : SerializedScriptableObject
{
+ [TitleGroup("Chapter Settings", Alignment = TitleAlignments.Centered)]
[LabelText("Chapter Index")]
+ [Tooltip("章节的稳定索引。StorySave、StoryManager 与 ChapterSelection 都以该值定位当前章节。")]
public string chapterIndex;
+ [TitleGroup("Chapter Settings")]
[LabelText("Yarn Project")]
- [InfoBox("该章节对应的 YarnProject 编译资产,阶段 2 接线。")]
+ [Tooltip("该章节对应的 YarnProject 编译资产。TextBlock 会在运行时从此项目中执行配置的 Yarn Node。")]
public YarnProject yarnProject;
+ ///
+ /// 本章节永久剧情变量的默认值。它们只属于本章节,且不会直接写入存档;
+ /// 玩家第一次通过 Yarn 或其它剧情入口写入同名变量后,存档值才会覆盖这里的默认值。
+ ///
+ [LabelText("Initial Variables")]
+ [ListDrawerSettings(ShowFoldout = true, DefaultExpandedState = false, DraggableItems = true, ShowItemCount = true)]
+ [Tooltip("变量 Key 使用小写英文、数字和下划线。Yarn 请通过 <> 与 get_*() 访问,不使用 <>、<> 或 $variable。")]
+ public List initialVariables = new List();
+
[LabelText("Blocks")]
[ListDrawerSettings(ShowFoldout = true, DefaultExpandedState = false, DraggableItems = true, ShowItemCount = true)]
+ [Tooltip("章节的完整剧情树定义。列表排序不决定运行时流程;连接关系、条件与网格坐标才是唯一依据。")]
public List blocks = new List();
///
@@ -34,9 +43,18 @@ namespace Ichni.Story
///
[LabelText("Timeline Markers")]
[ListDrawerSettings(ShowFoldout = true, DefaultExpandedState = false, DraggableItems = true, ShowItemCount = true)]
- [InfoBox("每个标记锚定到一个 TextBlock;运行时使用该 Block 的 Grid Column 对齐 Timeline。TextBlock 为 Current / Completed 时显示,Locked / Forbidden 时隐藏。未配置标记时,现有章节行为不变。")]
+ [Tooltip("每个标记锚定到一个 TextBlock;运行时使用该 Block 的 Grid Column 对齐 Timeline。TextBlock 为 Current / Completed 时显示,Locked / Forbidden 时隐藏。")]
public List timelineMarkers = new List();
+ ///
+ /// 仅供编辑器自检使用的互斥结局分组,不参与运行时的解锁、禁用或存档逻辑。
+ /// 实际路线禁用仍完全通过各 Block 的 Forbidden Condition 表达,以保留剧情变量组合的灵活性。
+ ///
+ [LabelText("Exclusive Route Groups")]
+ [ListDrawerSettings(ShowFoldout = true, DefaultExpandedState = false, DraggableItems = true, ShowItemCount = true)]
+ [Tooltip("把同一章节中只能同时达成一个的结局 Block 放入同一组。Validate Story Data 会检查引用、终点形态与 Forbidden Condition 配置;不会改变运行时逻辑。")]
+ public List exclusiveRouteGroups = new List();
+
// ── Queries ─────────────────────────────────────────────────────────────
///
@@ -46,13 +64,35 @@ namespace Ichni.Story
{
foreach (StoryBlockDefinition block in blocks)
{
- if (block.blockId == blockId)
+ if (block != null && block.blockId == blockId)
return block;
}
return null;
}
+ ///
+ /// 尝试获取一个章节变量的静态默认定义。重复 Key 取列表中第一项,
+ /// 因此配置时应保持 Key 唯一,以免在 Inspector 中产生歧义。
+ ///
+ public bool TryGetInitialVariable(string key, out StoryVariableDefinition definition)
+ {
+ if (!string.IsNullOrWhiteSpace(key) && initialVariables != null)
+ {
+ foreach (StoryVariableDefinition item in initialVariables)
+ {
+ if (item != null && item.key == key)
+ {
+ definition = item;
+ return true;
+ }
+ }
+ }
+
+ definition = null;
+ return false;
+ }
+
///
/// 获取指定 blockId 的所有直接后继 block 定义。
///
@@ -61,6 +101,9 @@ namespace Ichni.Story
StoryBlockDefinition source = GetBlock(blockId);
if (source == null) yield break;
+ if (source.nextBlockIds == null)
+ yield break;
+
foreach (string nextId in source.nextBlockIds)
{
StoryBlockDefinition next = GetBlock(nextId);
@@ -69,241 +112,5 @@ namespace Ichni.Story
}
}
- // ── Editor Preview ────────────────────────────────────────────────────────
-#if UNITY_EDITOR
- private enum StoryPreviewMode { Detailed, Simple }
-
- // 编辑器 UI 临时状态(不参与序列化)
- [System.NonSerialized] private StoryPreviewMode _previewMode = StoryPreviewMode.Detailed;
- [System.NonSerialized] private Vector2 _previewPan;
- [System.NonSerialized] private bool _isPanningPreview;
-
- private const float PreviewViewportHeight = 380f;
- private const float PreviewPaddingLeft = 24f;
-
- // 预览与运行时共用同一套“列 / 行代表 Block 中心点”的布局语义。
- // 这里的尺寸直接对应当前四种 Block Prefab 的设计尺寸;若未来修改 Prefab 尺寸,必须同步更新本组常量。
- private const float ImportantBlockWidth = 600f;
- private const float ImportantBlockHeight = 375f;
- private const float SecondaryBlockWidth = 400f;
- private const float SecondaryBlockHeight = 200f;
- private const float SongBlockWidth = 400f;
- private const float SongBlockHeight = 100f;
- private const float TutorialBlockWidth = 400f;
- private const float TutorialBlockHeight = 100f;
-
- // 与 StoryTreeController 默认 columnStep / rowStep 保持比例一致,
- // 因而预览中的相邻列、行间距也能反映运行时的实际布局关系。
- private const float RuntimeColumnStep = 720f;
- private const float RuntimeRowStep = 525f;
- private const float DetailedPreviewScale = 0.25f;
- private const float SimplePreviewScale = 0.10f;
-
- ///
- /// 在 Inspector 顶部绘制只读的故事树结构预览(流程图样式,连线左右相连)。
- /// 提供"详细 / 简略"两种可拖拽平移的视图;按 (gridColumn, gridRow) 摆放 block。
- /// 每个 Block 使用其运行时 Prefab 尺寸按统一比例缩放后的矩形,且列坐标始终代表 Block 的中心点,
- /// 从而让 Important / Secondary / Song / Tutorial 的体积与连线端点关系尽量接近游戏内画面。
- ///
- [PropertyOrder(-10)]
- [OnInspectorGUI]
- private void DrawStoryPreview()
- {
- SirenixEditorGUI.Title("Story Tree Preview", null, TextAlignment.Left, true);
-
- if (blocks == null || blocks.Count == 0)
- {
- EditorGUILayout.HelpBox("尚未定义任何 block。", MessageType.Info);
- return;
- }
-
- // 顶部工具条:模式切换 + 复位视图
- EditorGUILayout.BeginHorizontal();
- _previewMode = (StoryPreviewMode)GUILayout.Toolbar(
- (int)_previewMode, new[] { "Detailed", "Simple" }, GUILayout.Height(20f));
- if (GUILayout.Button("Reset View", GUILayout.Width(90f), GUILayout.Height(20f)))
- _previewPan = Vector2.zero;
- EditorGUILayout.EndHorizontal();
-
- bool simple = _previewMode == StoryPreviewMode.Simple;
- float previewScale = simple ? SimplePreviewScale : DetailedPreviewScale;
- float stepX = RuntimeColumnStep * previewScale;
- float stepY = RuntimeRowStep * previewScale;
-
- Rect area = GUILayoutUtility.GetRect(0f, PreviewViewportHeight, GUILayout.ExpandWidth(true));
- EditorGUI.DrawRect(area, new Color(0.12f, 0.12f, 0.14f, 1f));
-
- HandlePreviewPanning(area);
-
- // 裁剪到预览区,超出部分(平移后)不外溢到其它 Inspector 元素
- GUI.BeginClip(area);
- {
- // (0,0) 是 Block 的逻辑中心点。为避免第一列 Important Block 被左侧裁掉,
- // 初始视图预留半个最大 Block 宽度;这不改变 StoryData 的坐标语义。
- float originX = PreviewPaddingLeft + ImportantBlockWidth * previewScale * 0.5f + _previewPan.x;
- float originY = area.height * 0.5f + _previewPan.y;
-
- // 计算各 Block 的实际比例矩形。运行时同样以中心 Pivot 放置,因此 gridColumn / gridRow
- // 在预览中也对应矩形中心,而不是左边缘。
- Dictionary cellRects = new Dictionary();
- foreach (StoryBlockDefinition block in blocks)
- {
- if (!HasPreviewableBlockId(block)) continue;
-
- Vector2 blockSize = GetPreviewBlockSize(block, previewScale);
- float px = originX + block.gridColumn * stepX; // 列向右为正(可负、可小数)
- float py = originY + block.gridRow * stepY; // 行向下为正、向上为负
- cellRects[block.blockId] = new Rect(
- px - blockSize.x * 0.5f,
- py - blockSize.y * 0.5f,
- blockSize.x,
- blockSize.y);
- }
-
- // 先画连线:与 BlockConnectorView 相同,起点右中 → 以两个 Block 中心的中点列折线 → 终点左中。
- // 不使用端口中点作为转折列,避免不同宽度 Block 在同一列时出现不一致的转折位置。
- Handles.BeginGUI();
- foreach (StoryBlockDefinition block in blocks)
- {
- if (!HasPreviewableBlockId(block) || !cellRects.TryGetValue(block.blockId, out Rect fromRect)) continue;
-
- foreach (string nextId in block.nextBlockIds)
- {
- if (string.IsNullOrEmpty(nextId) || !cellRects.TryGetValue(nextId, out Rect toRect)) continue;
-
- Vector3 start = new Vector3(fromRect.xMax, fromRect.center.y, 0f);
- Vector3 end = new Vector3(toRect.xMin, toRect.center.y, 0f);
- float midX = (fromRect.center.x + toRect.center.x) * 0.5f;
- Vector3 mid1 = new Vector3(midX, start.y, 0f);
- Vector3 mid2 = new Vector3(midX, end.y, 0f);
-
- Handles.color = new Color(0.82f, 0.82f, 0.88f, 1f);
- Handles.DrawAAPolyLine(simple ? 2f : 3f, start, mid1, mid2, end);
- }
- }
- Handles.EndGUI();
-
- // 再画 block 方块
- GUIStyle labelStyle = new GUIStyle(EditorStyles.boldLabel)
- {
- alignment = TextAnchor.MiddleCenter,
- wordWrap = true,
- richText = false,
- fontSize = simple ? 9 : 11,
- normal = { textColor = Color.white }
- };
-
- foreach (StoryBlockDefinition block in blocks)
- {
- if (!HasPreviewableBlockId(block) || !cellRects.TryGetValue(block.blockId, out Rect rect)) continue;
-
- EditorGUI.DrawRect(rect, GetTypeColor(block.blockType));
- string label = GetPreviewLabel(block, simple, rect.height);
- GUI.Label(rect, label, labelStyle);
- }
- }
- GUI.EndClip();
-
- EditorGUILayout.HelpBox(
- "在预览区内拖拽可平移视图。列 = 水平(右为正),行 = 垂直(下为正、上为负);坐标代表 Block 中心点。预览按当前 Prefab 尺寸比例绘制:Important 600×375、Secondary 400×200、Song / Tutorial 400×100。",
- MessageType.None);
- }
-
- ///
- /// 返回一个 Block 在 Inspector 预览中的尺寸。所有类型使用同一缩放比例,
- /// 因而宽高比及不同 Block 之间的体积关系与运行时 Prefab 保持一致。
- ///
- private static Vector2 GetPreviewBlockSize(StoryBlockDefinition block, float previewScale)
- {
- Vector2 runtimeSize = block.blockType switch
- {
- StoryBlockType.Text when block.textImportance == TextBlockImportance.Important =>
- new Vector2(ImportantBlockWidth, ImportantBlockHeight),
- StoryBlockType.Text => new Vector2(SecondaryBlockWidth, SecondaryBlockHeight),
- StoryBlockType.Song => new Vector2(SongBlockWidth, SongBlockHeight),
- StoryBlockType.Tutorial => new Vector2(TutorialBlockWidth, TutorialBlockHeight),
- _ => Vector2.zero
- };
-
- return runtimeSize * previewScale;
- }
-
- ///
- /// 根据可用高度选择预览标签密度。Song / Tutorial 的真实比例高度较小,
- /// 因此只显示 Block ID,避免文字撑破矩形而掩盖实际体积关系。
- ///
- private static string GetPreviewLabel(StoryBlockDefinition block, bool simple, float blockHeight)
- {
- if (simple || blockHeight < 32f)
- {
- return block.blockId;
- }
-
- if (blockHeight < 60f)
- {
- return $"{block.blockId}\n[{block.blockType}]";
- }
-
- return $"{block.blockId}\n[{block.blockType}]\n{block.GetDisplayTitle()}";
- }
-
- ///
- /// 处理预览区内的鼠标拖拽平移。
- ///
- private void HandlePreviewPanning(Rect area)
- {
- Event e = Event.current;
- switch (e.type)
- {
- case EventType.MouseDown:
- if (area.Contains(e.mousePosition))
- {
- _isPanningPreview = true;
- e.Use();
- }
- break;
- case EventType.MouseDrag:
- if (_isPanningPreview)
- {
- _previewPan += e.delta;
- GUI.changed = true;
- e.Use();
- }
- break;
- case EventType.MouseUp:
- if (_isPanningPreview)
- {
- _isPanningPreview = false;
- e.Use();
- }
- break;
- }
- }
-
- ///
- /// 判断 Block 能否参与 Inspector 中的故事树预览。
- /// 新增 Block 时,Odin 会先创建一个尚未填写 blockId 的临时数据项;它还不能作为
- /// Dictionary 的 Key,也不应在预览中显示或连接。统一在三个预览阶段过滤,避免后续
- /// Draw / TryGetValue 阶段再次把空引用传入 Dictionary。
- ///
- private static bool HasPreviewableBlockId(StoryBlockDefinition block)
- {
- return block != null && !string.IsNullOrWhiteSpace(block.blockId);
- }
-
- ///
- /// 预览中不同 block 类型的填充色。
- ///
- private static Color GetTypeColor(StoryBlockType type)
- {
- return type switch
- {
- StoryBlockType.Text => new Color(0.20f, 0.42f, 0.72f, 1f), // 蓝
- StoryBlockType.Song => new Color(0.62f, 0.30f, 0.66f, 1f), // 紫
- StoryBlockType.Tutorial => new Color(0.28f, 0.56f, 0.36f, 1f), // 绿
- _ => new Color(0.4f, 0.4f, 0.4f, 1f)
- };
- }
-#endif
}
}
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryHelperData.cs b/Assets/Scripts/NewStorySystem/Data/StoryHelperData.cs
index f218a9a0..2ccfd7ba 100644
--- a/Assets/Scripts/NewStorySystem/Data/StoryHelperData.cs
+++ b/Assets/Scripts/NewStorySystem/Data/StoryHelperData.cs
@@ -2,6 +2,8 @@ using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
+using UnityEngine.Localization;
+using UnityEngine.Localization.Tables;
namespace Ichni.Story
{
@@ -10,21 +12,47 @@ namespace Ichni.Story
/// 该资产不隶属于任何 StoryData,由 统一引用,
/// 因而所有章节都共用同一个 Helper 角色、名称和候选对话池。
/// 运行时会在满足条件的候选中按权重抽取,并在候选数量允许时避免与上次对话重复;
- /// 具体抽取和 UI 展示逻辑将在 Helper 功能实现阶段接入。
+ /// 具体抽取和 UI 展示由 负责。
///
[CreateAssetMenu(fileName = "StoryHelperData", menuName = "Ichni/Story/New/Story Helper Data")]
public class StoryHelperData : SerializedScriptableObject
{
+ ///
+ /// Helper 的稳定身份标识。当前阶段只有一个 Helper,但后续的更换界面、存档和统计
+ /// 都应使用该 ID,而非依赖可变的资源名称或显示名称。
+ ///
+ [LabelText("Helper ID")]
+ [Tooltip("使用小写英文、数字和下划线,例如 chapter0_helper。未来切换与持久化 Helper 时使用此稳定 ID。")]
+ public string helperId;
+
+ ///
+ /// 当前静态版本使用的立绘。留空时,静态 Presenter 会保留场景中原本配置的 Image,
+ /// 因而可以在不立即迁移全部美术引用的情况下逐步接入本数据资产。
+ ///
+ [PreviewField(75, ObjectFieldAlignment.Left)]
+ [LabelText("Portrait Sprite")]
+ [Tooltip("当前静态 Helper 立绘。未来改用 Spine 或 Live2D 时,可由对应 Presenter 忽略该字段。")]
+ public Sprite portraitSprite;
+
+ ///
+ /// Helper 名称与对话文本所使用的 Unity Localization String Table。
+ ///
+ [LabelText("Localization Table")]
+ [Tooltip("Display Name Key、Fallback Dialogue Key 与 Dialogue Pool 的 Text Key 均在此 String Table 中查找。")]
+ public TableReference localizationTable;
+
///
/// Helper 显示名称的 Unity Localization Entry Key。
///
[LabelText("Display Name Key (Localization)")]
+ [Tooltip("Helper 显示名称使用的 Unity Localization Entry Key。")]
public string displayNameKey;
///
/// 当所有候选对话均不满足条件时显示的兜底对话 Entry Key。
///
[LabelText("Fallback Dialogue Key (Localization)")]
+ [Tooltip("没有候选对话满足条件时显示的 Unity Localization Entry Key。")]
public string fallbackDialogueKey;
///
@@ -32,6 +60,7 @@ namespace Ichni.Story
///
[LabelText("Dialogue Pool")]
[ListDrawerSettings(ShowFoldout = true, DefaultExpandedState = false, DraggableItems = true, ShowItemCount = true)]
+ [Tooltip("全章节共用的候选 Helper 对话。条件留空时该项始终可参与按权重抽取。")]
public List dialoguePool = new List();
}
@@ -42,25 +71,33 @@ namespace Ichni.Story
///
[Serializable]
[InlineProperty]
+ [HideReferenceObjectPicker]
public class StoryHelperDialogueDefinition
{
///
/// 候选对话的稳定 ID,仅用于调试、去重和未来数据追踪。
/// 命名使用小写英文、数字和下划线,例如 general_greeting_01。
///
- [LabelText("Dialogue ID")]
+ [HorizontalGroup("Identity", 0.38f)]
+ [LabelText("ID")]
+ [LabelWidth(20)]
+ [Tooltip("候选对话的稳定 ID,仅用于调试、去重和未来数据追踪。")]
public string dialogueId;
///
/// 实际显示内容的 Unity Localization Entry Key。
///
- [LabelText("Dialogue Key (Localization)")]
+ [HorizontalGroup("Identity")]
+ [LabelText("Text Key")]
+ [LabelWidth(52)]
+ [Tooltip("实际显示文本的 Unity Localization Entry Key。")]
public string dialogueKey;
///
/// 此对话可被抽取的条件;留空表示始终可用。
///
- [LabelText("Availability Condition")]
+ [LabelText("Availability")]
+ [Tooltip("此候选对话可参与抽取的条件;留空表示始终可用。")]
public StoryCondition availabilityCondition = new StoryCondition();
///
@@ -69,6 +106,7 @@ namespace Ichni.Story
///
[LabelText("Weight")]
[MinValue(1)]
+ [Tooltip("在满足条件的候选中使用的相对抽取权重,最小为 1。")]
public int weight = 1;
}
}
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryRouteValidationGroup.cs b/Assets/Scripts/NewStorySystem/Data/StoryRouteValidationGroup.cs
new file mode 100644
index 00000000..cd5ed2f6
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Data/StoryRouteValidationGroup.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using Sirenix.OdinInspector;
+using UnityEngine;
+
+namespace Ichni.Story
+{
+ ///
+ /// StoryData 编辑期的互斥路线声明。
+ /// 本类不会参与运行时条件求值:路线的开放与禁用仍只由 StoryBlockDefinition 中的
+ /// Unlock Condition / Forbidden Condition 控制。它的唯一职责是让 Validate Story Data 能够
+ /// 对“多个结局只能完成一个”的人工配置意图进行可定位检查。
+ ///
+ [Serializable]
+ [InlineProperty]
+ [HideReferenceObjectPicker]
+ public class StoryRouteValidationGroup
+ {
+ [HorizontalGroup("Identity", 0.34f)]
+ [LabelText("Group ID")]
+ [LabelWidth(58)]
+ [Tooltip("仅用于编辑器验证与日志定位的稳定 ID。使用小写英文、数字和下划线,例如 chapter0_ending。")]
+ public string groupId;
+
+ [HorizontalGroup("Identity")]
+ [LabelText("Terminal Blocks")]
+ [Tooltip("同一互斥结局组中的终点 Block ID。Validate Story Data 会检查它们是否存在、是否重复、是否为图终点,以及是否配置 Forbidden Condition。")]
+ public List terminalBlockIds = new List();
+ }
+}
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryRouteValidationGroup.cs.meta b/Assets/Scripts/NewStorySystem/Data/StoryRouteValidationGroup.cs.meta
new file mode 100644
index 00000000..e1b7580b
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Data/StoryRouteValidationGroup.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 4c6fe8ac7f9f4efba5df1c7a7c52b3e1
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryTimelineMarkerDefinition.cs b/Assets/Scripts/NewStorySystem/Data/StoryTimelineMarkerDefinition.cs
index 883c1190..55ca2935 100644
--- a/Assets/Scripts/NewStorySystem/Data/StoryTimelineMarkerDefinition.cs
+++ b/Assets/Scripts/NewStorySystem/Data/StoryTimelineMarkerDefinition.cs
@@ -13,40 +13,56 @@ namespace Ichni.Story
///
[Serializable]
[InlineProperty]
+ [HideReferenceObjectPicker]
public class StoryTimelineMarkerDefinition
{
///
/// 标记的稳定唯一 ID,仅用于配置、调试和未来持久化引用。
/// 命名使用小写英文、数字和下划线,例如 chapter0_day_01。
///
+ [HorizontalGroup("Identity", 0.34f)]
[LabelText("Marker ID")]
+ [LabelWidth(62)]
+ [Tooltip("Marker 的稳定唯一 ID。回滚快照会使用它作为索引;建议使用小写英文、数字和下划线。")]
public string markerId;
///
/// 被此标记锚定的 TextBlock ID。该 Block 的 gridColumn 是标记的唯一位置来源;
/// 当它处于 Current 或 Completed 时,标记显示;Locked 或 Forbidden 时,标记隐藏。
///
- [LabelText("Anchor Block ID")]
+ [HorizontalGroup("Identity", 0.33f)]
+ [LabelText("Anchor")]
+ [LabelWidth(42)]
+ [Tooltip("被此 Marker 锚定的 TextBlock ID。该 Block 的列位置决定 Marker 的横坐标。")]
public string anchorBlockId;
///
/// Timeline 上显示的本地化文本 Key。通常用于时间描述,也可用于特殊叙事文本。
///
- [LabelText("Label Key (Localization)")]
+ [HorizontalGroup("Identity")]
+ [LabelText("Label Key")]
+ [LabelWidth(54)]
+ [Tooltip("Timeline 上显示的 Unity Localization Entry Key,通常用于时间或特殊叙事文本。")]
public string labelKey;
///
/// 是否参与章节主线进度百分比计算。支线或纯装饰性时间标记应关闭此项。
///
- [LabelText("Contributes To Main Progress")]
+ [HorizontalGroup("Progress", 0.42f)]
+ [LabelText("Main Progress")]
+ [Tooltip("开启后,此 Marker 完成时会参与章节主线进度百分比的最大值计算。")]
public bool contributesToMainProgress = true;
///
/// 锚定 Block 完成后可贡献的主线进度,范围为 0 到 1。
/// 同一章节的不同结局都应配置为 1;运行时取所有有效完成标记中的最大值。
///
- [LabelText("Progress Value")]
+ [HorizontalGroup("Progress")]
+ [LabelText("Value")]
+ [LabelWidth(35)]
+ [ShowIf(nameof(contributesToMainProgress))]
[Range(0f, 1f)]
+ [Tooltip("完成该锚定 Block 后贡献的主线进度,范围为 0 到 1。互斥结局通常都设为 1。")]
public float progressValue;
}
}
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryVariableDefinition.cs b/Assets/Scripts/NewStorySystem/Data/StoryVariableDefinition.cs
new file mode 100644
index 00000000..d7ba9b8b
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Data/StoryVariableDefinition.cs
@@ -0,0 +1,74 @@
+using System;
+using Sirenix.OdinInspector;
+using UnityEngine;
+
+namespace Ichni.Story
+{
+ ///
+ /// StoryData 中声明的章节变量默认值类型。
+ /// 数值变量会保存为 float;Int 仅决定 Inspector 和读取接口的语义。
+ ///
+ public enum StoryVariableType
+ {
+ Bool,
+ Int,
+ Float,
+ String
+ }
+
+ ///
+ /// 一个章节变量的静态默认定义。
+ /// 默认值不写入玩家存档:当存档中没有同名覆盖值时,StoryVariables 才返回此处的配置。
+ /// 因此“重开章节”只要清空章节变量容器,便会自然回到该定义的初始状态。
+ ///
+ [Serializable]
+ [InlineProperty]
+ [HideReferenceObjectPicker]
+ public class StoryVariableDefinition
+ {
+ [HorizontalGroup("Variable", 0.55f)]
+ [LabelText("Key")]
+ [LabelWidth(28)]
+ [Tooltip("变量 Key:使用小写英文、数字和下划线,例如 c0_route_choice。不要使用 Yarn 的 $variable 语法。")]
+ public string key;
+
+ [HorizontalGroup("Variable", 0.18f)]
+ [LabelText("Type")]
+ [LabelWidth(32)]
+ [Tooltip("变量的默认值类型。运行时可由 Yarn 的 set_* 指令写入同名永久章节变量。")]
+ public StoryVariableType type;
+
+ [HorizontalGroup("Variable")]
+ [LabelText("Default")]
+ [LabelWidth(48)]
+ [ShowIf(nameof(IsBool))]
+ [Tooltip("变量尚未被玩家存档覆盖时使用的默认 Bool 值。")]
+ public bool boolValue;
+
+ [HorizontalGroup("Variable")]
+ [LabelText("Default")]
+ [LabelWidth(48)]
+ [ShowIf(nameof(IsInt))]
+ [Tooltip("变量尚未被玩家存档覆盖时使用的默认 Int 值。")]
+ public int intValue;
+
+ [HorizontalGroup("Variable")]
+ [LabelText("Default")]
+ [LabelWidth(48)]
+ [ShowIf(nameof(IsFloat))]
+ [Tooltip("变量尚未被玩家存档覆盖时使用的默认 Float 值。")]
+ public float floatValue;
+
+ [HorizontalGroup("Variable")]
+ [LabelText("Default")]
+ [LabelWidth(48)]
+ [ShowIf(nameof(IsString))]
+ [Tooltip("变量尚未被玩家存档覆盖时使用的默认 String 值。")]
+ public string stringValue;
+
+ private bool IsBool() => type == StoryVariableType.Bool;
+ private bool IsInt() => type == StoryVariableType.Int;
+ private bool IsFloat() => type == StoryVariableType.Float;
+ private bool IsString() => type == StoryVariableType.String;
+ }
+}
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryVariableDefinition.cs.meta b/Assets/Scripts/NewStorySystem/Data/StoryVariableDefinition.cs.meta
new file mode 100644
index 00000000..c272e1d5
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Data/StoryVariableDefinition.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 8d61a59c6d4a423aae2e04ae3dac5b1a
diff --git a/Assets/Scripts/NewStorySystem/Data/StoryVariables.cs b/Assets/Scripts/NewStorySystem/Data/StoryVariables.cs
index 5b6a1f46..551875e5 100644
--- a/Assets/Scripts/NewStorySystem/Data/StoryVariables.cs
+++ b/Assets/Scripts/NewStorySystem/Data/StoryVariables.cs
@@ -5,9 +5,9 @@ using UnityEngine;
namespace Ichni.Story
{
///
- /// 全局剧情变量的统一数据枢纽。
+ /// 当前章节剧情变量的统一数据枢纽。
/// 所有外部系统(包括 Yarn、UI、小游戏)读写剧情变量的唯一官方入口。
- /// 自动桥接至 GameSaveManager 的 StorySaveModule 中持久化。
+ /// 自动桥接至 GameSaveManager 的 StorySaveModule 中当前章节的持久化容器。
///
public static class StoryVariables
{
@@ -19,7 +19,7 @@ namespace Ichni.Story
get
{
if (GameSaveManager.instance != null && GameSaveManager.instance.StorySaveModule != null)
- return GameSaveManager.instance.StorySaveModule.variables;
+ return GameSaveManager.instance.StorySaveModule.GetActiveChapterVariables();
return _fallback;
}
}
@@ -32,6 +32,17 @@ namespace Ichni.Story
if (vars.floatVariables.TryGetValue(key, out float f)) return f;
if (vars.boolVariables.TryGetValue(key, out bool b)) return b ? 1f : 0f;
if (vars.stringVariables.TryGetValue(key, out string s) && float.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out float p)) return p;
+ if (TryGetInitialVariable(key, out StoryVariableDefinition definition))
+ {
+ return definition.type switch
+ {
+ StoryVariableType.Bool => definition.boolValue ? 1f : 0f,
+ StoryVariableType.Int => definition.intValue,
+ StoryVariableType.Float => definition.floatValue,
+ StoryVariableType.String when float.TryParse(definition.stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out float parsed) => parsed,
+ _ => defaultValue
+ };
+ }
return defaultValue;
}
@@ -41,6 +52,17 @@ namespace Ichni.Story
if (vars.floatVariables.TryGetValue(key, out float f)) return Mathf.RoundToInt(f);
if (vars.boolVariables.TryGetValue(key, out bool b)) return b ? 1 : 0;
if (vars.stringVariables.TryGetValue(key, out string s) && float.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out float p)) return Mathf.RoundToInt(p);
+ if (TryGetInitialVariable(key, out StoryVariableDefinition definition))
+ {
+ return definition.type switch
+ {
+ StoryVariableType.Bool => definition.boolValue ? 1 : 0,
+ StoryVariableType.Int => definition.intValue,
+ StoryVariableType.Float => Mathf.RoundToInt(definition.floatValue),
+ StoryVariableType.String when float.TryParse(definition.stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out float parsed) => Mathf.RoundToInt(parsed),
+ _ => defaultValue
+ };
+ }
return defaultValue;
}
@@ -50,6 +72,17 @@ namespace Ichni.Story
if (vars.boolVariables.TryGetValue(key, out bool b)) return b;
if (vars.floatVariables.TryGetValue(key, out float f)) return f != 0f;
if (vars.stringVariables.TryGetValue(key, out string s) && bool.TryParse(s, out bool p)) return p;
+ if (TryGetInitialVariable(key, out StoryVariableDefinition definition))
+ {
+ return definition.type switch
+ {
+ StoryVariableType.Bool => definition.boolValue,
+ StoryVariableType.Int => definition.intValue != 0,
+ StoryVariableType.Float => !Mathf.Approximately(definition.floatValue, 0f),
+ StoryVariableType.String when bool.TryParse(definition.stringValue, out bool parsed) => parsed,
+ _ => defaultValue
+ };
+ }
return defaultValue;
}
@@ -59,13 +92,25 @@ namespace Ichni.Story
if (vars.stringVariables.TryGetValue(key, out string s)) return s;
if (vars.floatVariables.TryGetValue(key, out float f)) return f.ToString(CultureInfo.InvariantCulture);
if (vars.boolVariables.TryGetValue(key, out bool b)) return b.ToString();
+ if (TryGetInitialVariable(key, out StoryVariableDefinition definition))
+ {
+ return definition.type switch
+ {
+ StoryVariableType.Bool => definition.boolValue.ToString(),
+ StoryVariableType.Int => definition.intValue.ToString(CultureInfo.InvariantCulture),
+ StoryVariableType.Float => definition.floatValue.ToString(CultureInfo.InvariantCulture),
+ StoryVariableType.String => definition.stringValue ?? string.Empty,
+ _ => defaultValue
+ };
+ }
return defaultValue;
}
public static bool HasVariable(string key)
{
StoryVariablesSave vars = Variables;
- return vars.floatVariables.ContainsKey(key) || vars.boolVariables.ContainsKey(key) || vars.stringVariables.ContainsKey(key);
+ return vars.floatVariables.ContainsKey(key) || vars.boolVariables.ContainsKey(key) || vars.stringVariables.ContainsKey(key) ||
+ TryGetInitialVariable(key, out _);
}
// ── 写入 ────────────────────────────────────────────────────────────────
@@ -124,6 +169,20 @@ namespace Ichni.Story
if (!keepBool) vars.boolVariables.Remove(name);
}
+ ///
+ /// 从当前 StoryTree 的 StoryData 查询变量默认值。没有章节上下文时不虚构默认值,
+ /// 由调用方传入的 defaultValue 作为独立测试场景的回退。
+ ///
+ private static bool TryGetInitialVariable(string key, out StoryVariableDefinition definition)
+ {
+ StoryData storyData = StoryManager.instance?.treeController?.ActiveStoryData;
+ if (storyData != null)
+ return storyData.TryGetInitialVariable(key, out definition);
+
+ definition = null;
+ return false;
+ }
+
// ── 字典批量操作(内部供 Yarn Adapter 使用) ─────────────────────────────
internal static void SetAllVariables(Dictionary floats, Dictionary strings, Dictionary bools, bool clear = true)
diff --git a/Assets/Scripts/NewStorySystem/Dialogue/ConsoleLinePresenter.cs b/Assets/Scripts/NewStorySystem/Dialogue/ConsoleLinePresenter.cs
index 5a82624d..86d8a3ba 100644
--- a/Assets/Scripts/NewStorySystem/Dialogue/ConsoleLinePresenter.cs
+++ b/Assets/Scripts/NewStorySystem/Dialogue/ConsoleLinePresenter.cs
@@ -7,7 +7,7 @@ namespace Ichni.Story.Dialogue
/// 【临时 / 调试用】将 Yarn 对话行以"本地化后的文本"输出到 Console 的呈现器。
/// 用途:在没有 VN 对话 UI 的情况下,验证整条 Yarn 管线是否跑通,以及
/// Unity Localization 是否正确返回当前语言的文本(点击文本块即可在 Console 看到结果)。
- /// 阶段 3 接入 VNDialoguePresenter 后,可从 DialogueRunner 的呈现器列表移除本组件并删除此脚本。
+ /// 正式运行使用 VNDialoguePresenter;本组件只应在需要观察本地化解析结果时临时启用。
///
public class ConsoleLinePresenter : DialoguePresenterBase
{
diff --git a/Assets/Scripts/NewStorySystem/Dialogue/DialogueHistory.cs b/Assets/Scripts/NewStorySystem/Dialogue/DialogueHistory.cs
new file mode 100644
index 00000000..cfab7caa
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Dialogue/DialogueHistory.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+
+namespace Ichni.Story.Dialogue
+{
+ /// 对话记录中一条已经实际显示或采用的内容。
+ [Serializable]
+ public sealed class DialogueHistoryEntry
+ {
+ public string speakerName;
+ public string content;
+ public bool isChoice;
+ }
+
+ ///
+ /// 当前一次 TextBlock 对话专用的临时记录。
+ /// 记录不会写入 ES3;开始下一次对话、正常结束或点击 Back 取消时都会清空,
+ /// 因而它只承担 DialogUIPage 内的“本次对话回顾”职责。
+ ///
+ public static class DialogueHistory
+ {
+ private static readonly List EntriesInternal = new();
+
+ public static IReadOnlyList Entries => EntriesInternal;
+
+ public static void BeginSession() => EntriesInternal.Clear();
+
+ public static void AddLine(string speakerName, string content)
+ {
+ if (string.IsNullOrWhiteSpace(content))
+ return;
+
+ EntriesInternal.Add(new DialogueHistoryEntry
+ {
+ speakerName = speakerName ?? string.Empty,
+ content = content,
+ isChoice = false
+ });
+ }
+
+ public static void AddChoice(string content)
+ {
+ if (string.IsNullOrWhiteSpace(content))
+ return;
+
+ EntriesInternal.Add(new DialogueHistoryEntry
+ {
+ speakerName = string.Empty,
+ content = content,
+ isChoice = true
+ });
+ }
+
+ public static void Clear() => EntriesInternal.Clear();
+ }
+}
diff --git a/Assets/Scripts/NewStorySystem/Dialogue/DialogueHistory.cs.meta b/Assets/Scripts/NewStorySystem/Dialogue/DialogueHistory.cs.meta
new file mode 100644
index 00000000..c7cdbe38
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Dialogue/DialogueHistory.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: fd7c83e0353e4fb7b912fb9996f64738
diff --git a/Assets/Scripts/NewStorySystem/Dialogue/StoryChoiceMemory.cs b/Assets/Scripts/NewStorySystem/Dialogue/StoryChoiceMemory.cs
new file mode 100644
index 00000000..3a33452b
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Dialogue/StoryChoiceMemory.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Linq;
+using Yarn.Unity;
+
+namespace Ichni.Story.Dialogue
+{
+ ///
+ /// Yarn 选项的章节内记忆服务。
+ /// 玩家第一次完成某组选项后,保存其 ;再次进入同一 TextBlock 时,
+ /// 若该选项仍存在且可用,则不显示选择 UI,直接返回该 Option 给 Yarn。
+ /// 记录随 Timeline 回滚快照一起恢复,因此回滚到选项之前会让玩家重新选择。
+ ///
+ public static class StoryChoiceMemory
+ {
+ ///
+ /// 根据来源 Block 与当前全部 Option Text ID 生成选项组 Key。
+ /// Text ID 已由 Yarn 编译结果稳定生成;排序使纯显示顺序调整不会把同一组选项误认为新选项组。
+ ///
+ public static string CreateChoiceKey(string sourceBlockId, DialogueOption[] options)
+ {
+ if (string.IsNullOrWhiteSpace(sourceBlockId) || options == null || options.Length == 0 ||
+ options.Any(option => option == null || string.IsNullOrWhiteSpace(option.TextID)))
+ {
+ return null;
+ }
+
+ string optionSignature = string.Join("|", options
+ .Select(option => option.TextID)
+ .OrderBy(textId => textId, StringComparer.Ordinal));
+ return sourceBlockId + "::" + optionSignature;
+ }
+
+ ///
+ /// 查找已保存的选项。若 Yarn 改稿后旧 Text ID 已不存在或暂时不可用,
+ /// 会删除陈旧记录并回退为普通选择界面,避免自动选择错误路线。
+ ///
+ public static bool TryGetRememberedOption(string sourceBlockId, DialogueOption[] options,
+ out DialogueOption rememberedOption)
+ {
+ rememberedOption = null;
+ StoryTreeController treeController = StoryManager.instance?.treeController;
+ StorySaveModule saveModule = GameSaveManager.instance?.StorySaveModule;
+ string choiceKey = CreateChoiceKey(sourceBlockId, options);
+ if (treeController == null || saveModule == null || string.IsNullOrEmpty(treeController.ActiveChapterIndex) ||
+ string.IsNullOrEmpty(choiceKey))
+ {
+ return false;
+ }
+
+ if (!saveModule.TryGetChoice(treeController.ActiveChapterIndex, choiceKey, out StoryChoiceRecord record))
+ return false;
+
+ rememberedOption = options.FirstOrDefault(option => option != null && option.IsAvailable &&
+ option.TextID == record.selectedOptionTextId);
+ if (rememberedOption != null)
+ return true;
+
+ saveModule.RemoveChoice(treeController.ActiveChapterIndex, choiceKey);
+ return false;
+ }
+
+ ///
+ /// 保存玩家首次确认的选项。调用时先捕获所属 Block 的 Marker 快照,
+ /// 保证该选项及其随后写入的路线变量都能被重开流程一起回滚。
+ ///
+ public static void RememberChoice(string sourceBlockId, DialogueOption[] options, DialogueOption selectedOption)
+ {
+ StoryTreeController treeController = StoryManager.instance?.treeController;
+ StorySaveModule saveModule = GameSaveManager.instance?.StorySaveModule;
+ string choiceKey = CreateChoiceKey(sourceBlockId, options);
+ if (treeController == null || saveModule == null || selectedOption == null ||
+ string.IsNullOrEmpty(treeController.ActiveChapterIndex) || string.IsNullOrEmpty(choiceKey))
+ {
+ return;
+ }
+
+ StoryProgress.TryCaptureActiveBlockSnapshot();
+ saveModule.SetChoice(treeController.ActiveChapterIndex, new StoryChoiceRecord
+ {
+ sourceBlockId = sourceBlockId,
+ choiceKey = choiceKey,
+ selectedOptionTextId = selectedOption.TextID
+ });
+ }
+ }
+}
diff --git a/Assets/Scripts/NewStorySystem/Dialogue/StoryChoiceMemory.cs.meta b/Assets/Scripts/NewStorySystem/Dialogue/StoryChoiceMemory.cs.meta
new file mode 100644
index 00000000..749d1f10
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Dialogue/StoryChoiceMemory.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: d73ac4c0c2034a04a7e701a64a3f8dd9
diff --git a/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs b/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs
index 31242515..673c1830 100644
--- a/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs
+++ b/Assets/Scripts/NewStorySystem/Dialogue/StoryDialogueController.cs
@@ -3,6 +3,7 @@ using System.Reflection;
using Ichni.Story.UI;
using UnityEngine;
using UnityEngine.Events;
+using UnityEngine.Localization;
using Yarn.Unity;
using Yarn.Unity.UnityLocalization;
@@ -11,7 +12,7 @@ namespace Ichni.Story.Dialogue
///
/// 故事树 block 与 Yarn 之间的桥接控制器。
/// 点击文本块 → 启动对应 Yarn 节点;对话结束 → 持久化剧情变量、标记 block 完成、
- /// 重算解锁并存档、依次执行结束回调(如歌曲解锁提示,阶段 4 使用)。
+ /// 重算解锁并存档、依次执行结束回调(例如歌曲解锁提示)。
///
public class StoryDialogueController : MonoBehaviour
{
@@ -24,21 +25,66 @@ namespace Ichni.Story.Dialogue
[Tooltip("故事树页面:对话进行时淡出、结束后淡入(可选)。")]
public StoryUIPage storyUIPage;
+ [Header("Localization")]
+ [Tooltip("所有章节 Yarn 台词共用的 Unity Localization String Table(建议命名 YarnLines)。留空时保留当前 UnityLocalisedLineProvider 的既有表配置。")]
+ public LocalizedStringTable yarnLinesTable;
+
///
- /// 对话结束后依次执行并清空的回调队列。供 unlock_song 等 Yarn 命令(阶段 4)
+ /// 对话结束后依次执行并清空的回调队列。供 unlock_song 等 Yarn 命令
/// 把"解锁提示"排队到对话结束后弹出。
///
- [System.NonSerialized] public List dialogueEndActions = new List();
+ private readonly List _dialogueEndActions = new List();
// 当前正在播放对话的 block id;对话结束时据此标记完成
private string _activeBlockId;
+ // 当前 TextBlock 开始前的章节快照。它只服务于本次“中途退出对话”的恢复,
+ // 不会被写入 ES3,也不会影响歌曲成绩、解锁 Key、Settings 或其它章节。
+ private ChapterStorySave _activeDialogueSnapshot;
+ private string _activeDialogueChapterIndex;
+ private bool _isCancellingDialogue;
+
+ ///
+ /// 当前对话对应的 TextBlock ID。Yarn 选项记忆与变量指令使用它定位所属章节 Block,
+ /// 不应由其它系统直接赋值。
+ ///
+ public string ActiveBlockId => _activeBlockId;
+
+ ///
+ /// 当前是否存在尚未提交的 TextBlock 对话事务。
+ /// Yarn 的全局副作用(例如 grant_unlock、unlock_song、show_message)必须据此决定延迟到正常结束后执行,
+ /// 从而避免玩家按 Back 时留下已解锁内容或孤立弹窗。
+ ///
+ public bool IsDialogueTransactionActive =>
+ !string.IsNullOrEmpty(_activeBlockId) &&
+ GameSaveManager.instance?.StorySaveModule?.IsChapterTransactionActive(_activeDialogueChapterIndex) == true;
+
private void Awake()
{
instance = this;
EnsureUnityLocalisedLineProvider();
}
+ private void Start()
+ {
+ // 这些引用不会由 StoryData 自检覆盖,因为它们属于场景运行时装配而非单个章节资产。
+ // 仅输出可定位 Warning,不阻断编辑器下的部分独立测试流程。
+ if (dialogueRunner == null)
+ {
+ Debug.LogWarning("[StoryDialogueController] 未配置 DialogueRunner;TextBlock 无法启动对话。", this);
+ return;
+ }
+
+ if (dialogueRunner.GetComponent() == null)
+ Debug.LogWarning("[StoryDialogueController] DialogueRunner 缺少 VNDialoguePresenter;台词和选项不会显示。", dialogueRunner);
+
+ if (dialogueRunner.GetComponent() == null)
+ Debug.LogWarning("[StoryDialogueController] DialogueRunner 缺少 UnityLocalisedLineProvider;本地化台词无法解析。", dialogueRunner);
+
+ if (storyUIPage == null)
+ Debug.LogWarning("[StoryDialogueController] 未配置 StoryUIPage;对话开始/结束时不会切换剧情树页面。", this);
+ }
+
private void OnEnable()
{
if (dialogueRunner != null && dialogueRunner.onDialogueComplete != null)
@@ -51,6 +97,12 @@ namespace Ichni.Story.Dialogue
dialogueRunner.onDialogueComplete.RemoveListener(HandleDialogueComplete);
}
+ private void OnDestroy()
+ {
+ if (instance == this)
+ instance = null;
+ }
+
///
/// 播放某文本块对应的 Yarn 节点。若对话已在进行、引用缺失或节点名为空则忽略。
///
@@ -79,13 +131,106 @@ namespace Ichni.Story.Dialogue
// 将 DialogueRunner 的 YarnProject 对齐到当前章节(支持多章节共用一个 Runner)
EnsureProjectForCurrentChapter();
+ // StartDialogue 对缺失 Node 只会在内部抛出/记录错误;必须在开启事务前预检,
+ // 否则会留下一个没有机会提交或回滚的半开事务。
+ if (dialogueRunner.YarnProject?.Program == null ||
+ !dialogueRunner.YarnProject.Program.Nodes.ContainsKey(block.YarnNodeName))
+ {
+ Debug.LogError($"[StoryDialogueController] Yarn Project 中不存在节点 '{block.YarnNodeName}',已取消启动 Block '{block.blockId}'。", dialogueRunner);
+ return;
+ }
+
+ StoryTreeController treeController = StoryManager.instance?.treeController;
+ StorySaveModule saveModule = GameSaveManager.instance?.StorySaveModule;
+ string chapterIndex = treeController?.ActiveChapterIndex;
+ if (treeController == null || saveModule == null || string.IsNullOrEmpty(chapterIndex))
+ {
+ Debug.LogError("[StoryDialogueController] 当前章节存档上下文未就绪,拒绝开始可回滚的 TextBlock 对话。");
+ return;
+ }
+
+ // 必须在任何 Yarn 命令、选项或 Marker 快照写入前完成复制并开启事务。
+ // 事务期间所有剧情变化仅停留在内存;正常结束才提交,中途 Back 则完整恢复本副本。
+ _activeDialogueSnapshot = StorySaveCloneUtility.CloneChapter(saveModule.GetChapter(chapterIndex));
+ _activeDialogueChapterIndex = chapterIndex;
+ if (!saveModule.BeginChapterTransaction(chapterIndex))
+ {
+ _activeDialogueSnapshot = null;
+ _activeDialogueChapterIndex = null;
+ return;
+ }
+
_activeBlockId = block.blockId;
+ // 在 Yarn 命令或选项改变章节变量前先登记来源,并为 Marker 所在列创建快照。
+ StoryProgress.BeginBlockMutation(_activeBlockId);
if (storyUIPage != null)
storyUIPage.FadeOut();
- // StartDialogue 返回 YarnTask;此处即发即忘,完成由 onDialogueComplete 处理
- dialogueRunner.StartDialogue(block.YarnNodeName).Forget();
+ // 启动异常会回滚本次章节事务;正常结束仍由 onDialogueComplete 统一提交。
+ StartDialogueSafely(block.YarnNodeName).Forget();
+ }
+
+ ///
+ /// 以受保护方式启动 Yarn。缺失 Provider、Presenter 等启动级异常不应让 StorySave 的事务永久处于活动状态,
+ /// 因而会被转换为 Failed 流程并完整恢复进入对话前的章节快照。
+ ///
+ private async YarnTask StartDialogueSafely(string yarnNodeName)
+ {
+ try
+ {
+ await dialogueRunner.StartDialogue(yarnNodeName);
+ }
+ catch (System.Exception exception)
+ {
+ Debug.LogException(exception, dialogueRunner);
+ // 启动阶段可能已经让部分 Presenter 进入展示状态;先请求停止,再立即清理事务。
+ // 后续若收到 Runner 的完成事件,会因 activeBlockId 已被清空而被安全忽略。
+ if (dialogueRunner != null && dialogueRunner.IsDialogueRunning)
+ {
+ dialogueRunner.GetComponent()?.CancelCurrentPresentation();
+ dialogueRunner.Stop().Forget();
+ }
+ RestoreInterruptedDialogue("启动 Yarn 对话失败");
+ }
+ }
+
+ ///
+ /// 取消当前 TextBlock 对话并恢复进入前的章节剧情快照。
+ /// Yarn 的 仍会触发 onDialogueComplete;
+ /// 因此此处先标记取消状态,完成回调会走恢复流程而不是误将 Block 标记为 Completed。
+ ///
+ public bool CancelActiveDialogue()
+ {
+ if (_isCancellingDialogue || string.IsNullOrEmpty(_activeBlockId) ||
+ dialogueRunner == null || !dialogueRunner.IsDialogueRunning)
+ {
+ return false;
+ }
+
+ _isCancellingDialogue = true;
+ _dialogueEndActions.Clear();
+ dialogueRunner.GetComponent()?.CancelCurrentPresentation();
+ dialogueRunner.Stop().Forget();
+ return true;
+ }
+
+ ///
+ /// 将一个全局副作用排入“本次 TextBlock 成功提交后”执行的队列。
+ /// 没有活动对话事务时会立即执行,便于未来在非 TextBlock 环境复用同一批 Yarn 命令。
+ ///
+ public void ExecuteAfterDialogueCommit(UnityAction action)
+ {
+ if (action == null)
+ return;
+
+ if (IsDialogueTransactionActive)
+ {
+ _dialogueEndActions.Add(action);
+ return;
+ }
+
+ action.Invoke();
}
// 将 DialogueRunner 的 YarnProject 切换为当前已构建章节的 StoryData.yarnProject(若不同且未在运行)
@@ -115,16 +260,25 @@ namespace Ichni.Story.Dialogue
if (field == null) return;
- // 已经是 UnityLocalisedLineProvider 则无需处理
- if (field.GetValue(dialogueRunner) is UnityLocalisedLineProvider) return;
-
- UnityLocalisedLineProvider provider =
- dialogueRunner.GetComponent();
+ UnityLocalisedLineProvider provider = field.GetValue(dialogueRunner) as UnityLocalisedLineProvider;
+ provider ??= dialogueRunner.GetComponent();
if (provider != null)
{
- field.SetValue(dialogueRunner, provider);
- Debug.Log("[StoryDialogueController] Assigned UnityLocalisedLineProvider to DialogueRunner.lineProvider.");
+ if (field.GetValue(dialogueRunner) != provider)
+ {
+ field.SetValue(dialogueRunner, provider);
+ Debug.Log("[StoryDialogueController] Assigned UnityLocalisedLineProvider to DialogueRunner.lineProvider.");
+ }
+
+ // Yarn 的 Localized Line Provider 本身只持有一个 String Table 引用;统一使用 YarnLines
+ // 可避免在切换章节时依赖反射替换不同表。未配置时不覆盖旧场景,便于分步迁移现有 Chapter0_Lines。
+ if (yarnLinesTable != null && !yarnLinesTable.IsEmpty)
+ {
+ FieldInfo tableField = typeof(UnityLocalisedLineProvider).GetField(
+ "stringsTable", BindingFlags.NonPublic | BindingFlags.Instance);
+ tableField?.SetValue(provider, yarnLinesTable);
+ }
}
else
{
@@ -134,24 +288,35 @@ namespace Ichni.Story.Dialogue
private void HandleDialogueComplete()
{
- // 持久化对话过程中写入的全局剧情变量
- if (GameSaveManager.instance != null && GameSaveManager.instance.StorySaveModule != null)
- GameSaveManager.instance.StorySaveModule.SaveVariables();
+ // Failed 流程已经清理 activeBlockId 后,底层 Runner 仍可能随后送达完成事件;此时绝不能误提交。
+ if (string.IsNullOrEmpty(_activeBlockId))
+ return;
- // 标记 block 完成 → 重算解锁 → 存档(OnBlockCompleted 内部已去重并保存章节进度)
+ if (_isCancellingDialogue)
+ {
+ RestoreCancelledDialogue();
+ return;
+ }
+
+ // 标记 Block 完成 → 重算解锁 → 保存完整章节容器(含变量、选项与回滚快照)。
if (!string.IsNullOrEmpty(_activeBlockId) &&
StoryManager.instance != null && StoryManager.instance.treeController != null)
{
StoryManager.instance.treeController.OnBlockCompleted(_activeBlockId);
}
+ StoryProgress.EndBlockMutation(_activeBlockId);
_activeBlockId = null;
+ // 所有本次 TextBlock 的变量、选项和完成状态至此才一次性写入 ES3。
+ GameSaveManager.instance?.StorySaveModule?.CommitChapterTransaction(_activeDialogueChapterIndex);
+ ClearDialogueSessionState();
+
// 依次执行并清空结束回调(如歌曲解锁提示)
- if (dialogueEndActions.Count > 0)
+ if (_dialogueEndActions.Count > 0)
{
- List pending = new List(dialogueEndActions);
- dialogueEndActions.Clear();
+ List pending = new List(_dialogueEndActions);
+ _dialogueEndActions.Clear();
foreach (UnityAction action in pending)
{
action?.Invoke();
@@ -164,6 +329,50 @@ namespace Ichni.Story.Dialogue
{
storyUIPage.FadeIn();
}
+
+ DialogueHistory.Clear();
+ }
+
+ ///
+ /// 处理 Back 触发的 Yarn 停止回调:放弃运行期间的全部章节剧情改动,
+ /// 并只刷新当前已实例化的 StoryTree,保留玩家拖动剧情树后的视口位置。
+ ///
+ private void RestoreCancelledDialogue()
+ {
+ RestoreInterruptedDialogue("玩家中途退出对话");
+ }
+
+ ///
+ /// 取消和失败共用的事务回滚出口。该方法具有幂等性:无活动 Block 时直接返回,
+ /// 因而底层 Yarn 在 Stop/异常后重复触发完成事件也不会把已回滚的数据再次提交。
+ ///
+ private void RestoreInterruptedDialogue(string reason)
+ {
+ if (string.IsNullOrEmpty(_activeBlockId))
+ return;
+
+ string interruptedBlockId = _activeBlockId;
+ string chapterIndex = _activeDialogueChapterIndex;
+ StoryTreeController treeController = StoryManager.instance?.treeController;
+
+ Debug.LogWarning($"[StoryDialogueController] {reason},已回滚 TextBlock '{interruptedBlockId}' 的章节剧情事务。");
+ StoryProgress.EndBlockMutation(interruptedBlockId);
+ GameSaveManager.instance?.StorySaveModule?.RollbackChapterTransaction(
+ chapterIndex, _activeDialogueSnapshot);
+ treeController?.ReloadActiveChapterProgress();
+
+ _dialogueEndActions.Clear();
+ DialogueHistory.Clear();
+ _activeBlockId = null;
+ ClearDialogueSessionState();
+ storyUIPage?.FadeIn();
+ }
+
+ private void ClearDialogueSessionState()
+ {
+ _activeDialogueSnapshot = null;
+ _activeDialogueChapterIndex = null;
+ _isCancellingDialogue = false;
}
}
}
diff --git a/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs b/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs
index db6a390d..ea8037dc 100644
--- a/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs
+++ b/Assets/Scripts/NewStorySystem/Dialogue/VNDialoguePresenter.cs
@@ -94,6 +94,13 @@ namespace Ichni.Story.Dialogue
public override async YarnTask OnDialogueStartedAsync()
{
+ // 快进是一次 Yarn 对话会话的临时操作,绝不能遗留到下一次进入 TextBlock。
+ _isFastForwarding = false;
+ _typewriterComplete = false;
+
+ // 对话记录只保留当前一次 TextBlock;每次 Yarn 对话真正开始时清空上一段残留内容。
+ DialogueHistory.BeginSession();
+
if (Page != null)
{
var tcs = new YarnTaskCompletionSource();
@@ -119,6 +126,8 @@ namespace Ichni.Story.Dialogue
// ── 打字效果 ──
string fullText = line.TextWithoutCharacterName.Text;
+ // 记录的是本次实际展示时已经解析完成的本地化文本,而非 Yarn Key。
+ DialogueHistory.AddLine(line.CharacterName, fullText);
_typewriterComplete = false;
if (Page.dialogueText != null)
@@ -163,6 +172,16 @@ namespace Ichni.Story.Dialogue
{
if (Page == null) return null;
+ // 同一 TextBlock 的选项已被玩家选择过时,直接把原 Option 返回给 Yarn,
+ // 让后续指令和分支仍由 Yarn 正常执行,而不是在 C# 中复制分支逻辑。
+ string sourceBlockId = StoryDialogueController.instance?.ActiveBlockId;
+ if (StoryChoiceMemory.TryGetRememberedOption(sourceBlockId, options, out DialogueOption rememberedOption))
+ {
+ // 已记忆选项在普通回顾与快进时都会自动采用;记录页仍应如实显示本次经过的分支。
+ DialogueHistory.AddChoice(rememberedOption.Line.TextWithoutCharacterName.Text);
+ return rememberedOption;
+ }
+
// 遇到选项强制打断快进
_isFastForwarding = false;
@@ -173,9 +192,12 @@ namespace Ichni.Story.Dialogue
// 显示选项容器
if (Page.choiceFrame != null) Page.choiceFrame.SetActive(true);
- _optionTcs = new YarnTaskCompletionSource();
+ YarnTaskCompletionSource optionTcs = new YarnTaskCompletionSource();
+ _optionTcs = optionTcs;
- WaitForExternalCancelAsync(token.NextContentToken).Forget();
+ // 将本组选项自己的 TCS 传入取消监听,避免上一组选项的 Token 在稍后取消时
+ // 错误结束下一组选项。_optionTcs 只用于外部 Back 流程定位当前正在等待的选择。
+ WaitForExternalCancelAsync(token.NextContentToken, optionTcs).Forget();
// ── 配置每个选项按钮 ──
for (int i = 0; i < Page.choiceButtons.Length; i++)
@@ -183,13 +205,24 @@ namespace Ichni.Story.Dialogue
if (Page.choiceButtons[i] == null) continue;
if (i < options.Length)
- Page.choiceButtons[i].Setup(options[i], opt => _optionTcs.TrySetResult(opt));
+ {
+ Page.choiceButtons[i].Setup(options[i], opt =>
+ {
+ // 先写入选项记忆,再结束异步等待;这样即使紧接着 Yarn 修改路线变量,
+ // Timeline 快照也仍然代表“本组选择之前”的状态。
+ StoryChoiceMemory.RememberChoice(sourceBlockId, options, opt);
+ DialogueHistory.AddChoice(opt.Line.TextWithoutCharacterName.Text);
+ optionTcs.TrySetResult(opt);
+ });
+ }
else
Page.choiceButtons[i].Cleanup();
}
// ── 等待玩家选择 ──
- DialogueOption? selected = await _optionTcs.Task;
+ DialogueOption? selected = await optionTcs.Task;
+ if (_optionTcs == optionTcs)
+ _optionTcs = null;
// 清理所有按钮并隐藏选项容器
foreach (ChoiceButton btn in Page.choiceButtons)
@@ -202,6 +235,10 @@ namespace Ichni.Story.Dialogue
public override async YarnTask OnDialogueCompleteAsync()
{
+ // 无论正常完成还是被 StoryDialogueController 通过 Stop 取消,都要结束本次快进状态。
+ _isFastForwarding = false;
+ _typewriterComplete = true;
+
if (Page != null)
{
var tcs = new YarnTaskCompletionSource();
@@ -210,10 +247,48 @@ namespace Ichni.Story.Dialogue
}
}
+ ///
+ /// 打开对话记录前的 UI 收束操作。
+ /// 停止自动快进,并补全当前正在打字的一句,但绝不请求下一句,
+ /// 因而 History 覆盖层打开期间不会改变 Yarn 的剧情进度。
+ ///
+ public void PrepareForHistory()
+ {
+ _isFastForwarding = false;
+
+ if (!_typewriterComplete && _runner != null)
+ _runner.RequestHurryUpLine();
+ }
+
+ ///
+ /// 为 DialogUIPage 的 Back 取消流程收起所有临时交互。
+ /// 真正终止 Yarn 和恢复章节快照由 负责;
+ /// 本方法不写入任何剧情变量或选项。
+ ///
+ public void CancelCurrentPresentation()
+ {
+ _isFastForwarding = false;
+ _typewriterComplete = true;
+ _optionTcs?.TrySetResult(null);
+
+ if (Page == null)
+ return;
+
+ foreach (ChoiceButton button in Page.choiceButtons)
+ button?.Cleanup();
+
+ if (Page.choiceFrame != null)
+ Page.choiceFrame.SetActive(false);
+ }
+
// ── 内部方法 ─────────────────────────────────────────────────────────────
private void OnAdvanceButtonClicked()
{
+ // 未记忆选项必须由 ChoiceButton 明确选择;推进按钮不能越过当前选择。
+ if (_optionTcs != null)
+ return;
+
// 如果玩家在快进时点击屏幕/推进键,则打断快进状态并停止当前动作
if (_isFastForwarding)
{
@@ -231,6 +306,10 @@ namespace Ichni.Story.Dialogue
private void OnFastForwardButtonClicked()
{
+ // 快进可以跨过已经记忆的选项,但不能跳过正在等待玩家首次决定的选项。
+ if (_optionTcs != null)
+ return;
+
_isFastForwarding = true;
if (_runner == null) return;
@@ -263,10 +342,12 @@ namespace Ichni.Story.Dialogue
}
}
- private async YarnTask WaitForExternalCancelAsync(CancellationToken externalToken)
+ private static async YarnTask WaitForExternalCancelAsync(
+ CancellationToken externalToken,
+ YarnTaskCompletionSource optionTcs)
{
await YarnTask.WaitUntilCanceled(externalToken).SuppressCancellationThrow();
- _optionTcs?.TrySetResult(null);
+ optionTcs.TrySetResult(null);
}
}
}
diff --git a/Assets/Scripts/NewStorySystem/Editor.meta b/Assets/Scripts/NewStorySystem/Editor.meta
new file mode 100644
index 00000000..e6e9d6ff
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cc2195a6a842d2044a7087f3e7fc63e1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/NewStorySystem/Helper.meta b/Assets/Scripts/NewStorySystem/Helper.meta
new file mode 100644
index 00000000..40becee6
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Helper.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 212db2c9a00528745af80a8df649d4d7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/NewStorySystem/Helper/StaticStoryHelperVisualPresenter.cs b/Assets/Scripts/NewStorySystem/Helper/StaticStoryHelperVisualPresenter.cs
new file mode 100644
index 00000000..4a290c76
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Helper/StaticStoryHelperVisualPresenter.cs
@@ -0,0 +1,25 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Ichni.Story
+{
+ ///
+ /// 当前阶段使用 显示静态 Helper 插画的 Presenter。
+ /// 若 StoryHelperData 未配置 portraitSprite,则保留场景中已有的 Sprite 作为回退,
+ /// 方便在视觉资源尚未完全迁移时继续工作。
+ ///
+ public class StaticStoryHelperVisualPresenter : StoryHelperVisualPresenter
+ {
+ [SerializeField, Tooltip("用于显示当前 Helper 静态立绘的 Image。")]
+ private Image portraitImage;
+
+ public override void ApplyHelper(StoryHelperData helperData)
+ {
+ if (portraitImage == null || helperData == null || helperData.portraitSprite == null)
+ return;
+
+ // 不调用 SetNativeSize:Helper 的实际 UI 尺寸由场景布局统一控制。
+ portraitImage.sprite = helperData.portraitSprite;
+ }
+ }
+}
diff --git a/Assets/Scripts/NewStorySystem/Helper/StaticStoryHelperVisualPresenter.cs.meta b/Assets/Scripts/NewStorySystem/Helper/StaticStoryHelperVisualPresenter.cs.meta
new file mode 100644
index 00000000..506ff4a4
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Helper/StaticStoryHelperVisualPresenter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c31f8bd5e6ca44399645c4f7cb21e0ad
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/NewStorySystem/Helper/StoryHelperController.cs b/Assets/Scripts/NewStorySystem/Helper/StoryHelperController.cs
new file mode 100644
index 00000000..67142e94
--- /dev/null
+++ b/Assets/Scripts/NewStorySystem/Helper/StoryHelperController.cs
@@ -0,0 +1,386 @@
+using System;
+using System.Collections.Generic;
+using DG.Tweening;
+using UnityEngine;
+using UnityEngine.Localization.Settings;
+using UnityEngine.UI;
+
+namespace Ichni.Story
+{
+ ///
+ /// 场景中常驻 Helper 的交互控制器。
+ /// 点击后会按剧情条件筛选并加权随机抽取一条台词,实例化 HelperTalk Prefab 显示;
+ /// 此过程不修改剧情变量、Block 完成状态或存档。
+ ///
+ [RequireComponent(typeof(Button))]
+ public class StoryHelperController : MonoBehaviour
+ {
+ [Header("References")]
+ [SerializeField, Tooltip("承接 Helper 点击的 Button。建议挂在固定根节点,而非会移动的视觉节点上。")]
+ private Button helperButton;
+
+ [SerializeField, Tooltip("当前 Helper 的视觉 Presenter。未来可替换为 Spine 或 Live2D 对应实现。")]
+ private StoryHelperVisualPresenter visualPresenter;
+
+ [SerializeField, Tooltip("点击后实例化的 HelperTalk Prefab。它独立于 MessageBox。")]
+ private StoryHelperTalk helperTalkPrefab;
+
+ [SerializeField, Tooltip("运行时 HelperTalk 的父节点。留空时使用当前 Helper 根节点。")]
+ private Transform helperTalkContainer;
+
+ [Header("Motion Roots")]
+ [SerializeField, Tooltip("只承担循环漂浮动画的节点。")]
+ private RectTransform idleRoot;
+
+ [SerializeField, Tooltip("只承担点击反馈的节点。它应位于 Idle Root 内部,避免与循环漂浮争夺同一属性。")]
+ private RectTransform clickRoot;
+
+ [Header("Idle Animation")]
+ [SerializeField, Min(0f), Tooltip("循环漂浮的最大纵向偏移(Canvas 单位)。")]
+ private float idleFloatDistance = 8f;
+
+ [SerializeField, Min(0.05f), Tooltip("从基准位置移动到最高点或最低点的单程时间。")]
+ private float idleHalfDuration = 1.35f;
+
+ [Header("Click Animation")]
+ [SerializeField, Min(0.01f), Tooltip("点击缩放与位移反馈持续时间。")]
+ private float clickPunchDuration = 0.2f;
+
+ [SerializeField, Min(0f), Tooltip("点击时的缩放强度;0.035 表示约 3.5% 的轻微放大。")]
+ private float clickPunchScale = 0.035f;
+
+ [SerializeField, Min(0f), Tooltip("点击时的纵向位移反馈(Canvas 单位)。")]
+ private float clickPunchOffset = 5f;
+
+ [SerializeField, Min(0f), Tooltip("连续点击的最小间隔,防止重复实例化大量气泡。")]
+ private float clickCooldown = 0.3f;
+
+ private readonly List _eligibleDialogues = new();
+
+ private Sequence _idleSequence;
+ private Sequence _clickSequence;
+ private StoryHelperTalk _activeTalk;
+ private Vector2 _idleBasePosition;
+ private Vector2 _clickBasePosition;
+ private Vector3 _clickBaseScale;
+ private string _lastDialogueId;
+ private StoryHelperData _appliedHelperData;
+ private StoryManager _subscribedStoryManager;
+ private float _nextClickTime;
+
+ private void Awake()
+ {
+ if (helperButton == null)
+ helperButton = GetComponent