优化一些动画效果

Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
2026-07-26 12:12:45 +08:00
parent a34461d31f
commit a00046128d
84 changed files with 8241 additions and 1681 deletions

View File

@@ -213,7 +213,7 @@ Material:
- _Dst: 10
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EdgeValue: 0.25755936
- _EdgeValue: 0.11854072
- _EnvironmentReflections: 1
- _FNLfanxiangkaiguan: 0
- _Face: 1
@@ -258,7 +258,7 @@ Material:
- _Mask_scale: 1
- _Metallic: 0
- _OcclusionStrength: 1
- _Opacity: 0.74244064
- _Opacity: 0.8814593
- _Parallax: 0.005
- _Pass: 0
- _QueueOffset: 0

View File

@@ -1,27 +0,0 @@
<linker>
<assembly fullname="Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
<type fullname="UnityEngine.AddressableAssets.Addressables" preserve="all" />
</assembly>
<assembly fullname="Unity.Localization, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<type fullname="UnityEngine.Localization.Locale" preserve="all" />
<type fullname="UnityEngine.Localization.Tables.SharedTableData" preserve="all" />
<type fullname="UnityEngine.Localization.Tables.StringTable" preserve="all" />
<type fullname="UnityEngine.Localization.LocaleIdentifier" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Metadata.MetadataCollection" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.TableEntryData" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.DistributedUIDGenerator" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.SharedTableData/SharedTableEntry" preserve="nothing" serialized="true" />
</assembly>
<assembly fullname="Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.SceneProvider" preserve="all" />
</assembly>
<assembly fullname="UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<type fullname="UnityEngine.Object" preserve="all" />
</assembly>
<assembly fullname="YarnSpinner.Unity">
<type fullname="Yarn.Unity.UnityLocalization.LineMetadata" preserve="nothing" serialized="true" />
</assembly>
</linker>

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 9da5530d5ebfab24c8ecad68795e720f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 641c955d37d2fac4f87e00ac5c9d9bd8
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 2690f45490c175045bbdc63395bf6278
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 3579d9cf4b75c564faa8fffc58a9f3f6
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 0023a0858ba124646a55dfcb7231ed46
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 13ab599a7bda4e54fba3e92a13c9580a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 69bc3229216b1504ea3e28b5820bbb0d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 4f665a06c5a2aa5499fa1c79ac058999
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 8a87ed432fe2d97498c0de5fae312e35
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 2243c8b4e1ab6914995699133f67ab5a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 9a5e61a8b3421b944863d0946e32da0a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 89f0b84148d149d4d96b838d7ef60e92
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 19939ee2cdb76e0489b1b8cd4bed7f3d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 70777e8ce9f3c8d4a8182ca2f965cdb2
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 4b5cb8698f2d9c14fadf8e2383441d37
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 57fcea0ed8b5eb347923c4c21fa31b57
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 0904cdf24ddcd5042b024326476220d5
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 929783250050f8a448821b6ca1f2c578
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 1782b72cd0e99a54fac09382c482e3db
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 49d5bcbbd4cbd754b98cf3200197b0f1
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 6584a66582083a1459dcf5e4e87f6d62
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 0190b8bde50f12943926613d9a63c89a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 37e6a9374416bc946a55779c58d0d984
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

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

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 48e08dc33330d11e9d4a1b246c52e4f6
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

@@ -0,0 +1,202 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &382660902144507853
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 566747998779516252}
- component: {fileID: 2755074587475001376}
- component: {fileID: 7558282620277711354}
m_Layer: 5
m_Name: Image (2)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &566747998779516252
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382660902144507853}
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: 6423969536244579528}
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: -8}
m_SizeDelta: {x: 350, y: 350}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2755074587475001376
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382660902144507853}
m_CullTransparentMesh: 1
--- !u!114 &7558282620277711354
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382660902144507853}
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: 4c2da67c886e9e14bacecca27b7ff037, 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!1 &2019493792811240199
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7601765261673688926}
- component: {fileID: 7975330483078445296}
- component: {fileID: 2627091413875673719}
m_Layer: 5
m_Name: Image (3)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7601765261673688926
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2019493792811240199}
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: 6423969536244579528}
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: 49.99997, y: -16}
m_SizeDelta: {x: 512, y: 512}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7975330483078445296
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2019493792811240199}
m_CullTransparentMesh: 1
--- !u!114 &2627091413875673719
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2019493792811240199}
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.47058824, g: 0.47058824, b: 0.47058824, 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: 7fe3e3ef9e5ebd04d9fe53b5637a6ad9, 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: 0.01
--- !u!1 &8177456974379320354
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6423969536244579528}
- component: {fileID: 9181619744543275993}
m_Layer: 5
m_Name: SongDot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6423969536244579528
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8177456974379320354}
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: 566747998779516252}
- {fileID: 7601765261673688926}
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: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!225 &9181619744543275993
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8177456974379320354}
m_Enabled: 1
m_Alpha: 0.5
m_Interactable: 0
m_BlocksRaycasts: 0
m_IgnoreParentGroups: 1

View File

@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: aa102d640b98b5d4781710a3a3dd6983
DefaultImporter:
guid: edac857bf612f0b4d82f934ea9417341
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:

View File

@@ -5808,6 +5808,129 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 361532780}
m_CullTransparentMesh: 1
--- !u!1 &367706812
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 367706813}
- component: {fileID: 367706815}
- component: {fileID: 367706814}
- component: {fileID: 367706816}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &367706813
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 367706812}
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: 1647879295}
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: 2560}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &367706814
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 367706812}
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: 2100000, guid: 960d99cfcf04b0e4d8c177ca1d2ba766, type: 2}
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
--- !u!222 &367706815
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 367706812}
m_CullTransparentMesh: 1
--- !u!114 &367706816
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 367706812}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 45facfdc6a639f041b007c036dc527b8, type: 3}
m_Name:
m_EditorClassIdentifier: UnityUIExtensions::UnityEngine.UI.Extensions.Gradient2
_gradientType: 1
_blendMode: 2
_modifyVertices: 1
_offset: 1
_zoom: 1
_effectGradient:
serializedVersion: 2
key0: {r: 1, g: 1, b: 1, a: 0}
key1: {r: 1, g: 1, b: 1, a: 1}
key2: {r: 0, g: 0, b: 0, a: 1}
key3: {r: 0, g: 0, b: 0, a: 0}
key4: {r: 0, g: 0, b: 0, a: 0}
key5: {r: 0, g: 0, b: 0, a: 0}
key6: {r: 0, g: 0, b: 0, a: 0}
key7: {r: 0, g: 0, b: 0, a: 0}
ctime0: 0
ctime1: 65535
ctime2: 0
ctime3: 0
ctime4: 0
ctime5: 0
ctime6: 0
ctime7: 0
atime0: 0
atime1: 26214
atime2: 39321
atime3: 65535
atime4: 0
atime5: 0
atime6: 0
atime7: 0
m_Mode: 0
m_ColorSpace: 0
m_NumColorKeys: 2
m_NumAlphaKeys: 4
--- !u!1 &368565900
GameObject:
m_ObjectHideFlags: 0
@@ -6458,7 +6581,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 2100000, guid: 983ae72c51d95034eaf1e7800b0115fe, type: 2}
m_Material: {fileID: 2100000, guid: 2f196e016e1f9de4092a5f24f02342ae, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
@@ -8412,81 +8535,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f7db12c4a04bb4249a4916541b6d0e5d, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &480155962
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 480155963}
- component: {fileID: 480155965}
- component: {fileID: 480155964}
m_Layer: 5
m_Name: Image (2)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &480155963
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 480155962}
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: 1097358794}
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: -8}
m_SizeDelta: {x: 350, y: 350}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &480155964
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 480155962}
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.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: 21300000, guid: 4c2da67c886e9e14bacecca27b7ff037, 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 &480155965
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 480155962}
m_CullTransparentMesh: 1
--- !u!1001 &480190292
PrefabInstance:
m_ObjectHideFlags: 0
@@ -15698,6 +15746,7 @@ MonoBehaviour:
dragSmoothing: 16
releaseSmoothing: 4
flickThreshold: 50
SnapThreshold: 5
selectedTab: {fileID: 0}
songItems: []
topBound: 0
@@ -18079,6 +18128,7 @@ GameObject:
- component: {fileID: 1097358794}
- component: {fileID: 1097358796}
- component: {fileID: 1097358795}
- component: {fileID: 1097358797}
m_Layer: 5
m_Name: Image (1)
m_TagString: Untagged
@@ -18097,10 +18147,8 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 480155963}
- {fileID: 1116413106}
m_Father: {fileID: 1647879295}
m_Children: []
m_Father: {fileID: 1149259737}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
@@ -18145,6 +18193,28 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1097358793}
m_CullTransparentMesh: 1
--- !u!114 &1097358797
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1097358793}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b6ebaa592d5a7fc4594d65a24bd0ec76, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::SongDotAnimationUI
controllerUI: {fileID: 886518565}
DotPfab: {fileID: 8177456974379320354, guid: edac857bf612f0b4d82f934ea9417341, type: 3}
innerOffset: 400
outerOffset: 600
visibleSongRadius: 2
visibleDotCount: 5
outerScale: 0
midScale: 0.2
outerAlpha: 0
midAlpha: 0
--- !u!1 &1101767419
GameObject:
m_ObjectHideFlags: 0
@@ -18384,81 +18454,6 @@ MonoBehaviour:
references:
version: 2
RefIds: []
--- !u!1 &1116413105
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1116413106}
- component: {fileID: 1116413108}
- component: {fileID: 1116413107}
m_Layer: 5
m_Name: Image (3)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1116413106
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1116413105}
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: 1097358794}
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: 49.99997, y: -16}
m_SizeDelta: {x: 512, y: 512}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1116413107
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1116413105}
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.47058824, g: 0.47058824, b: 0.47058824, 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: 21300000, guid: 7fe3e3ef9e5ebd04d9fe53b5637a6ad9, 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: 0.01
--- !u!222 &1116413108
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1116413105}
m_CullTransparentMesh: 1
--- !u!1 &1119493263
GameObject:
m_ObjectHideFlags: 0
@@ -19384,6 +19379,7 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 886518561}
- {fileID: 1097358794}
m_Father: {fileID: 1647879295}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -21778,10 +21774,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 56912689}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
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: 0, y: 0}
m_SizeDelta: {x: 2560, y: 2560}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1371824331
MonoBehaviour:
@@ -21795,7 +21791,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 2100000, guid: 983ae72c51d95034eaf1e7800b0115fe, type: 2}
m_Material: {fileID: 2100000, guid: 2f196e016e1f9de4092a5f24f02342ae, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
@@ -23034,8 +23030,6 @@ MonoBehaviour:
tickRepeatRect: {fileID: 813631331}
tickRepeatPeriodOverride: 0
expandTickRepeatRect: 1
localizationTable:
m_TableCollectionName:
--- !u!1 &1459385232
GameObject:
m_ObjectHideFlags: 0
@@ -23938,7 +23932,7 @@ MonoBehaviour:
mainCanvasGroup: {fileID: 1647879291}
backButton: {fileID: 1979587997}
enterStoryButton: {fileID: 951226830}
backgroundFrames: {fileID: 2007806592}
backgroundFrames: {fileID: 367706816}
framePositionOffset: -1
songListController: {fileID: 886518565}
playSongUI: {fileID: 2067971169}
@@ -26082,9 +26076,8 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 56912689}
- {fileID: 2007806588}
- {fileID: 367706813}
- {fileID: 1149259737}
- {fileID: 1097358794}
- {fileID: 1283588607}
- {fileID: 2067971168}
- {fileID: 1979587996}
@@ -29740,129 +29733,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2005595456}
m_CullTransparentMesh: 1
--- !u!1 &2007806587
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2007806588}
- component: {fileID: 2007806591}
- component: {fileID: 2007806593}
- component: {fileID: 2007806592}
m_Layer: 5
m_Name: Image (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2007806588
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2007806587}
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: 1647879295}
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: 2160, y: 1926}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2007806591
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2007806587}
m_CullTransparentMesh: 1
--- !u!114 &2007806592
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2007806587}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 45facfdc6a639f041b007c036dc527b8, type: 3}
m_Name:
m_EditorClassIdentifier: UnityUIExtensions::UnityEngine.UI.Extensions.Gradient2
_gradientType: 1
_blendMode: 2
_modifyVertices: 1
_offset: -1
_zoom: 1
_effectGradient:
serializedVersion: 2
key0: {r: 1, g: 1, b: 1, a: 0}
key1: {r: 1, g: 1, b: 1, a: 1}
key2: {r: 1, g: 1, b: 1, a: 1}
key3: {r: 0, g: 0, b: 0, a: 1}
key4: {r: 0, g: 0, b: 0, a: 0}
key5: {r: 0, g: 0, b: 0, a: 0}
key6: {r: 0, g: 0, b: 0, a: 0}
key7: {r: 0, g: 0, b: 0, a: 0}
ctime0: 0
ctime1: 32768
ctime2: 65535
ctime3: 0
ctime4: 0
ctime5: 0
ctime6: 0
ctime7: 0
atime0: 0
atime1: 16384
atime2: 32768
atime3: 49151
atime4: 65535
atime5: 0
atime6: 0
atime7: 0
m_Mode: 0
m_ColorSpace: 0
m_NumColorKeys: 3
m_NumAlphaKeys: 5
--- !u!114 &2007806593
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2007806587}
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: 2100000, guid: 960d99cfcf04b0e4d8c177ca1d2ba766, type: 2}
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
--- !u!1 &2009017380
GameObject:
m_ObjectHideFlags: 0
@@ -29897,7 +29767,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: -100}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!199 &2009017382
@@ -29996,8 +29866,8 @@ ParticleSystem:
ringBufferLoopRange: {x: 0, y: 1}
emitterVelocityMode: 1
looping: 1
prewarm: 0
playOnAwake: 0
prewarm: 1
playOnAwake: 1
useUnscaledTime: 0
autoRandomSeed: 1
startDelay:
@@ -30063,7 +29933,7 @@ ParticleSystem:
startLifetime:
serializedVersion: 2
minMaxState: 0
scalar: 100
scalar: 10
minScalar: 5
maxCurve:
serializedVersion: 2
@@ -30116,7 +29986,7 @@ ParticleSystem:
startSpeed:
serializedVersion: 2
minMaxState: 0
scalar: 5
scalar: 20
minScalar: 5
maxCurve:
serializedVersion: 2
@@ -30698,7 +30568,7 @@ ParticleSystem:
sphericalDirectionAmount: 0
randomPositionAmount: 0
radius:
value: 75
value: 106.59
mode: 0
spread: 0
speed:
@@ -30817,7 +30687,7 @@ ParticleSystem:
rateOverTime:
serializedVersion: 2
minMaxState: 0
scalar: 0.2
scalar: 1
minScalar: 10
maxCurve:
serializedVersion: 2

View File

@@ -189,7 +189,7 @@ namespace Ichni.UI
expandSequence.Join(upperTip.DOFade(1f, 0.3f).SetEase(Ease.OutExpo));
expandSequence.OnStart(() => isDuringAnimation = true);
expandSequence.OnComplete(() =>
expandSequence.OnStart(() =>
{
isDuringAnimation = false;
expansionRipple.material.SetFloat("_RippleTime", 0f);

View File

@@ -0,0 +1,167 @@
using System.Collections.Generic;
using Ichni.Menu;
using UnityEngine;
public class SongDotAnimationUI : MonoBehaviour
{
[Header("引用")]
public SongListControllerUI controllerUI;
[Header("预制体")]
public GameObject DotPfab;
[Header("布局参数")]
[SerializeField] private float innerOffset = 400f;
[SerializeField] private float outerOffset = 600f;
[SerializeField] [Min(1f)] private float visibleSongRadius = 2f;
[SerializeField] [Min(1)] private int visibleDotCount = 5;
[SerializeField] [Range(0f, 1f)] private float outerScale = 0f;
[SerializeField] [Range(0f, 1f)] private float midScale = 0.2f;
[SerializeField] [Range(0f, 1f)] private float outerAlpha = 0f;
[SerializeField] [Range(0f, 1f)] private float midAlpha = 0.45f;
private readonly List<RectTransform> dots = new();
private readonly List<CanvasGroup> dotCanvasGroups = new();
private int displayedCount = -1;
public int Count => controllerUI != null ? controllerUI.SongCount : 0;
public float ScrollProgress => controllerUI != null ? controllerUI.ScrollProgress : 0f;
void Start()
{
RebuildDotsIfNeeded();
}
void LateUpdate()
{
RebuildDotsIfNeeded();
if (controllerUI == null || dots.Count == 0)
{
return;
}
float centerIndex = controllerUI.ContinuousSongIndex;
int firstVisibleSongIndex = Mathf.FloorToInt(centerIndex) - visibleDotCount / 2;
for (int i = 0; i < dots.Count; i++)
{
RectTransform dot = dots[i];
int songIndex = firstVisibleSongIndex + i;
if (songIndex < 0 || songIndex >= Count)
{
SetDotVisible(i, false);
continue;
}
float relativeIndex = songIndex - centerIndex;
float absoluteRelativeIndex = Mathf.Abs(relativeIndex);
bool isVisible = absoluteRelativeIndex <= visibleSongRadius;
SetDotVisible(i, isVisible);
if (!isVisible)
{
continue;
}
float y = GetDotY(relativeIndex);
dots[i].anchoredPosition = new Vector2(0f, y);
float scale = GetDotScale(absoluteRelativeIndex);
dots[i].localScale = Vector3.one * Mathf.Clamp01(scale);
if (i < dotCanvasGroups.Count && dotCanvasGroups[i] != null)
{
dotCanvasGroups[i].alpha = GetDotAlpha(absoluteRelativeIndex);
}
}
}
private void RebuildDotsIfNeeded()
{
int targetCount = Mathf.Min(Count, visibleDotCount);
if (displayedCount == targetCount)
{
return;
}
for (int i = dots.Count - 1; i >= 0; i--)
{
if (dots[i] != null)
{
Destroy(dots[i].gameObject);
}
}
dots.Clear();
dotCanvasGroups.Clear();
if (DotPfab == null)
{
displayedCount = -1;
return;
}
for (int i = 0; i < targetCount; i++)
{
GameObject go = Instantiate(DotPfab, transform);
dots.Add(go.GetComponent<RectTransform>());
CanvasGroup canvasGroup = go.GetComponent<CanvasGroup>();
if (canvasGroup == null)
{
canvasGroup = go.AddComponent<CanvasGroup>();
}
dotCanvasGroups.Add(canvasGroup);
}
displayedCount = targetCount;
}
private void SetDotVisible(int dotIndex, bool isVisible)
{
RectTransform dot = dots[dotIndex];
if (dot.gameObject.activeSelf != isVisible)
{
dot.gameObject.SetActive(isVisible);
}
}
private float GetDotY(float relativeIndex)
{
float absRelativeIndex = Mathf.Abs(relativeIndex);
if (absRelativeIndex <= 1f)
{
return -relativeIndex * innerOffset;
}
float scaleRange = Mathf.Max(visibleSongRadius - 1f, 0.0001f);
float outerT = Mathf.Clamp01((absRelativeIndex - 1f) / scaleRange);
float distance = Mathf.Lerp(innerOffset, outerOffset, outerT);
return -Mathf.Sign(relativeIndex) * distance;
}
private float GetDotScale(float absoluteRelativeIndex)
{
if (absoluteRelativeIndex <= 1f)
{
return Mathf.Lerp(1f, midScale, absoluteRelativeIndex);
}
float scaleRange = Mathf.Max(visibleSongRadius - 1f, 0.0001f);
float outerT = Mathf.Clamp01((absoluteRelativeIndex - 1f) / scaleRange);
return Mathf.Lerp(midScale, outerScale, outerT);
}
private float GetDotAlpha(float absoluteRelativeIndex)
{
if (absoluteRelativeIndex <= 1f)
{
return Mathf.Lerp(1f, midAlpha, absoluteRelativeIndex);
}
float scaleRange = Mathf.Max(visibleSongRadius - 1f, 0.0001f);
float outerT = Mathf.Clamp01((absoluteRelativeIndex - 1f) / scaleRange);
return Mathf.Lerp(midAlpha, outerAlpha, outerT);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b6ebaa592d5a7fc4594d65a24bd0ec76

View File

@@ -10,34 +10,41 @@ using SLSUtilities.WwiseAssistance;
namespace Ichni.Menu
{
// 一个完全自定义的列表控制器,实现了拖拽、惯性、边界和吸附
// 一个完全自定义的列表控制器,实现了拖拽、惯性、边界和吸附
public partial class SongListControllerUI : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
[Title("核心组件")]
[Title("核心组件")]
[SerializeField] public RectTransform content;
[SerializeField] public RectTransform viewport;
[Title("预制体")]
[SerializeField]
[Title("预制体")]
[SerializeField]
private GameObject songItemPrefab;
[Title("对齐与动画")]
[Title("对齐与动画")]
[SerializeField] public RectTransform centerPoint;
[SerializeField] private float snapSpeed = 10f;
[SerializeField] private float decelerationRate = 0.15f;
[Title("平滑度优化")]
[SerializeField] [Range(1f, 20f)]
[Title("平滑度优化")]
[SerializeField]
[Range(1f, 20f)]
private float dragSmoothing = 16f; // 拖拽平滑度的阻尼值可在Inspector中调节
[SerializeField][Range(1f, 20f)]
[SerializeField]
[Range(1f, 20f)]
private float releaseSmoothing = 4f; // 松手后平滑度的阻尼值可在Inspector中调节
[Title("甩动判定")]
[Tooltip("当松手时的速度大于此值,才会被判定为一次“甩动”并产生惯性")]
[SerializeField] private float flickThreshold = 50f;
[Title("吸附判定")]
[Tooltip("当甩动惯性低于这玩意的时候就吸附")]
[SerializeField] private float SnapThreshold = 10f;
[Tooltip("吸附选项时按当前速度预判的时间,值越大越容易顺着滑动方向吸附到下一首")]
[SerializeField] [Min(0f)] private float snapVelocityProjectionTime = 0.12f;
public SongSelectionTab selectedTab;
// 内部变量
public List<RectTransform> songItems = new List<RectTransform>();
private Vector2 velocity;
@@ -47,6 +54,7 @@ namespace Ichni.Menu
private Vector2 targetPosition; // 【新增】内容的目标位置
private float targetX = 1500f;
public bool isDuringSnap = false;
private bool isSnapRequested = false;
public RectTransform closestTab;
// 仅供 Story SongBlock 在“下一次初始化列表”时指定初始歌曲;不写入章节缓存,
@@ -82,7 +90,7 @@ namespace Ichni.Menu
_initialSongSelectionOverride = null;
return;
}
Canvas.ForceUpdateCanvases();
topBound = (songItems.Count * 144f + (songItems.Count - 1) * 60f) - 72f; //topBound中144为tab高度60为tab间距72为tab高度的一半
bottomBound = 72f; //bottomBound中72为tab高度的一半
@@ -146,14 +154,14 @@ namespace Ichni.Menu
_initialSongSelectionOverride = null;
}
StartCoroutine(SnapToItem(songItems[songIndex], true));
closestTab = songItems[songIndex];
targetPosition = content.anchoredPosition;
targetX = -1500f;
}
private void Update()
{
RectTransform closestItem = closestTab;
@@ -167,7 +175,7 @@ namespace Ichni.Menu
closestItem = item;
}
}
if (closestItem != null && closestTab != closestItem)
{
closestTab = closestItem;
@@ -181,21 +189,20 @@ namespace Ichni.Menu
// 如果不在拖拽,则处理惯性
// 注意:我们只在 isDragging 为 false 时处理惯性,
// OnEndDrag中已经对速度进行了判断所以这里的逻辑依然适用
if (!isDragging && Mathf.Abs(velocity.y) > 0.1f)
if (!isDragging && !isDuringSnap && Mathf.Abs(velocity.y) > 0.1f)
{
// 将速度施加于目标位置
targetPosition.y += velocity.y * Time.deltaTime;
// 速度衰减
velocity *= (1 - decelerationRate);
// 当速度足够小时,停止惯性并触发吸附
if (Mathf.Abs(velocity.y) <= 0.1f)
// 惯性速度回落到吸附范围后,就请求吸附到最近歌曲。
if (!isSnapRequested && Mathf.Abs(velocity.y) <= SnapThreshold)
{
velocity = Vector2.zero;
StartCoroutine(SnapToClosest());
}
}
// 无论何时都将Content的实际位置平滑地Lerp到目标位置
float damping = isDragging ? dragSmoothing : releaseSmoothing;
Vector2 finalPosition = Vector2.Lerp(content.anchoredPosition, targetPosition, Time.deltaTime * damping);
@@ -204,15 +211,17 @@ namespace Ichni.Menu
// 每次更新后都施加边界限制
ClampContentPosition();
}
public void OnBeginDrag(PointerEventData eventData)
{
isDragging = true;
velocity = Vector2.zero;
StopAllCoroutines();
isSnapRequested = false;
isDuringSnap = false;
// 开始拖拽时,将目标位置与当前位置同步
targetPosition = content.anchoredPosition;
selectedTab?.SetSelection(false);
selectedTab = null; // 清除当前选中的Tab
@@ -228,7 +237,7 @@ namespace Ichni.Menu
// 【核心修正 #1】计算速度时只使用Y轴分量
velocity = new Vector2(0, eventData.delta.y / Time.deltaTime);
}
public void OnEndDrag(PointerEventData eventData)
{
isDragging = false;
@@ -244,7 +253,6 @@ namespace Ichni.Menu
else
{
// 速度很小,是“慢速拖拽”,立即开始吸附
velocity = Vector2.zero; // 清除残余速度
StartCoroutine(SnapToClosest());
}
}
@@ -255,7 +263,7 @@ namespace Ichni.Menu
targetPosition.y = Mathf.Clamp(targetPosition.y, bottomBound, topBound);
}
}
public partial class SongListControllerUI
{
public void ClearSongTabs()
@@ -276,8 +284,9 @@ namespace Ichni.Menu
SnapCoroutine = null;
targetPosition = content.anchoredPosition;
isDuringSnap = false;
isSnapRequested = false;
}
public void GenerateSongTabs()
{
ChapterSelectionUnit chapterUnit = ChapterSelectionManager.instance.currentChapter;
@@ -315,7 +324,7 @@ namespace Ichni.Menu
}
}
}
public void GoToNextTab()
{
if (closestTab != null)
@@ -332,18 +341,79 @@ namespace Ichni.Menu
public partial class SongListControllerUI
{
/// <summary>
/// 列表滚动进度0 = 第一首1 = 最后一首。
/// 基于 content.anchoredPosition.y 在 bottomBound ~ topBound 区间归一化。
/// </summary>
public float ScrollProgress =>
songItems.Count <= 1
? 0f
: Mathf.InverseLerp(bottomBound, topBound, content.anchoredPosition.y);
/// <summary>
/// 当前列表的连续歌曲索引0 = 第一首1 = 第二首。
/// 拖动或吸附动画中会返回小数,供外部 UI 跟随歌曲滑动。
/// </summary>
public float ContinuousSongIndex
{
get
{
if (songItems.Count <= 1)
{
return 0f;
}
return Mathf.Clamp(ScrollProgress * (songItems.Count - 1), 0f, songItems.Count - 1);
}
}
/// <summary>
/// 当前列表中的歌曲总数。
/// </summary>
public int SongCount => songItems.Count;
private IEnumerator SnapCoroutine;
// SnapToClosest 和 SnapToItem 这两个协程也需要微调,以确保它们能正确地与新的平滑系统协作
private IEnumerator SnapToClosest()
{
if (isSnapRequested)
{
yield break;
}
isSnapRequested = true;
// ... (寻找最近项的逻辑不变) ...
yield return new WaitForEndOfFrame();
float projectedContentY = Mathf.Clamp(
targetPosition.y + velocity.y * snapVelocityProjectionTime,
bottomBound,
topBound);
RectTransform closestItem = FindClosestItemToContentY(projectedContentY);
velocity = Vector2.zero;
if (closestItem != null)
{
yield return SnapToItem(closestItem, false);
}
isSnapRequested = false;
}
private RectTransform FindClosestItemToContentY(float contentY)
{
float minDistance = float.MaxValue;
RectTransform closestItem = null;
foreach (RectTransform item in songItems)
{
float distance = Mathf.Abs(item.position.y - centerPoint.position.y);
Vector3 itemLocalPos = viewport.InverseTransformPoint(item.position);
Vector3 centerLocalPos = viewport.InverseTransformPoint(centerPoint.position);
float localOffsetY = centerLocalPos.y - itemLocalPos.y;
float itemTargetY = Mathf.Clamp(content.anchoredPosition.y + localOffsetY, bottomBound, topBound);
float distance = Mathf.Abs(itemTargetY - contentY);
if (distance < minDistance)
{
minDistance = distance;
@@ -351,24 +421,22 @@ namespace Ichni.Menu
}
}
if (closestItem != null)
{
yield return SnapToItem(closestItem, false);
}
return closestItem;
}
public IEnumerator SnapToTab(SongSelectionTab tab)
{
selectedTab?.SetSelection(false);
selectedTab = null; // 清除当前选中的Tab
isSnapRequested = false;
if (isDuringSnap && SnapCoroutine != null)
{
StopCoroutine(SnapCoroutine);
}
SnapCoroutine = SnapToItem(tab.GetComponent<RectTransform>(), false);
yield return StartCoroutine(SnapCoroutine);
}
@@ -378,20 +446,20 @@ namespace Ichni.Menu
{
yield return new WaitForEndOfFrame();
}
Debug.Log("开始对齐到: " + targetItem.name);
selectedTab = targetItem.GetComponent<SongSelectionTab>();
selectedTab.SetSelection(true);
SongItemData connectedSong = selectedTab.connectedSong;
MenuManager.instance.songSelectionUIPage.selectedSong = connectedSong;
MenuManager.instance.songSelectionUIPage.selectedSave = GameSaveManager.instance.SongSaveModule.GetSongStatusSave(connectedSong.songName);
Vector3 closestItemLocalPos = viewport.InverseTransformPoint(targetItem.position);
Vector3 centerPointLocalPos = viewport.InverseTransformPoint(centerPoint.position);
float localOffsetY = centerPointLocalPos.y - closestItemLocalPos.y;
Vector2 finalTargetPosition = content.anchoredPosition + new Vector2(0, localOffsetY);
finalTargetPosition.y = Mathf.Clamp(finalTargetPosition.y, bottomBound, topBound);
@@ -419,11 +487,11 @@ namespace Ichni.Menu
}
Debug.Log($"已对齐到: {targetItem.GetComponent<SongSelectionTab>().songNameText.text}");
SongSelectionManager.instance.SetPreview(connectedSong, selectedTab.isLocked);
MenuManager.instance.songSelectionUIPage.difficultySelectionContainer.SetUp(connectedSong.difficultyDataList);
MenuManager.instance.songSelectionUIPage.songInfoUI.SetIllustration(connectedSong.illustration, connectedSong.illustratorName);
isDuringSnap = false;
}
}

View File

@@ -16,10 +16,10 @@ namespace Ichni.Menu
[Tooltip("从选曲页进入当前章节剧情树的按钮。会优先定位当前选中歌曲对应的 SongBlock未找到时显示剧情开头。")]
public Button enterStoryButton;
public Gradient2 backgroundFrames;
public float framePositionOffset = -1;
public SongListControllerUI songListController;
public PlaySongUI playSongUI;
public SongInfoUI songInfoUI;
@@ -47,12 +47,12 @@ namespace Ichni.Menu
MenuInputManager.OnMoveUp += songListController.GoToFormerTab;
MenuInputManager.OnMoveDown += songListController.GoToNextTab;
};
backButton.onClick.AddListener(ReturnToChapterSelection);
if (enterStoryButton != null)
enterStoryButton.onClick.AddListener(OpenStoryForSelectedSong);
songInfoUI.SetUp();
}
@@ -93,10 +93,10 @@ namespace Ichni.Menu
private void Start()
{
Sequence framesSeq = DOTween.Sequence();
framesSeq.Append(DOTween.To(() => framePositionOffset, x => framePositionOffset = x, 1f, 1f)
framesSeq.Append(DOTween.To(() => framePositionOffset, x => framePositionOffset = x, 1f, 3f)
.SetEase(Ease.Linear)
.OnUpdate(() => backgroundFrames.Offset = framePositionOffset));
framesSeq.AppendInterval(4f);
framesSeq.AppendInterval(1f);
framesSeq.SetLoops(-1, LoopType.Restart);
framesSeq.Play();
}

View File

@@ -34,7 +34,6 @@ namespace Ichni.UI
peWarningSequence.AppendCallback(() =>
{
peWarningWindow.SetActive(false);
floatingParticles.Play();
});
peWarningSequence.Play();
}

Binary file not shown.

View File

@@ -0,0 +1,67 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-5928508820055242063
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Shader Graphs_UI_ExpandingContours
m_Shader: {fileID: -6465566751694194690, guid: a4707ddd516cb8444aaddb033cc79c69,
type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _Emitter: 2
- _GridMul: 5
- _GridSmoothness: 0.97
- _GridThickNess: 0.92
- _LRGrandent: 0.8
- _Scale1: 4.12
- _Scale2: 1.23
- _Speed: 0.1
- _tresHood: 0.98
m_Colors:
- White: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 0.05882353}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@@ -1,7 +1,8 @@
fileFormatVersion: 2
guid: 544b0d2af4a8ed742864e96ca4de78c2
TextScriptImporter:
guid: 2f196e016e1f9de4092a5f24f02342ae
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
fileFormatVersion: 2
guid: a4707ddd516cb8444aaddb033cc79c69
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3}
useAsTemplate: 0
exposeTemplateAsShader: 0
template:
name:
category:
description:
icon: {instanceID: 0}
thumbnail: {instanceID: 0}

View File

@@ -243,7 +243,7 @@ Material:
- PixelSnap: 0
- _AdditiveToPreMultiplyAlphaLerp: 0
- _AffectsShadows: 0
- _AlphaAll: 1
- _AlphaAll: 0.1
- _AlphaClip: 0
- _AlphaToMask: 0
- _Autoplay: 0
@@ -269,7 +269,7 @@ Material:
- _BaseMapFoldOut: 0
- _BaseMapUVRotation: 0
- _BaseMapUVRotationSpeed: 0
- _BaseOptionBigBlockItemFoldOut: 0
- _BaseOptionBigBlockItemFoldOut: 1
- _BigBlockModeSettingFoldOut: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
@@ -392,7 +392,7 @@ Material:
- _LightBigBlockItemFoldOut: 0
- _LinearToGamma: 1
- _Loop: 1
- _MainTexBigBlockItemFoldOut: 0
- _MainTexBigBlockItemFoldOut: 1
- _MainTexPNoiseBlendOpacity: 1
- _MainTexUVModeFoldOut: 0
- _Mask2BlockFoldOut: 0
@@ -665,7 +665,7 @@ Material:
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
- _SpecularColor: {r: 1, g: 1, b: 1, a: 1}
- _TWParameter: {r: 0.5, g: 0.5, b: 0, a: 0}
- _UI_MainTex_ST: {r: 5, g: 4, b: 0, a: 0}
- _UI_MainTex_ST: {r: 5, g: 5, b: 0.5, a: 0}
- _VertexOffset_CustomDir: {r: 1, g: 1, b: 1, a: 0}
- _VertexOffset_MaskMap_Vec: {r: 0, g: 0, b: 1, a: 0}
- _VertexOffset_Vec: {r: 0, g: 0, b: 1, a: 0}

View File

@@ -1,21 +1,21 @@
ManifestFileVersion: 0
UnityVersion: 6000.3.7f1
CRC: 112380145
CRC: 1212460786
HashAppended: 0
AssetBundleManifest:
AssetBundleInfos:
Info_0:
Name: unifiedraytracing
Name: shapes
Dependencies: {}
Info_1:
Name: basic
Dependencies: {}
Info_2:
Name: departure_to_multiverse
Dependencies: {}
Info_3:
Name: metropolis_on_orbit
Dependencies: {}
Info_4:
Name: shapes
Info_3:
Name: departure_to_multiverse
Dependencies: {}
Info_4:
Name: unifiedraytracing
Dependencies: {}

View File

@@ -1,16 +1,16 @@
ManifestFileVersion: 0
UnityVersion: 6000.3.7f1
CRC: 3948698453
CRC: 4187162310
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: af7857bf316830adc26e256fe67e7e6e
Hash: 041639c891c497f5cda773d76795250a
TypeTreeHash:
serializedVersion: 2
Hash: dfed41e3b38758e5f34df30221d719dc
IncrementalBuildHash:
serializedVersion: 2
Hash: 3808ec220bbc7f0a81ac1b76e5dfc9cf
Hash: cc55a4d6a0abd71c4bc122644494bf52
HashAppended: 0
ClassTypes:
- Class: 1

View File

@@ -1,16 +1,16 @@
ManifestFileVersion: 0
UnityVersion: 6000.3.7f1
CRC: 3534727336
CRC: 1325295300
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: 51cebaae174d01d837ffac32a2fa6871
Hash: 5451f82a726dcc14425b20ee9bc64122
TypeTreeHash:
serializedVersion: 2
Hash: 6d9f9b8bc1074349261a0dbbf7f0f9f8
IncrementalBuildHash:
serializedVersion: 2
Hash: b230bc36e21371470e09e12a9e719661
Hash: c797ddcac88cdba8fd37b53fd8ff9401
HashAppended: 0
ClassTypes:
- Class: 1

View File

@@ -10,7 +10,7 @@ Hashes:
Hash: 8ab77e54d824a64c30bc20496c5f5926
IncrementalBuildHash:
serializedVersion: 2
Hash: 839fe28321d6bb7ee758d0377b2aba67
Hash: 64fbabfc34523bda91b8bcf2df98fea2
HashAppended: 0
ClassTypes:
- Class: 1

View File

@@ -10,7 +10,7 @@ Hashes:
Hash: bc9f87c7e64ff656997db0f2b2a91703
IncrementalBuildHash:
serializedVersion: 2
Hash: 98313c8eb74f89178044a9a994c30a81
Hash: 612a23b0b40c16e3e1e3cbbf90636bd0
HashAppended: 0
ClassTypes:
- Class: 28