diff --git a/.gitignore b/.gitignore index 7a60d128..60da31c3 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,4 @@ Assets/Font/SourceHanSans-Medium SDF.asset Assets/Font/GenJyuuGothicScore.asset /.idea/.idea.MajdataPlay/.idea /Cache/* +/.vscode diff --git a/Assets/Plugins/MychIO b/Assets/Plugins/MychIO index bc8f29c5..e0c4bffd 160000 --- a/Assets/Plugins/MychIO +++ b/Assets/Plugins/MychIO @@ -1 +1 @@ -Subproject commit bc8f29c5cd7d4293065e362d9deb0c40fd8e8bc4 +Subproject commit e0c4bffdba12d471cd16da2a7f3ebae3c25ebc04 diff --git a/Assets/Prefab/Game/Tap_01.prefab b/Assets/Prefab/Game/Tap_01.prefab index 5f027bf2..980bade3 100644 --- a/Assets/Prefab/Game/Tap_01.prefab +++ b/Assets/Prefab/Game/Tap_01.prefab @@ -182,6 +182,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c57176cc05c23a743af16831f7ec76ba, type: 3} m_Name: m_EditorClassIdentifier: + _state: 0 _startPos: 0 _timing: 0 _speed: 7 @@ -189,4 +190,4 @@ MonoBehaviour: _isEach: 0 _isBreak: 0 _isEX: 0 - tapLine: {fileID: 8134463029818261665, guid: 50d2a71ffa59d7c468196d8fa195953c, type: 3} + _tapLinePrefab: {fileID: 8134463029818261665, guid: 50d2a71ffa59d7c468196d8fa195953c, type: 3} diff --git a/Assets/Prefab/Game/TouchHold.prefab b/Assets/Prefab/Game/TouchHold.prefab index dcd33625..279c16ba 100644 --- a/Assets/Prefab/Game/TouchHold.prefab +++ b/Assets/Prefab/Game/TouchHold.prefab @@ -327,13 +327,13 @@ SpriteMask: m_SortingOrder: 0 m_Sprite: {fileID: 21300000, guid: 3b4060a5b8c39a84886b03d91d541a79, type: 3} m_MaskAlphaCutoff: 0 - m_FrontSortingLayerID: 0 - m_BackSortingLayerID: 0 - m_FrontSortingLayer: 0 - m_BackSortingLayer: 0 - m_FrontSortingOrder: 0 - m_BackSortingOrder: 0 - m_IsCustomRangeActive: 0 + m_FrontSortingLayerID: -1967659789 + m_BackSortingLayerID: -1967659789 + m_FrontSortingLayer: 8 + m_BackSortingLayer: 8 + m_FrontSortingOrder: 5 + m_BackSortingOrder: 5 + m_IsCustomRangeActive: 1 m_SpriteSortPoint: 0 --- !u!1 &4570065832111625927 GameObject: @@ -638,6 +638,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f6839bc41b7edde469c9fc7c4c009e2a, type: 3} m_Name: m_EditorClassIdentifier: + _state: 0 _startPos: 0 _timing: 0 _speed: 0 diff --git a/Assets/Prefab/Notes.meta b/Assets/Prefab/Notes.meta deleted file mode 100644 index c91df0ee..00000000 --- a/Assets/Prefab/Notes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2b8b88d428485464588695300011752f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Prefab/Notes/TapLine.prefab b/Assets/Prefab/Notes/TapLine.prefab deleted file mode 100644 index cb4c086c..00000000 --- a/Assets/Prefab/Notes/TapLine.prefab +++ /dev/null @@ -1,86 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &8134463029818261665 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1789078030775256475} - - component: {fileID: 1729491890081247388} - m_Layer: 0 - m_Name: TapLine - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1789078030775256475 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8134463029818261665} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.255, y: 0.255, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &1729491890081247388 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8134463029818261665} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: -1971309499 - m_SortingLayer: 1 - m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: 3003041b178b9f246b4b465afb8079d3, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 10.8, y: 10.8} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 diff --git a/Assets/Prefab/Notes/TapLine.prefab.meta b/Assets/Prefab/Notes/TapLine.prefab.meta deleted file mode 100644 index 784ea6d5..00000000 --- a/Assets/Prefab/Notes/TapLine.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ed6ad005bb60e9c409c75936f65b7f86 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Prefab/Notes/Tap_01.prefab b/Assets/Prefab/Notes/Tap_01.prefab deleted file mode 100644 index 8da0e5bb..00000000 --- a/Assets/Prefab/Notes/Tap_01.prefab +++ /dev/null @@ -1,203 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &7683493020796338125 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 390252578075048201} - - component: {fileID: 1195582463610512994} - m_Layer: 0 - m_Name: Tap_Ex_01 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &390252578075048201 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7683493020796338125} - serializedVersion: 2 - 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: 7955322054321000432} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &1195582463610512994 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7683493020796338125} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 182344715 - m_SortingLayer: 0 - m_SortingOrder: 1 - m_Sprite: {fileID: 21300000, guid: 3e2752c843d6e75488aa479673fcd132, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 0} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 1.28, y: 1.28} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 0 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!1 &7955322054321000439 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7955322054321000432} - - component: {fileID: 7955322054321000433} - - component: {fileID: 3419894289123108698} - m_Layer: 0 - m_Name: Tap_01 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7955322054321000432 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7955322054321000439} - serializedVersion: 2 - 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: 390252578075048201} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &7955322054321000433 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7955322054321000439} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 1842247769 - m_SortingLayer: 3 - m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: a637bcfa9453838428b7b6d590d4bf1b, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 1.22, y: 1.22} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 0 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!114 &3419894289123108698 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7955322054321000439} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c57176cc05c23a743af16831f7ec76ba, type: 3} - m_Name: - m_EditorClassIdentifier: - startPosition: 0 - time: 0 - noteSortOrder: 0 - speed: 1 - isEach: 0 - isBreak: 0 - isEX: 0 - tapSpr: {fileID: 0} - eachSpr: {fileID: 0} - breakSpr: {fileID: 0} - exSpr: {fileID: 0} - eachLine: {fileID: 21300000, guid: 1a40750ad0e4fb747aeeb83536f52d09, type: 3} - breakLine: {fileID: 21300000, guid: c190fb744a4bc94429a7cbce66f9fa9b, type: 3} - BreakShine: {fileID: 0} - tapLine: {fileID: 8134463029818261665, guid: 603ad5913a835274bafe6accdd5d812e, type: 3} - exEffectTap: {r: 1, g: 0.6745098, b: 0.88235295, a: 1} - exEffectEach: {r: 1, g: 0.99607843, b: 0.46666667, a: 1} - exEffectBreak: {r: 1, g: 0.99607843, b: 0.46666667, a: 1} - breakMaterial: {fileID: 2100000, guid: 6cea13e5ba8275446be27a38daed20c7, type: 2} diff --git a/Assets/Prefab/Notes/Tap_01.prefab.meta b/Assets/Prefab/Notes/Tap_01.prefab.meta deleted file mode 100644 index e1a77331..00000000 --- a/Assets/Prefab/Notes/Tap_01.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 97d5979fe9de8fd4198fcafd1ba2d433 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Prefab/Notes/Tap_Effect.prefab b/Assets/Prefab/Notes/Tap_Effect.prefab deleted file mode 100644 index f21cb526..00000000 --- a/Assets/Prefab/Notes/Tap_Effect.prefab +++ /dev/null @@ -1,576 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &314035495417381157 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035495417381162} - m_Layer: 0 - m_Name: GameObject (3) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035495417381162 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035495417381157} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0, y: -0.002, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 314035495445613879} - m_Father: {fileID: 314035496818238884} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &314035495432286402 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035495432286403} - m_Layer: 0 - m_Name: GameObject - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035495432286403 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035495432286402} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0, y: -0.002, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 314035497240898248} - m_Father: {fileID: 314035496818238884} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &314035495445613878 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035495445613879} - - component: {fileID: 314035495445613876} - m_Layer: 0 - m_Name: Hex - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035495445613879 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035495445613878} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0.502, y: 0.492, z: 0} - m_LocalScale: {x: 0.4788, y: 0.4788, z: 0.4788} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 314035495417381162} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &314035495445613876 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035495445613878} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 1222518565 - m_SortingLayer: 4 - m_SortingOrder: 7 - m_Sprite: {fileID: 21300000, guid: 57e073b06f82de348ab42249bc7d1730, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 2.56, y: 2.56} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!1 &314035496236606539 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035496236606536} - - component: {fileID: 314035496236606537} - m_Layer: 0 - m_Name: Hex - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035496236606536 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035496236606539} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.473, y: -0.468, z: 0} - m_LocalScale: {x: 0.4788, y: 0.4788, z: 0.4788} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 314035496713411488} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &314035496236606537 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035496236606539} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 1222518565 - m_SortingLayer: 4 - m_SortingOrder: 7 - m_Sprite: {fileID: 21300000, guid: 57e073b06f82de348ab42249bc7d1730, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 2.56, y: 2.56} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!1 &314035496680830266 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035496680830267} - m_Layer: 0 - m_Name: GameObject (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035496680830267 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035496680830266} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0, y: -0.002, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 314035497306108136} - m_Father: {fileID: 314035496818238884} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &314035496713411491 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035496713411488} - m_Layer: 0 - m_Name: GameObject (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035496713411488 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035496713411491} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0, y: -0.002, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 314035496236606536} - m_Father: {fileID: 314035496818238884} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &314035496818238881 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035496818238884} - - component: {fileID: 314035496818238887} - - component: {fileID: 314035496818238886} - m_Layer: 0 - m_Name: Tap_Effect - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035496818238884 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035496818238881} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 314035495432286403} - - {fileID: 314035496680830267} - - {fileID: 314035496713411488} - - {fileID: 314035495417381162} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} ---- !u!212 &314035496818238887 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035496818238881} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 1222518565 - m_SortingLayer: 4 - m_SortingOrder: 7 - m_Sprite: {fileID: 21300000, guid: 57e073b06f82de348ab42249bc7d1730, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 2.56, y: 2.56} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!95 &314035496818238886 -Animator: - serializedVersion: 5 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035496818238881} - m_Enabled: 1 - m_Avatar: {fileID: 0} - m_Controller: {fileID: 9100000, guid: c4cdda9b99255844a86e06be6717d65a, type: 2} - m_CullingMode: 0 - m_UpdateMode: 0 - m_ApplyRootMotion: 0 - m_LinearVelocityBlending: 0 - m_StabilizeFeet: 0 - m_WarningMessage: - m_HasTransformHierarchy: 1 - m_AllowConstantClipSamplingOptimization: 1 - m_KeepAnimatorStateOnDisable: 0 - m_WriteDefaultValuesOnDisable: 0 ---- !u!1 &314035497240898251 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035497240898248} - - component: {fileID: 314035497240898249} - m_Layer: 0 - m_Name: Hex - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035497240898248 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035497240898251} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.552, y: 0.5, z: 0} - m_LocalScale: {x: 0.4788, y: 0.4788, z: 0.4788} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 314035495432286403} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &314035497240898249 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035497240898251} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 1222518565 - m_SortingLayer: 4 - m_SortingOrder: 7 - m_Sprite: {fileID: 21300000, guid: 57e073b06f82de348ab42249bc7d1730, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 2.56, y: 2.56} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!1 &314035497306108139 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 314035497306108136} - - component: {fileID: 314035497306108137} - m_Layer: 0 - m_Name: Hex - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &314035497306108136 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035497306108139} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0.431, y: -0.527, z: 0} - m_LocalScale: {x: 0.4788, y: 0.4788, z: 0.4788} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 314035496680830267} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &314035497306108137 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 314035497306108139} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 1222518565 - m_SortingLayer: 4 - m_SortingOrder: 7 - m_Sprite: {fileID: 21300000, guid: 57e073b06f82de348ab42249bc7d1730, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 2.56, y: 2.56} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 diff --git a/Assets/Prefab/Notes/Tap_Effect.prefab.meta b/Assets/Prefab/Notes/Tap_Effect.prefab.meta deleted file mode 100644 index f61dec7d..00000000 --- a/Assets/Prefab/Notes/Tap_Effect.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 3edd06a81e4ec844bb281d728dce49b2 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Script/DontDestroy/IO/InputManager.cs b/Assets/Script/DontDestroy/IO/InputManager.cs index 2bee50f6..3fa98fe4 100644 --- a/Assets/Script/DontDestroy/IO/InputManager.cs +++ b/Assets/Script/DontDestroy/IO/InputManager.cs @@ -30,6 +30,8 @@ public partial class InputManager : MonoBehaviour public event EventHandler? OnAnyAreaTrigger; + TimeSpan _btnDebounceTime = TimeSpan.Zero; + TimeSpan _sensorDebounceTime = TimeSpan.Zero; bool[] _COMReport = Enumerable.Repeat(false,35).ToArray(); Task? _recvTask = null; Mutex _buttonCheckerMutex = new(); @@ -53,7 +55,44 @@ void Awake() _instanceID2SensorTypeMappingTable[childCollider.GetInstanceID()] = type; } } - + foreach(SensorType zone in Enum.GetValues(typeof(SensorType))) + { + if (((int)zone).InRange(0, 7)) + { + _btnLastTriggerTimes[zone] = DateTime.MinValue; + } + _sensorLastTriggerTimes[zone] = DateTime.MinValue; + } + } + /// + /// Used to check whether the device activation is caused by abnormal jitter + /// + /// + /// + /// If the trigger interval is lower than the debounce threshold, returns true, otherwise false + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected bool JitterDetect(SensorType zone, DateTime now,bool isBtn = false) + { + DateTime lastTriggerTime; + TimeSpan debounceTime; + if(isBtn) + { + _btnLastTriggerTimes.TryGetValue(zone, out lastTriggerTime); + debounceTime = _btnDebounceTime; + } + else + { + _sensorLastTriggerTimes.TryGetValue(zone, out lastTriggerTime); + debounceTime = _sensorDebounceTime; + } + var diff = now - lastTriggerTime; + if (diff < debounceTime) + { + Debug.Log($"[Debounce] Received {(isBtn?"button":"sensor")} response\nZone: {zone}\nInterval: {diff.Milliseconds}ms"); + return true; + } + return false; } void CheckEnvironment(bool forceQuit = true) { @@ -97,6 +136,8 @@ void Start() } void StartInternalIOManager() { + _btnDebounceTime = TimeSpan.FromMilliseconds(MajInstances.Setting.Misc.InputDevice.ButtonRing.DebounceThresholdMs); + _sensorDebounceTime = TimeSpan.FromMilliseconds(MajInstances.Setting.Misc.InputDevice.TouchPanel.DebounceThresholdMs); RawInput.Start(); RawInput.OnKeyDown += OnRawKeyDown; RawInput.OnKeyUp += OnRawKeyUp; diff --git a/Assets/Script/DontDestroy/IO/RawInputListener.cs b/Assets/Script/DontDestroy/IO/RawInputListener.cs index b19a19a9..6c2ccdc7 100644 --- a/Assets/Script/DontDestroy/IO/RawInputListener.cs +++ b/Assets/Script/DontDestroy/IO/RawInputListener.cs @@ -2,6 +2,7 @@ using MajdataPlay.Types; using MychIO.Device; using System; +using System.Collections.Generic; using System.Linq; using Unity.VisualScripting; using UnityEngine; @@ -26,6 +27,7 @@ public partial class InputManager : MonoBehaviour RawKey.Numpad7, RawKey.Numpad3, }; + readonly Dictionary _btnLastTriggerTimes = new(); Button[] _buttons = new Button[12] { new Button(RawKey.W,SensorType.A1), @@ -56,8 +58,12 @@ void UpdateButtonState() } var oldState = button.Status; var newState = RawInput.IsKeyDown(keyId) ? SensorStatus.On : SensorStatus.Off; + var now = DateTime.Now; if (oldState == newState) continue; + else if (JitterDetect(button.Type, now, true)) + continue; + _btnLastTriggerTimes[button.Type] = now; button.Status = newState; Debug.Log($"Key \"{button.BindingKey}\": {newState}"); var msg = new InputEventArgs() @@ -123,8 +129,12 @@ void OnKeyStateChanged(RawKey key,SensorStatus state) } var oldState = button.Status; var newState = state; + var now = DateTime.Now; if (oldState == newState) return; + else if (JitterDetect(button.Type, now, true)) + return; + _btnLastTriggerTimes[button.Type] = now; button.Status = newState; Debug.Log($"Key \"{button.BindingKey}\": {newState}"); var msg = new InputEventArgs() diff --git a/Assets/Script/DontDestroy/IO/SensorManager.cs b/Assets/Script/DontDestroy/IO/SensorManager.cs index d77976e7..5e14d4ba 100644 --- a/Assets/Script/DontDestroy/IO/SensorManager.cs +++ b/Assets/Script/DontDestroy/IO/SensorManager.cs @@ -1,6 +1,7 @@ using MajdataPlay.Extensions; using MajdataPlay.Types; using System; +using System.Collections.Generic; using UnityEngine; #nullable enable namespace MajdataPlay.IO @@ -8,7 +9,7 @@ namespace MajdataPlay.IO public partial class InputManager : MonoBehaviour { readonly Sensor[] _sensors = new Sensor[33]; - + readonly Dictionary _sensorLastTriggerTimes = new(); void UpdateSensorState() { foreach(var (index, on) in _COMReport.WithIndex()) @@ -32,6 +33,10 @@ void UpdateSensorState() nState = _COMReport[16] || _COMReport[17] ? SensorStatus.On : SensorStatus.Off; if(oState != nState) { + var now = DateTime.Now; + if (JitterDetect(sensor.Type, now)) + continue; + _sensorLastTriggerTimes[sensor.Type] = now; Debug.Log($"Sensor \"{sensor.Type}\": {nState}"); sensor.Status = nState; var msg = new InputEventArgs() diff --git a/Assets/Script/Game/Controllers/BreakShineController.cs b/Assets/Script/Game/Controllers/BreakShineController.cs index 5293f4c7..f22fcb58 100644 --- a/Assets/Script/Game/Controllers/BreakShineController.cs +++ b/Assets/Script/Game/Controllers/BreakShineController.cs @@ -7,18 +7,24 @@ namespace MajdataPlay.Game.Controllers { public class BreakShineController : MonoBehaviour, IUpdatableComponent { - public bool Active { get; private set; } + public bool Active { get; set; } public NoteStatus State => ((IStatefulNote?)Parent)?.State ?? NoteStatus.Destroyed; public IFlasher? Parent { get; set; } = null; public SpriteRenderer? Renderer { get; set; } = null; + + static readonly int _id1 = Shader.PropertyToID("_Brightness"); + static readonly int _id2 = Shader.PropertyToID("_Contrast"); + GamePlayManager _gpManager; + Material _material; void Start() { if(Renderer is null) Renderer = GetComponent(); _gpManager = MajInstanceHelper.Instance!; - Active = true; + _material = Renderer.material; + //Active = true; } void OnDestroy() { @@ -31,11 +37,10 @@ public void ComponentUpdate() if (Parent is not null && Parent.CanShine) { var param = _gpManager.BreakParam; - var material = Renderer.material; - if (material is null) + if (_material is null) return; - material.SetFloat("_Brightness", param.Brightness); - material.SetFloat("_Contrast", param.Contrast); + _material.SetFloat(_id1, param.Brightness); + _material.SetFloat(_id2, param.Contrast); } } } diff --git a/Assets/Script/Game/Controllers/BreakSlideShineController.cs b/Assets/Script/Game/Controllers/BreakSlideShineController.cs index 3520eb07..64283e9d 100644 --- a/Assets/Script/Game/Controllers/BreakSlideShineController.cs +++ b/Assets/Script/Game/Controllers/BreakSlideShineController.cs @@ -14,14 +14,17 @@ namespace MajdataPlay.Game.Controllers { public class BreakSlideShineController : MonoBehaviour, IUpdatableComponent { - public bool Active { get; private set; } + public bool Active { get; set; } public NoteStatus State => ((IStatefulNote?)Parent)?.State ?? NoteStatus.Destroyed; public IFlasher? Parent { get; set; } = null; public SpriteRenderer[] Renderers { get; set; } = ArrayPool.Shared.Rent(0); NoteStatus _state = NoteStatus.Start; GamePlayManager _gpManager; + Material[] _materials = { }; + static readonly int _id1 = Shader.PropertyToID("_Brightness"); + static readonly int _id2 = Shader.PropertyToID("_Contrast"); public void Initialize() { if (_state >= NoteStatus.Initialized) @@ -33,16 +36,23 @@ public void Initialize() { var parentObject = Parent.GameObject; var barCount = parentObject.transform.childCount - 1; - Renderers = ArrayPool.Shared.Rent(barCount); + Renderers = new SpriteRenderer[barCount]; for (int i = 0; i < barCount; i++) Renderers[i] = parentObject.transform.GetChild(i).GetComponent(); } + _state = NoteStatus.Initialized; } void Start() { Initialize(); - Active = true; + //Active = true; + _materials = new Material[Renderers.Length]; + for (var i = 0; i < _materials.Length; i++) + { + var renderer = Renderers[i]; + _materials[i] = renderer.material; + } } public void ComponentUpdate() { @@ -53,15 +63,10 @@ public void ComponentUpdate() try { var param = _gpManager.BreakParam; - foreach (var renderer in Renderers) + foreach(var material in _materials.AsSpan()) { - var material = renderer?.material; - if (renderer is null) - continue; - if (material is null) - continue; - material.SetFloat("_Brightness", param.Brightness); - material.SetFloat("_Contrast", param.Contrast); + material.SetFloat(_id1, param.Brightness); + material.SetFloat(_id2, param.Contrast); } } catch @@ -72,7 +77,7 @@ public void ComponentUpdate() } void OnDestroy() { - ArrayPool.Shared.Return(Renderers); + //ArrayPool.Shared.Return(Renderers); Active = false; } } diff --git a/Assets/Script/Game/NoteControllers/NotePoolManager.cs b/Assets/Script/Game/NoteControllers/NotePoolManager.cs index 7f18c0b0..9f221860 100644 --- a/Assets/Script/Game/NoteControllers/NotePoolManager.cs +++ b/Assets/Script/Game/NoteControllers/NotePoolManager.cs @@ -13,7 +13,6 @@ public class NotePoolManager: MonoBehaviour NotePool tapPool; NotePool holdPool; - SlideLauncherPool starPool; NotePool touchPool; NotePool touchHoldPool; EachLinePool eachLinePool; @@ -21,8 +20,6 @@ public class NotePoolManager: MonoBehaviour [SerializeField] GameObject tapPrefab; [SerializeField] - GameObject starPrefab; - [SerializeField] GameObject holdPrefab; [SerializeField] GameObject touchPrefab; @@ -46,13 +43,11 @@ public void Initialize() { var tapParent = transform.GetChild(0); var holdParent = transform.GetChild(1); - var starParent = transform.GetChild(2); var touchParent = transform.GetChild(4); var touchHoldParent = transform.GetChild(5); var eachLineParent = transform.GetChild(6); tapPool = new (tapPrefab, tapParent, tapInfos.ToArray(),128); holdPool = new (holdPrefab, holdParent, holdInfos.ToArray(),64); - starPool = new (starPrefab, starParent, starInfos.ToArray(),128); touchPool = new (touchPrefab, touchParent, touchInfos.ToArray(),64); touchHoldPool = new (touchHoldPrefab, touchHoldParent, touchHoldInfos.ToArray(),64); eachLinePool = new (eachLinePrefab, eachLineParent, eachLineInfos.ToArray(),64); @@ -69,17 +64,13 @@ void Update() var currentSec = _gpManager.AudioTime; tapPool.Update(currentSec); holdPool.Update(currentSec); - starPool.Update(currentSec); touchPool.Update(currentSec); touchHoldPool.Update(currentSec); eachLinePool.Update(currentSec); } public void AddTap(TapPoolingInfo tapInfo) { - if (tapInfo.IsStar) - starInfos.Add(tapInfo); - else - tapInfos.Add(tapInfo); + tapInfos.Add(tapInfo); } public void AddHold(HoldPoolingInfo holdInfo) { @@ -107,9 +98,6 @@ public void Collect(TNote endNote) case HoldDrop hold: holdPool.Collect(hold); break; - case StarDrop star: - starPool.Collect(star); - break; case EachLineDrop eachLine: eachLinePool.Collect(eachLine); break; @@ -125,7 +113,6 @@ void OnDestroy() { tapPool?.Destroy(); holdPool?.Destroy(); - starPool?.Destroy(); touchPool?.Destroy(); touchHoldPool?.Destroy(); eachLinePool?.Destroy(); diff --git a/Assets/Script/Game/NoteControllers/SlideUpdater.cs b/Assets/Script/Game/NoteControllers/SlideUpdater.cs index dcc629d4..00ad8b4a 100644 --- a/Assets/Script/Game/NoteControllers/SlideUpdater.cs +++ b/Assets/Script/Game/NoteControllers/SlideUpdater.cs @@ -1,9 +1,51 @@ -namespace MajdataPlay.Game +using MajdataPlay.Types; +using MajdataPlay.Utils; +using System; +#nullable enable +namespace MajdataPlay.Game { public class SlideUpdater : NoteUpdater { + SlideQueueInfo?[] _queueInfos = Array.Empty(); + + GamePlayManager _gpManager; + private void Awake() + { + MajInstanceHelper.Instance = this; + } + private void Start() + { + _gpManager = MajInstanceHelper.Instance!; + } + public void AddSlideQueueInfos(SlideQueueInfo[] infos) + { + if (infos is null) + throw new ArgumentNullException(); + _queueInfos = infos; + } protected override void FixedUpdate() => base.FixedUpdate(); protected override void LateUpdate() => base.LateUpdate(); - protected override void Update() => base.Update(); + protected override void Update() + { + var gameTime = _gpManager.AudioTime; + for (var i = 0; i < _queueInfos.Length; i++) + { + ref var info = ref _queueInfos[i]; + if (info is null) + continue; + var appearTiming = info.AppearTiming; + if(gameTime >= appearTiming) + { + info.SlideObject.SetActive(true); + info = null; + } + + } + base.Update(); + } + private void OnDestroy() + { + MajInstanceHelper.Free(); + } } } diff --git a/Assets/Script/Game/NoteLoader.cs b/Assets/Script/Game/NoteLoader.cs index 87d15d6a..c3690d45 100644 --- a/Assets/Script/Game/NoteLoader.cs +++ b/Assets/Script/Game/NoteLoader.cs @@ -49,11 +49,14 @@ public float TouchSpeed int _slideLayer = -1; int _noteSortOrder = 0; int _touchSortOrder = 0; + int _slideIndex = 0; + List _slideQueueInfos = new(); NoteManager _noteManager; Dictionary _noteIndex = new(); Dictionary _touchIndex = new(); + SlideUpdater _slideUpdater; GamePlayManager _gpManager; ObjectCounter _objectCounter; NotePoolManager _poolManager; @@ -206,6 +209,7 @@ private void Start() _noteManager = MajInstanceHelper.Instance!; _poolManager = MajInstanceHelper.Instance!; _gpManager = MajInstanceHelper.Instance!; + _slideUpdater = MajInstanceHelper.Instance!; } public async UniTask LoadNotesIntoPool(SimaiProcess simaiProcess) { @@ -365,6 +369,7 @@ public async UniTask LoadNotesIntoPool(SimaiProcess simaiProcess) State = NoteLoaderStatus.Error; throw e; } + _slideUpdater.AddSlideQueueInfos(_slideQueueInfos.ToArray()); _poolManager.Initialize(); State = NoteLoaderStatus.Finished; } @@ -401,9 +406,7 @@ TapPoolingInfo CreateTap(in SimaiNote note, in SimaiTimingPoint timing) IsBreak = note.isBreak, IsEX = note.isEx, IsStar = note.isForceStar, - IsNoHead = false, - IsFakeStar = note.isForceStar, - IsForceRotate = note.isFakeRotate, + RotateSpeed = note.isFakeRotate ? -440f: 0, QueueInfo = new TapQueueInfo() { Index = _noteIndex[startPos]++, @@ -450,7 +453,7 @@ HoldPoolingInfo CreateHold(in SimaiNote note, in SimaiTimingPoint timing) } }; } - TapPoolingInfo CreateStar(SimaiNote note, in SimaiTimingPoint timing,GameObject slide) + TapPoolingInfo CreateStar(SimaiNote note, in SimaiTimingPoint timing) { var startPos = note.startPosition; var noteTiming = (float)timing.time; @@ -510,12 +513,8 @@ TapPoolingInfo CreateStar(SimaiNote note, in SimaiTimingPoint timing,GameObject IsBreak = note.isBreak, IsEX = note.isEx, IsStar = true, - IsNoHead = note.isSlideNoHead, - IsFakeStar = false, - IsForceRotate = false, IsDouble = isDouble, - RotateSpeed = (float)note.slideTime, - Slide = slide, + RotateSpeed = -180 / (float)note.slideTime, QueueInfo = queueInfo ?? TapQueueInfo.Default }; } @@ -871,16 +870,22 @@ double getTimeFromBeats(string noteText, float currentBpm) float totalLen = (float)subSlide.Select(x => x.slideTime).Sum(); float startTiming = (float)subSlide[0].slideStartTime; float totalSlideLen = 0; + CreateSlideResult? slideResult = null; for (var i = 0; i <= subSlide.Count - 1; i++) { bool isConn = subSlide.Count != 1; bool isGroupHead = i == 0; bool isGroupEnd = i == subSlide.Count - 1; + SlideBase sliObj; + if (note.noteContent!.Contains('w')) //wifi { if (isConn) throw new InvalidOperationException("不允许Wifi Slide作为Connection Slide的一部分"); - CreateWifi(timing, subSlide[i]); + var result = CreateWifi(timing, subSlide[i]); + sliObj = result.SlideInstance; + AddSlideToQueue(timing, result.SlideInstance); + UpdateStarRotateSpeed(result, (float)subSlide[i].slideTime, 8.93760109f); } else { @@ -893,9 +898,14 @@ double getTimeFromBeats(string noteText, float currentBpm) Parent = parent, StartTiming = startTiming }; - parent = CreateSlide(timing, subSlide[i], info); - subSlides.Add(parent.GameObject.GetComponent()); + var result = CreateSlide(timing, subSlide[i], info); + parent = result.SlideInstance; + sliObj = result.SlideInstance; + subSlides.Add(result.SlideInstance); + if(i == 0) + slideResult = result; } + AddSlideToQueue(timing, sliObj); } long judgeQueueLen = 0; var slideCount = subSlides.Count; @@ -917,8 +927,37 @@ double getTimeFromBeats(string noteText, float currentBpm) s.ConnectInfo.TotalSlideLen = totalSlideLen; s.ConnectInfo.TotalJudgeQueueLen = judgeQueueLen; }); + if(slideResult is not null) + { + UpdateStarRotateSpeed((CreateSlideResult)slideResult, totalLen, totalSlideLen); + } + } + void UpdateStarRotateSpeed(CreateSlideResult result,float totalLen,float totalSlideLen) where T: SlideBase + { + var speed = totalSlideLen / (totalLen * 1000); + var ratio = speed / 0.0034803742562305f; + + if (result.StarInfo is not null) + { + var starInfo = result.StarInfo; + starInfo.RotateSpeed = Math.Max(-(68.54838709677419f) * ratio,-1080); + } + } + void AddSlideToQueue(SimaiTimingPoint timing,T SliCompo) where T :SlideBase + { + var speed = NoteSpeed * timing.HSpeed; + var scaleRate = MajInstances.Setting.Debug.NoteAppearRate; + var slideFadeInTiming = (-3.926913f / speed) + MajInstances.Setting.Game.SlideFadeInOffset + (float)timing.time; + var appearDiff = (-(1 - (scaleRate * 1.225f)) - (4.8f * scaleRate)) / (Math.Abs(speed) * scaleRate); + var appearTiming = (float)timing.time + appearDiff; + _slideQueueInfos.Add(new() + { + Index = _slideIndex++, + SlideObject = SliCompo, + AppearTiming = Math.Min(appearTiming, slideFadeInTiming) + }); } - private IConnectableSlide CreateSlide(SimaiTimingPoint timing, SubSlideNote note, ConnSlideInfo info) + private CreateSlideResult CreateSlide(SimaiTimingPoint timing, SubSlideNote note, ConnSlideInfo info) { string slideShape = detectShapeFromText(note.noteContent); var isMirror = false; @@ -940,8 +979,14 @@ private IConnectableSlide CreateSlide(SimaiTimingPoint timing, SubSlideNote note startPos = Rotation(startPos); endPos = Rotation(endPos); - _poolManager.AddTap(CreateStar(note, timing, slide)); - + TapPoolingInfo? starInfo = null; + if(!note.isSlideNoHead) + { + var _info = CreateStar(note, timing); + _poolManager.AddTap(_info); + starInfo = _info; + } + SliCompo.SlideType = slideShape; if (timing.noteList.Count > 1) @@ -996,18 +1041,14 @@ private IConnectableSlide CreateSlide(SimaiTimingPoint timing, SubSlideNote note _slideLayer -= SLIDE_AREA_STEP_MAP[slideShape].Last(); } //slideLayer += 5; - return SliCompo; - } - int FindSlide(List notes,in SimaiNote note) - { - for (int i = 0; i < notes.Count; i++) + + return new() { - if (note == notes[i]) - return i; - } - return -1; + SlideInstance = SliCompo, + StarInfo = starInfo + }; } - private GameObject CreateWifi(SimaiTimingPoint timing, SubSlideNote note) + private CreateSlideResult CreateWifi(SimaiTimingPoint timing, SubSlideNote note) { var str = note.noteContent.Substring(0, 3); var digits = str.Split('w'); @@ -1027,7 +1068,13 @@ private GameObject CreateWifi(SimaiTimingPoint timing, SubSlideNote note) endPos = Rotation(endPos); slideWifi.SetActive(true); - _poolManager.AddTap(CreateStar(note, timing, slideWifi)); + TapPoolingInfo? starInfo = null; + if (!note.isSlideNoHead) + { + var _info = CreateStar(note, timing); + _poolManager.AddTap(_info); + starInfo = _info; + } if (timing.noteList.Count > 1) { @@ -1074,7 +1121,11 @@ private GameObject CreateWifi(SimaiTimingPoint timing, SubSlideNote note) } //slideLayer += 5; - return slideWifi; + return new() + { + SlideInstance = WifiCompo, + StarInfo = starInfo + }; } /// /// 判断Slide SlideOK是否需要镜像翻转 @@ -1406,14 +1457,20 @@ int Rotation(int keyIndex) var newKey = key.Diff(ChartRotation); return newKey.GetIndex(); } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + SensorType Rotation(SensorType sensorIndex) + { + return sensorIndex.Diff(ChartRotation); + } class SubSlideNote : SimaiNote { public SimaiNote Origin { get; set; } = new(); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - SensorType Rotation(SensorType sensorIndex) + readonly struct CreateSlideResult where T : SlideBase { - return sensorIndex.Diff(ChartRotation); + public T SlideInstance { get; init; } + public TapPoolingInfo? StarInfo { get; init; } } } } \ No newline at end of file diff --git a/Assets/Script/Game/Notes/NoteDrop.cs b/Assets/Script/Game/Notes/NoteDrop.cs index 39cb2db9..256d887f 100644 --- a/Assets/Script/Game/Notes/NoteDrop.cs +++ b/Assets/Script/Game/Notes/NoteDrop.cs @@ -57,7 +57,14 @@ public bool IsEX set => _isEX = value; } - public GameObject GameObject => gameObject; + /// + /// Provides a cached GameObject instance + /// + public GameObject GameObject => _gameObject; + /// + /// Provides a cached Transform instance + /// + public Transform Transform => _transform; public bool IsInitialized => State >= NoteStatus.Initialized; public bool IsDestroyed => State == NoteStatus.Destroyed; public bool IsClassic => _gameSetting.Judge.Mode == JudgeMode.Classic; @@ -90,6 +97,14 @@ public NoteStatus State protected NoteAudioManager _audioEffMana; protected GameSetting _gameSetting = MajInstances.Setting; protected static readonly Random _randomizer = new(); + + GameObject _gameObject; + Transform _transform; + void Awake() + { + _gameObject = gameObject; + _transform = transform; + } protected virtual void Start() { _effectManager = MajInstanceHelper.Instance!; diff --git a/Assets/Script/Game/Notes/SlideBase.cs b/Assets/Script/Game/Notes/SlideBase.cs index 9b390bce..49fe212f 100644 --- a/Assets/Script/Game/Notes/SlideBase.cs +++ b/Assets/Script/Game/Notes/SlideBase.cs @@ -1,5 +1,6 @@ using Cysharp.Threading.Tasks; using MajdataPlay.Extensions; +using MajdataPlay.Game.Controllers; using MajdataPlay.Interfaces; using MajdataPlay.IO; using MajdataPlay.Types; @@ -100,21 +101,30 @@ public string SlideType [SerializeField] protected SpriteRenderer[] _slideBarRenderers = { }; - - - + protected Transform[] _starTransforms = { }; + protected Transform[] _slideBarTransforms = { }; /// /// Slide star /// public GameObject?[] _stars = new GameObject[3]; protected GameObject _slideOK; - protected bool _isSoundPlayed = false; + protected Animator _slideOKAnim; + protected LoadJustSprite _slideOKController; + protected BreakShineController? _starShineController; + protected BreakSlideShineController? _slideBarShineController; + protected float _lastWaitTime; protected bool _canCheck = false; - protected bool _isChecking = false; - protected float _maxFadeInAlpha = 0.5f; // 淡入时最大不透明度 + + // Flags + protected bool _isSoundPlayed = false; + protected bool _isChecking = false; + protected bool _isStarActive = false; + protected bool _isArrived = false; + + /// /// 存储Slide Queue中会经过的区域 /// 用于绑定或解绑Event @@ -259,28 +269,43 @@ public override void SetActive(bool state) _ioManager.BindSensor(Check, sensor); State = NoteStatus.Running; } - Active = true; foreach (var slideBar in _slideBars.AsSpan()) slideBar.layer = 0; - foreach (var star in _stars.AsSpan()) - { - if (star is null) - continue; - star.layer = 0; - } } else { - Active = false; + foreach (var slideBar in _slideBars.AsSpan()) slideBar.layer = 3; - foreach (var star in _stars.AsSpan()) - { - if (star is null) - continue; - star.layer = 3; - } } + SetStarActive(state); + Active = state; + } + protected void SetStarActive(bool state) + { + switch(state) + { + case true: + foreach (var star in _stars.AsSpan()) + { + if (star is null) + continue; + star.layer = 0; + } + break; + case false: + foreach (var star in _stars.AsSpan()) + { + if (star is null) + continue; + star.layer = 3; + } + break; + } + if (_starShineController is not null) + _starShineController.Active = state; + if (_slideBarShineController is not null) + _slideBarShineController.Active = state; } protected override void PlaySFX() { @@ -314,9 +339,10 @@ public virtual void End(bool forceEnd = false) if (Parent is not null && !Parent.IsDestroyed) Parent.End(true); CanShine = false; - foreach (GameObject obj in _slideBars) - obj.SetActive(false); - DestroyStars(); + //foreach (var obj in _slideBars.AsSpan()) + // obj.SetActive(false); + //DestroyStars(); + SetActive(false); } /// /// Connection Slide @@ -335,7 +361,10 @@ protected void DestroyStars() { if (_stars.IsEmpty()) return; - GameObjectHelper.Destroy(ref _stars); + SetStarActive(false); + foreach (ref var star in _stars.AsSpan()) + star = null; + //GameObjectHelper.Destroy(ref _stars); } protected async UniTaskVoid FadeIn() { diff --git a/Assets/Script/Game/Notes/SlideDrop.cs b/Assets/Script/Game/Notes/SlideDrop.cs index 3f31bbee..a6e9d0b5 100644 --- a/Assets/Script/Game/Notes/SlideDrop.cs +++ b/Assets/Script/Game/Notes/SlideDrop.cs @@ -49,28 +49,36 @@ public override void Initialize() throw new MissingComponentException("Slide star not found"); _table = slideTable; - _slideOK = transform.GetChild(transform.childCount - 1).gameObject; //slideok is the last one + + _slideOK = transform.GetChild(transform.childCount - 1).gameObject; //slideok is the last one + _slideOKAnim = _slideOK.GetComponent(); + _slideOKController = _slideOK.GetComponent(); + + _starTransforms = new Transform[1]; + _starTransforms[0] = star.transform; _starRenderer = star.GetComponent(); _slideBars = new GameObject[transform.childCount - 1]; + _slideBarTransforms = new Transform[transform.childCount - 1]; _slideBarRenderers = new SpriteRenderer[transform.childCount - 1]; - for (var i = 0; i < transform.childCount - 1; i++) + for (var i = 0; i < Transform.childCount - 1; i++) { - _slideBars[i] = transform.GetChild(i).gameObject; + _slideBars[i] = Transform.GetChild(i).gameObject; _slideBarRenderers[i] = _slideBars[i].GetComponent(); + _slideBarTransforms[i] = _slideBars[i].transform; } if (_isMirror) { _table.Mirror(); - transform.localScale = new Vector3(-1f, 1f, 1f); - transform.rotation = Quaternion.Euler(0f, 0f, -45f * StartPos); + Transform.localScale = new Vector3(-1f, 1f, 1f); + Transform.rotation = Quaternion.Euler(0f, 0f, -45f * StartPos); _slideOK.transform.localScale = new Vector3(-1f, 1f, 1f); } else { - transform.rotation = Quaternion.Euler(0f, 0f, -45f * (StartPos - 1)); + Transform.rotation = Quaternion.Euler(0f, 0f, -45f * (StartPos - 1)); } var diff = Math.Abs(1 - StartPos); @@ -80,6 +88,7 @@ public override void Initialize() LoadPath(); LoadSkin(); SetActive(false); + SetStarActive(false); // 计算Slide淡入时机 // 在8.0速时应当提前300ms显示Slide _fadeInTiming = -3.926913f / Speed; @@ -95,6 +104,8 @@ public override void Initialize() //fadeInAnimator.speed = 0.2f / interval; //fadeInAnimator.SetTrigger("slide"); SetSlideBarAlpha(0f); + _starTransforms[0].position = _slidePositions[0]; + _starTransforms[0].transform.localScale = new Vector3(0f, 0f, 1f); _judgeQueues[0] = _table.JudgeQueue; if (ConnectInfo.IsConnSlide && ConnectInfo.IsGroupPartEnd) @@ -219,14 +230,28 @@ public override void ComponentUpdate() { // ConnSlide var star = _stars[0]; + var starTransform = _starTransforms[0]; if (_stars.IsEmpty() || star is null) { if (IsFinished) + { End(); + return; + } + Check(); + return; + } + else if(_isArrived) + { + Check(); return; } - star.SetActive(true); + if(!_isStarActive) + { + SetStarActive(true); + _isStarActive = true; + } var timing = CurrentSec - Timing; if (timing <= 0f) { @@ -243,12 +268,14 @@ public override void ComponentUpdate() } _starRenderer.color = new Color(1, 1, 1, alpha); - star.transform.localScale = new Vector3(alpha + 0.5f, alpha + 0.5f, alpha + 0.5f); - star.transform.position = _slidePositions[0]; + starTransform.localScale = new Vector3(alpha + 0.5f, alpha + 0.5f, alpha + 0.5f); + starTransform.position = _slidePositions[0]; ApplyStarRotation(_slideRotations[0]); } else - UpdateStar(); + { + StarUpdate(); + } Check(); } /// @@ -372,28 +399,27 @@ public override void End(bool forceEnd = false) if (IsBreak && _judgeResult == JudgeType.Perfect) { - var anim = _slideOK.GetComponent(); - anim.runtimeAnimatorController = MajInstances.SkinManager.JustBreak; + _slideOKAnim.runtimeAnimatorController = MajInstances.SkinManager.JustBreak; } - _slideOK.GetComponent().SetResult(_judgeResult); + _slideOKController.SetResult(_judgeResult); PlayJudgeSFX(result); PlaySlideOK(result); } else Destroy(_slideOK); - Destroy(gameObject); + // Destroy(gameObject); + //SetActive(false); } /// /// 更新引导Star状态 /// 包括位置,角度 /// - void UpdateStar() + void StarUpdate() { - var star = _stars[0]; - if (star is null) - return; + var starTransform = _starTransforms[0]; + _starRenderer.color = Color.white; - star.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f); + starTransform.localScale = new Vector3(1.5f, 1.5f, 1.5f); var process = MathF.Min((Length - GetRemainingTimeWithoutOffset()) / Length, 1); var indexProcess = (_slidePositions.Count - 1) * process; @@ -402,10 +428,11 @@ void UpdateStar() if (process == 1) { - star.transform.position = _slidePositions.LastOrDefault(); - ApplyStarRotation(_slideRotations.LastOrDefault()); + starTransform.position = _slidePositions[_slidePositions.Count - 1]; + ApplyStarRotation(_slideRotations[_slideRotations.Count - 1]); if (ConnectInfo.IsConnSlide && !ConnectInfo.IsGroupPartEnd) DestroyStars(); + _isArrived = true; } else { @@ -414,7 +441,7 @@ void UpdateStar() var ba = a - b; var newPos = ba * pos + b; - star.transform.position = newPos; + starTransform.position = newPos; if (index < _slideRotations.Count - 1) { var _a = _slideRotations[index + 1].eulerAngles.z; @@ -462,27 +489,63 @@ void UpdateStar() } void ApplyStarRotation(Quaternion newRotation) { + var star = _stars[0]; + var starTransform = _starTransforms[0]; + if (star is null) + return; var halfFlip = newRotation.eulerAngles; - var star = _stars[0]!; halfFlip.z += 180f; if (_isSpecialFlip) - star.transform.rotation = Quaternion.Euler(halfFlip); + starTransform.rotation = Quaternion.Euler(halfFlip); else - star.transform.rotation = newRotation; + starTransform.rotation = newRotation; + //starTransform.rotation = newRotation; } void LoadPath() { _slidePositions.Add(GetPositionFromDistance(4.8f)); - foreach (var bar in _slideBars) + for (int i = 0; i < _slideBars.Length; i++) { + var bar = _slideBars[i]; _slidePositions.Add(bar.transform.position); _slideRotations.Add(Quaternion.Euler(bar.transform.rotation.normalized.eulerAngles + new Vector3(0f, 0f, 18f))); + if(i == _slideBars.Length - 1) + { + var a = _slideBars[i - 1].transform.rotation.normalized.eulerAngles; + var b = bar.transform.rotation.normalized.eulerAngles; + var diff = a - b; + var newEulerAugle = b - diff; + _slideRotations.Add(Quaternion.Euler(newEulerAugle + new Vector3(0f, 0f, 18f))); + //if(diff.z != 0) + //{ + // var _a = _slideBars[i - 1].transform.position; + // var _b = bar.transform.position; + // var m = (_a - _b).magnitude; + // var _c = m / Mathf.Tan(Mathf.Deg2Rad * 5.625f); + // var d = GetPositionFromDistance(4.8f, _endPos); + + // var _m = (_b - d).magnitude; + // var angle = Mathf.Atan(_m / _c) * Mathf.Rad2Deg; + // var newEulerAugle = new Vector3(0, 0, angle); + // var magicNum = angle / 5.625f * 18f; + // if (diff.z < 0) + // { + // newEulerAugle = new Vector3(0, 0, -angle); + // } + // newEulerAugle = b - newEulerAugle; + // _slideRotations.Add(Quaternion.Euler(newEulerAugle + new Vector3(0f, 0f, magicNum))); + //} + //else + //{ + // _slideRotations.Add(Quaternion.Euler(bar.transform.rotation.normalized.eulerAngles + new Vector3(0f, 0f, 18f))); + //} + } } var endPos = GetPositionFromDistance(4.8f, _endPos); _slidePositions.Add(endPos); - _slideRotations.Add(_slideRotations.LastOrDefault()); + //_slideRotations.Add(_slideRotations.LastOrDefault()); } protected override void LoadSkin() { @@ -503,9 +566,9 @@ protected override void LoadSkin() barSprite = skin.Break; starSprite = skin.Star.Break; breakMaterial = skin.BreakMaterial; - var controller = gameObject.AddComponent(); - controller.Parent = this; - controller.Initialize(); + _slideBarShineController = gameObject.AddComponent(); + _slideBarShineController.Parent = this; + _slideBarShineController.Initialize(); } foreach(var bar in bars) @@ -532,8 +595,8 @@ protected override void LoadSkin() if (breakMaterial != null) { starRenderer.material = breakMaterial; - var controller = star.AddComponent(); - controller.Parent = this; + _starShineController = star.AddComponent(); + _starShineController.Parent = this; } if (_isJustR) diff --git a/Assets/Script/Game/Notes/StarDrop.cs b/Assets/Script/Game/Notes/StarDrop.cs deleted file mode 100644 index c9026684..00000000 --- a/Assets/Script/Game/Notes/StarDrop.cs +++ /dev/null @@ -1,202 +0,0 @@ -using MajdataPlay.Game.Controllers; -using MajdataPlay.Interfaces; -using MajdataPlay.Utils; -using MajdataPlay.Types; -using System; -using UnityEngine; -using MajdataPlay.Buffers; -#nullable enable -namespace MajdataPlay.Game.Notes -{ - public sealed class StarDrop : TapBase, ISlideLauncher, IPoolableNote - { - public float RotateSpeed { get; set; } = 1f; - public bool IsDouble { get; set; } = false; - public bool IsNoHead { get; set; } = false; - public bool IsFakeStar { get; set; } = false; - public bool IsForceRotate { get; set; } = false; - - public GameObject? SlideObject { get; set; } - public SlideBase? SlideComponent { get; private set; } - - float _slideFadeInTiming = 0f; - - public override void Initialize(TapPoolingInfo poolingInfo) - { - base.Initialize(poolingInfo); - - RotateSpeed = poolingInfo.RotateSpeed; - IsNoHead = poolingInfo.IsNoHead; - IsDouble = poolingInfo.IsDouble; - IsFakeStar = poolingInfo.IsFakeStar; - IsForceRotate = poolingInfo.IsForceRotate; - SlideObject = poolingInfo.Slide; - SlideComponent = SlideObject?.GetComponent(); - if (SlideObject is null && !IsFakeStar) - throw new NullReferenceException("Slide launcher has no slide reference"); - LoadSkin(); - if (!IsNoHead) - { - _sensorPos = (SensorType)(StartPos - 1); - if (_gpManager.IsAutoplay) - Autoplay(); - else - SubscribeEvent(); - } - if(!IsFakeStar) - _slideFadeInTiming = (-3.926913f / Speed) + MajInstances.Setting.Game.SlideFadeInOffset + Timing; - State = NoteStatus.Initialized; - } - public override void End(bool forceEnd = false) - { - if (!IsNoHead || IsFakeStar) - base.End(forceEnd); - else - { - UnsubscribeEvent(); - State = NoteStatus.Destroyed; - } - if (forceEnd) - return; - RendererState = RendererStatus.Off; - notePoolManager.Collect(this); - } - public override void ComponentUpdate() - { - var judgeTiming = GetTimeSpanToArriveTiming(); - var distance = judgeTiming * Speed + 4.8f; - var scaleRate = _gameSetting.Debug.NoteAppearRate; - var destScale = distance * scaleRate + (1 - (scaleRate * 1.225f)); - - UpdateSlide(); - switch (State) - { - case NoteStatus.Initialized: - if (destScale >= 0f) - { - if (!IsNoHead) - { - tapLine.transform.rotation = Quaternion.Euler(0, 0, -22.5f + -45f * (StartPos - 1)); - RendererState = RendererStatus.On; - } - State = NoteStatus.Scaling; - goto case NoteStatus.Scaling; - } - else - transform.localScale = new Vector3(0, 0); - return; - case NoteStatus.Scaling: - { - if (destScale > 0.3f && !IsNoHead) - tapLine.SetActive(true); - if (distance < 1.225f) - { - transform.localScale = new Vector3(destScale, destScale); - transform.position = GetPositionFromDistance(1.225f); - var lineScale = Mathf.Abs(1.225f / 4.8f); - tapLine.transform.localScale = new Vector3(lineScale, lineScale, 1f); - } - else - { - State = NoteStatus.Running; - goto case NoteStatus.Running; - } - } - break; - case NoteStatus.Running: - { - Distance = distance; - transform.position = GetPositionFromDistance(distance); - transform.localScale = new Vector3(1f, 1f); - var lineScale = Mathf.Abs(distance / 4.8f); - tapLine.transform.localScale = new Vector3(lineScale, lineScale, 1f); - } - break; - default: - return; - } - if (_gpManager.IsStart && !IsFakeStar && _gameSetting.Game.StarRotation) - transform.Rotate(0f, 0f, -180f * Time.deltaTime / RotateSpeed); - else if (IsForceRotate) - transform.Rotate(0f, 0f, 400f * Time.deltaTime); - } - void UpdateSlide() - { - switch(State) - { - case NoteStatus.Initialized: - case NoteStatus.Scaling: - case NoteStatus.Running: - if(CurrentSec >= _slideFadeInTiming) - { - if (!IsFakeStar && !(SlideComponent?.Active ?? true)) - { - SlideComponent.SetActive(true); - if (IsNoHead) - End(); - } - } - break; - } - } - protected override void LoadSkin() - { - var renderer = GetComponent(); - var exRenderer = transform.GetChild(0).GetComponent(); - var tapLineRenderer = tapLine.GetComponent(); - if (breakShineController is null) - breakShineController = gameObject.AddComponent(); - - RendererState = RendererStatus.Off; - - var skin = MajInstances.SkinManager.GetStarSkin(); - renderer.material = skin.DefaultMaterial; - exRenderer.color = skin.ExEffects[0]; - tapLineRenderer.sprite = skin.NoteLines[0]; - breakShineController.enabled = false; - - if (IsDouble) - { - renderer.sprite = skin.Double; - exRenderer.sprite = skin.ExDouble; - - if (IsEach) - { - renderer.sprite = skin.EachDouble; - tapLineRenderer.sprite = skin.NoteLines[1]; - exRenderer.color = skin.ExEffects[1]; - } - if (IsBreak) - { - renderer.sprite = skin.BreakDouble; - renderer.material = skin.BreakMaterial; - tapLineRenderer.sprite = skin.NoteLines[2]; - breakShineController.enabled = true; - breakShineController.Parent = this; - exRenderer.color = skin.ExEffects[2]; - } - } - else - { - renderer.sprite = skin.Normal; - exRenderer.sprite = skin.Ex; - - if (IsEach) - { - renderer.sprite = skin.Each; - tapLineRenderer.sprite = skin.NoteLines[1]; - exRenderer.color = skin.ExEffects[1]; - } - if (IsBreak) - { - renderer.sprite = skin.Break; - renderer.material = skin.BreakMaterial; - tapLineRenderer.sprite = skin.NoteLines[2]; - breakShineController.enabled = true; - breakShineController.Parent = this; - exRenderer.color = skin.ExEffects[2]; - } - } - } - } -} \ No newline at end of file diff --git a/Assets/Script/Game/Notes/TapBase.cs b/Assets/Script/Game/Notes/TapBase.cs deleted file mode 100644 index 1813377d..00000000 --- a/Assets/Script/Game/Notes/TapBase.cs +++ /dev/null @@ -1,228 +0,0 @@ -using MajdataPlay.Buffers; -using MajdataPlay.Game.Controllers; -using MajdataPlay.Interfaces; -using MajdataPlay.IO; -using MajdataPlay.Types; -using System; -using UnityEngine; -#nullable enable -namespace MajdataPlay.Game.Notes -{ - public abstract class TapBase : NoteDrop, IDistanceProvider, INoteQueueMember, IRendererContainer - { - public RendererStatus RendererState - { - get => _rendererState; - set - { - if (State < NoteStatus.Initialized) - return; - - switch(value) - { - case RendererStatus.Off: - thisRenderer.forceRenderingOff = true; - exRenderer.forceRenderingOff = true; - tapLineRenderer.forceRenderingOff = true; - break; - case RendererStatus.On: - thisRenderer.forceRenderingOff = false; - exRenderer.forceRenderingOff = !IsEX; - tapLineRenderer.forceRenderingOff = false; - break; - } - } - } - public TapQueueInfo QueueInfo { get; set; } = TapQueueInfo.Default; - public float Distance { get; protected set; } = -100; - public GameObject tapLine; - - protected BreakShineController? breakShineController = null; - protected SpriteRenderer thisRenderer; - protected SpriteRenderer exRenderer; - protected SpriteRenderer tapLineRenderer; - protected NotePoolManager notePoolManager; - - const int _spriteSortOrder = 1; - const int _exSortOrder = 0; - - - public virtual void Initialize(TapPoolingInfo poolingInfo) - { - if (State >= NoteStatus.Initialized && State < NoteStatus.Destroyed) - return; - StartPos = poolingInfo.StartPos; - Timing = poolingInfo.Timing; - _judgeTiming = Timing; - SortOrder = poolingInfo.NoteSortOrder; - Speed = poolingInfo.Speed; - IsEach = poolingInfo.IsEach; - IsBreak = poolingInfo.IsBreak; - IsEX = poolingInfo.IsEX; - QueueInfo = poolingInfo.QueueInfo; - _isJudged = false; - Distance = -100; - if (State == NoteStatus.Start) - Start(); - - thisRenderer.sortingOrder = SortOrder - _spriteSortOrder; - exRenderer.sortingOrder = SortOrder - _exSortOrder; - - State = NoteStatus.Initialized; - } - public virtual void End(bool forceEnd = false) - { - State = NoteStatus.Destroyed; - UnsubscribeEvent(); - if (!_isJudged || forceEnd) - return; - - var result = new JudgeResult() - { - Result = _judgeResult, - IsBreak = IsBreak, - IsEX = IsEX, - Diff = _judgeDiff - }; - CanShine = false; - if (breakShineController is not null) - breakShineController.enabled = false; - PlayJudgeSFX(result); - _effectManager.PlayEffect(StartPos, result); - _noteManager.NextNote(QueueInfo); - _objectCounter.ReportResult(this, result); - } - protected override void Start() - { - if (IsInitialized) - return; - base.Start(); - Active = true; - notePoolManager = FindObjectOfType(); - thisRenderer = GetComponent(); - exRenderer = transform.GetChild(0).GetComponent(); - - tapLine = Instantiate(tapLine, _noteManager.gameObject.transform.GetChild(7)); - tapLine.SetActive(false); - tapLineRenderer = tapLine.GetComponent(); - - transform.localScale = new Vector3(0, 0); - } - protected override void PlaySFX() - { - PlayJudgeSFX(new JudgeResult() - { - Result = _judgeResult, - IsBreak = IsBreak, - IsEX = IsEX, - Diff = _judgeDiff - }); - } - protected override void PlayJudgeSFX(in JudgeResult judgeResult) - { - _audioEffMana.PlayTapSound(judgeResult); - } - public override void ComponentFixedUpdate() - { - if (State < NoteStatus.Running|| IsDestroyed) - return; - var timing = GetTimeSpanToJudgeTiming(); - var isTooLate = timing > 0.15f; - if (!_isJudged && isTooLate) - { - _judgeResult = JudgeType.Miss; - _isJudged = true; - End(); - } - else if (_isJudged) - End(); - } - // Update is called once per frame - public override void ComponentUpdate() - { - var timing = GetTimeSpanToArriveTiming(); - var distance = timing * Speed + 4.8f; - var scaleRate = _gameSetting.Debug.NoteAppearRate; - var destScale = distance * scaleRate + (1 - (scaleRate * 1.225f)); - - switch (State) - { - case NoteStatus.Initialized: - if (destScale >= 0f) - { - transform.rotation = Quaternion.Euler(0, 0, -22.5f + -45f * (StartPos - 1)); - tapLine.transform.rotation = Quaternion.Euler(0, 0, -22.5f + -45f * (StartPos - 1)); - - RendererState = RendererStatus.On; - CanShine = true; - State = NoteStatus.Scaling; - goto case NoteStatus.Scaling; - } - else - transform.localScale = new Vector3(0, 0); - return; - case NoteStatus.Scaling: - { - if (destScale > 0.3f) - tapLine.SetActive(true); - if (distance < 1.225f) - { - Distance = distance; - transform.localScale = new Vector3(destScale, destScale); - transform.position = GetPositionFromDistance(1.225f); - var lineScale = Mathf.Abs(1.225f / 4.8f); - tapLine.transform.localScale = new Vector3(lineScale, lineScale, 1f); - } - else - { - State = NoteStatus.Running; - goto case NoteStatus.Running; - } - } - break; - case NoteStatus.Running: - { - Distance = distance; - transform.position = GetPositionFromDistance(distance); - transform.localScale = new Vector3(1f, 1f); - var lineScale = Mathf.Abs(distance / 4.8f); - tapLine.transform.localScale = new Vector3(lineScale, lineScale, 1f); - } - break; - default: - return; - } - } - protected override void Check(object sender, InputEventArgs arg) - { - if (State < NoteStatus.Running) - return; - else if (arg.Type != _sensorPos) - return; - else if (_isJudged || !_noteManager.CanJudge(QueueInfo)) - return; - - if (arg.IsClick) - { - if (!_ioManager.IsIdle(arg)) - return; - else - _ioManager.SetBusy(arg); - - Judge(_gpManager.ThisFrameSec); - //ioManager.SetIdle(arg); - if (_isJudged) - End(); - } - } - protected void SubscribeEvent() - { - _ioManager.BindArea(Check, _sensorPos); - } - protected void UnsubscribeEvent() - { - _ioManager.UnbindArea(Check, _sensorPos); - } - RendererStatus _rendererState = RendererStatus.Off; - } -} diff --git a/Assets/Script/Game/Notes/TapDrop.cs b/Assets/Script/Game/Notes/TapDrop.cs index 1e6ff97e..4644daa5 100644 --- a/Assets/Script/Game/Notes/TapDrop.cs +++ b/Assets/Script/Game/Notes/TapDrop.cs @@ -1,31 +1,317 @@ -using MajdataPlay.Game.Controllers; -using MajdataPlay.Utils; +using MajdataPlay.Buffers; +using MajdataPlay.Game.Controllers; +using MajdataPlay.Interfaces; using MajdataPlay.IO; using MajdataPlay.Types; +using MajdataPlay.Utils; +using System; using UnityEngine; -using MajdataPlay.Buffers; #nullable enable namespace MajdataPlay.Game.Notes { - public sealed class TapDrop : TapBase, IPoolableNote + public sealed class TapDrop : NoteDrop, IDistanceProvider, INoteQueueMember, IRendererContainer, IPoolableNote { + public RendererStatus RendererState + { + get => _rendererState; + set + { + if (State < NoteStatus.Initialized) + return; + + switch(value) + { + case RendererStatus.Off: + _thisRenderer.forceRenderingOff = true; + _exRenderer.forceRenderingOff = true; + _tapLineRenderer.forceRenderingOff = true; + break; + case RendererStatus.On: + _thisRenderer.forceRenderingOff = false; + _exRenderer.forceRenderingOff = !IsEX; + _tapLineRenderer.forceRenderingOff = false; + break; + } + } + } + public TapQueueInfo QueueInfo { get; set; } = TapQueueInfo.Default; + public float RotateSpeed { get; set; } = 0.0000000000000000000000000000001f; + public bool IsDouble { get; set; } = false; + public bool IsStar { get; set; } = false; + public float Distance { get; set; } = -100; + + [SerializeField] + GameObject _tapLinePrefab; + + GameObject _tapLineObject; + GameObject _exObject; + + + SpriteRenderer _thisRenderer; + SpriteRenderer _exRenderer; + SpriteRenderer _tapLineRenderer; + NotePoolManager _notePoolManager; + BreakShineController? _breakShineController = null; + + const int _spriteSortOrder = 1; + const int _exSortOrder = 0; + + + public void Initialize(TapPoolingInfo poolingInfo) + { + if (State >= NoteStatus.Initialized && State < NoteStatus.Destroyed) + return; + StartPos = poolingInfo.StartPos; + Timing = poolingInfo.Timing; + _judgeTiming = Timing; + SortOrder = poolingInfo.NoteSortOrder; + Speed = poolingInfo.Speed; + IsEach = poolingInfo.IsEach; + IsBreak = poolingInfo.IsBreak; + IsEX = poolingInfo.IsEX; + QueueInfo = poolingInfo.QueueInfo; + IsStar = poolingInfo.IsStar; + IsDouble = poolingInfo.IsDouble; + RotateSpeed = poolingInfo.RotateSpeed; + _isJudged = false; + Distance = -100; + if (State == NoteStatus.Start) + Start(); + + Transform.rotation = Quaternion.Euler(0, 0, -22.5f + -45f * (StartPos - 1)); + _tapLineObject.transform.rotation = Quaternion.Euler(0, 0, -22.5f + -45f * (StartPos - 1)); + _thisRenderer.sortingOrder = SortOrder - _spriteSortOrder; + _exRenderer.sortingOrder = SortOrder - _exSortOrder; + + LoadSkin(); + SetActive(true); + SetTapLineActive(false); + _sensorPos = (SensorType)(StartPos - 1); + if (_gpManager.IsAutoplay) + Autoplay(); + else + SubscribeEvent(); + State = NoteStatus.Initialized; + } + public void End(bool forceEnd = false) + { + State = NoteStatus.Destroyed; + UnsubscribeEvent(); + if (!_isJudged || forceEnd) + return; + + SetActive(false); + RendererState = RendererStatus.Off; + var result = new JudgeResult() + { + Result = _judgeResult, + IsBreak = IsBreak, + IsEX = IsEX, + Diff = _judgeDiff + }; + CanShine = false; + if (_breakShineController is not null) + _breakShineController.enabled = false; + PlayJudgeSFX(result); + _effectManager.PlayEffect(StartPos, result); + _noteManager.NextNote(QueueInfo); + _objectCounter.ReportResult(this, result); + _notePoolManager.Collect(this); + } + protected override void Start() + { + if (IsInitialized) + return; + base.Start(); + Active = true; + _notePoolManager = FindObjectOfType(); + _thisRenderer = GetComponent(); + + _exObject = transform.GetChild(0).gameObject; + _exRenderer = _exObject.GetComponent(); + + _tapLineObject = Instantiate(_tapLinePrefab, _noteManager.gameObject.transform.GetChild(7)); + _tapLineObject.SetActive(true); + _tapLineRenderer = _tapLineObject.GetComponent(); + + transform.localScale = new Vector3(0, 0); + } + protected override void PlaySFX() + { + PlayJudgeSFX(new JudgeResult() + { + Result = _judgeResult, + IsBreak = IsBreak, + IsEX = IsEX, + Diff = _judgeDiff + }); + } + protected override void PlayJudgeSFX(in JudgeResult judgeResult) + { + _audioEffMana.PlayTapSound(judgeResult); + } + public override void ComponentFixedUpdate() + { + if (State < NoteStatus.Running|| IsDestroyed) + return; + var timing = GetTimeSpanToJudgeTiming(); + var isTooLate = timing > 0.15f; + if (!_isJudged && isTooLate) + { + _judgeResult = JudgeType.Miss; + _isJudged = true; + End(); + } + else if (_isJudged) + End(); + } + // Update is called once per frame + public override void ComponentUpdate() + { + var timing = GetTimeSpanToArriveTiming(); + var distance = timing * Speed + 4.8f; + var scaleRate = _gameSetting.Debug.NoteAppearRate; + var destScale = distance * scaleRate + (1 - (scaleRate * 1.225f)); + + switch (State) + { + case NoteStatus.Initialized: + if (destScale >= 0f) + { + RendererState = RendererStatus.On; + CanShine = true; + State = NoteStatus.Scaling; + goto case NoteStatus.Scaling; + } + else + transform.localScale = new Vector3(0, 0); + return; + case NoteStatus.Scaling: + { + if (destScale > 0.3f) + SetTapLineActive(true); + if (distance < 1.225f) + { + Distance = distance; + Transform.localScale = new Vector3(destScale, destScale); + Transform.position = GetPositionFromDistance(1.225f); + var lineScale = Mathf.Abs(1.225f / 4.8f); + _tapLineObject.transform.localScale = new Vector3(lineScale, lineScale, 1f); + } + else + { + State = NoteStatus.Running; + goto case NoteStatus.Running; + } + } + break; + case NoteStatus.Running: + { + Distance = distance; + Transform.position = GetPositionFromDistance(distance); + Transform.localScale = new Vector3(1f, 1f); + var lineScale = Mathf.Abs(distance / 4.8f); + _tapLineObject.transform.localScale = new Vector3(lineScale, lineScale, 1f); + } + break; + default: + return; + } + if(IsStar) + { + if (_gpManager.IsStart && _gameSetting.Game.StarRotation) + Transform.Rotate(0f, 0f, RotateSpeed * Time.deltaTime); + } + } + protected override void Check(object sender, InputEventArgs arg) + { + if (State < NoteStatus.Running) + return; + else if (arg.Type != _sensorPos) + return; + else if (_isJudged || !_noteManager.CanJudge(QueueInfo)) + return; + + if (arg.IsClick) + { + if (!_ioManager.IsIdle(arg)) + return; + else + _ioManager.SetBusy(arg); + + Judge(_gpManager.ThisFrameSec); + //ioManager.SetIdle(arg); + if (_isJudged) + End(); + } + } protected override void LoadSkin() + { + if (_breakShineController is null) + _breakShineController = gameObject.AddComponent(); + + RendererState = RendererStatus.Off; + + if (IsStar) + LoadStarSkin(); + else + LoadTapSkin(); + } + public override void SetActive(bool state) + { + if (Active == state) + return; + base.SetActive(state); + switch(state) + { + case true: + _exObject.layer = 0; + break; + case false: + _exObject.layer = 0; + break; + } + if (_breakShineController is not null) + _breakShineController.Active = state; + SetTapLineActive(state); + Active = state; + } + void SetTapLineActive(bool state) + { + switch (state) + { + case true: + _tapLineObject.layer = 0; + break; + case false: + _tapLineObject.layer = 3; + break; + } + } + void SubscribeEvent() + { + _ioManager.BindArea(Check, _sensorPos); + } + void UnsubscribeEvent() + { + _ioManager.UnbindArea(Check, _sensorPos); + } + void LoadTapSkin() { var skin = MajInstances.SkinManager.GetTapSkin(); var renderer = GetComponent(); var exRenderer = transform.GetChild(0).GetComponent(); - var tapLineRenderer = tapLine.GetComponent(); - if (breakShineController is null) - breakShineController = gameObject.AddComponent(); + var tapLineRenderer = _tapLineObject.GetComponent(); renderer.sprite = skin.Normal; renderer.material = skin.DefaultMaterial; exRenderer.sprite = skin.Ex; exRenderer.color = skin.ExEffects[0]; tapLineRenderer.sprite = skin.NoteLines[0]; - breakShineController.enabled = false; - + if (_breakShineController is null) + throw new MissingComponentException(nameof(_breakShineController)); + _breakShineController.enabled = false; if (IsEach) { renderer.sprite = skin.Each; @@ -39,34 +325,70 @@ protected override void LoadSkin() renderer.sprite = skin.Break; renderer.material = skin.BreakMaterial; tapLineRenderer.sprite = skin.NoteLines[2]; - breakShineController.enabled = true; - breakShineController.Parent = this; + _breakShineController.enabled = true; + _breakShineController.Parent = this; exRenderer.color = skin.ExEffects[2]; } - - RendererState = RendererStatus.Off; } - public override void Initialize(TapPoolingInfo poolingInfo) + void LoadStarSkin() { - base.Initialize(poolingInfo); + var renderer = GetComponent(); + var exRenderer = transform.GetChild(0).GetComponent(); + var tapLineRenderer = _tapLineObject.GetComponent(); + var skin = MajInstances.SkinManager.GetStarSkin(); + renderer.material = skin.DefaultMaterial; + exRenderer.color = skin.ExEffects[0]; + tapLineRenderer.sprite = skin.NoteLines[0]; - LoadSkin(); - _sensorPos = (SensorType)(StartPos - 1); - if (_gpManager.IsAutoplay) - Autoplay(); + if (_breakShineController is null) + throw new MissingComponentException(nameof(_breakShineController)); + + _breakShineController.enabled = false; + + if (IsDouble) + { + renderer.sprite = skin.Double; + exRenderer.sprite = skin.ExDouble; + + if (IsEach) + { + renderer.sprite = skin.EachDouble; + tapLineRenderer.sprite = skin.NoteLines[1]; + exRenderer.color = skin.ExEffects[1]; + } + if (IsBreak) + { + renderer.sprite = skin.BreakDouble; + renderer.material = skin.BreakMaterial; + tapLineRenderer.sprite = skin.NoteLines[2]; + _breakShineController.enabled = true; + _breakShineController.Parent = this; + exRenderer.color = skin.ExEffects[2]; + } + } else - SubscribeEvent(); - State = NoteStatus.Initialized; - } - public override void End(bool forceEnd = false) - { - base.End(forceEnd); - if (forceEnd) - return; - RendererState = RendererStatus.Off; - notePoolManager.Collect(this); + { + renderer.sprite = skin.Normal; + exRenderer.sprite = skin.Ex; + + if (IsEach) + { + renderer.sprite = skin.Each; + tapLineRenderer.sprite = skin.NoteLines[1]; + exRenderer.color = skin.ExEffects[1]; + } + if (IsBreak) + { + renderer.sprite = skin.Break; + renderer.material = skin.BreakMaterial; + tapLineRenderer.sprite = skin.NoteLines[2]; + _breakShineController.enabled = true; + _breakShineController.Parent = this; + exRenderer.color = skin.ExEffects[2]; + } + } } - + RendererStatus _rendererState = RendererStatus.Off; } -} \ No newline at end of file +} diff --git a/Assets/Script/Game/Notes/TouchHoldDrop.cs b/Assets/Script/Game/Notes/TouchHoldDrop.cs index b7e883f0..0d2d0900 100644 --- a/Assets/Script/Game/Notes/TouchHoldDrop.cs +++ b/Assets/Script/Game/Notes/TouchHoldDrop.cs @@ -149,6 +149,8 @@ public void Initialize(TouchHoldPoolingInfo poolingInfo) fanRenderers[i].sortingOrder = SortOrder - (_fanSpriteSortOrder + i); pointRenderer.sortingOrder = SortOrder - _pointBorderSortOrder; borderRenderer.sortingOrder = SortOrder - _borderSortOrder; + mask.frontSortingOrder = SortOrder - _borderSortOrder; + mask.backSortingOrder = SortOrder - _borderSortOrder - 1; if (_gpManager.IsAutoplay) Autoplay(); diff --git a/Assets/Script/Game/Notes/WifiDrop.cs b/Assets/Script/Game/Notes/WifiDrop.cs index 1df93a29..edc29e2a 100644 --- a/Assets/Script/Game/Notes/WifiDrop.cs +++ b/Assets/Script/Game/Notes/WifiDrop.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Unity.VisualScripting; using UnityEngine; #nullable enable @@ -64,21 +65,37 @@ public override void Initialize() _slideStartPositions[2] = GetPositionFromDistance(4.8f); } - _slideOK = transform.GetChild(transform.childCount - 1).gameObject; //slideok is the last one + _slideOK = Transform.GetChild(Transform.childCount - 1).gameObject; //slideok is the last one + _slideOKAnim = _slideOK.GetComponent(); + _slideOKController = _slideOK.GetComponent(); - transform.rotation = Quaternion.Euler(0f, 0f, -45f * (StartPos - 1)); - _slideBars = new GameObject[transform.childCount - 1]; - _slideBarRenderers = new SpriteRenderer[transform.childCount - 1]; + Transform.rotation = Quaternion.Euler(0f, 0f, -45f * (StartPos - 1)); + _starTransforms = new Transform[3]; + _slideBars = new GameObject[Transform.childCount - 1]; + _slideBarRenderers = new SpriteRenderer[Transform.childCount - 1]; + _slideBarTransforms = new Transform[Transform.childCount - 1]; - for (var i = 0; i < transform.childCount - 1; i++) + for (var i = 0; i < Transform.childCount - 1; i++) { - _slideBars[i] = transform.GetChild(i).gameObject; + _slideBars[i] = Transform.GetChild(i).gameObject; + _slideBarTransforms[i] = _slideBars[i].transform; _slideBarRenderers[i] = _slideBars[i].GetComponent(); } LoadSkin(); SetActive(false); + SetStarActive(false); SetSlideBarAlpha(0f); + for (var i = 0; i < _stars.Length; i++) + { + var star = _stars[i]; + if (star is null) + continue; + _starTransforms[i] = star.transform; + star.transform.position = _slideStartPositions[i]; + star.transform.localScale = new Vector3(0f, 0f, 1f); + star.SetActive(true); + } } protected override void Start() { @@ -219,9 +236,16 @@ int GetIndex() } public override void ComponentUpdate() { - foreach (var star in _stars) - star.SetActive(true); - + if(_isArrived) + { + CheckAll(); + return; + } + if (!_isStarActive) + { + SetStarActive(true); + _isStarActive = true; + } var timing = CurrentSec - _timing; if (timing <= 0f) { @@ -233,40 +257,45 @@ public override void ComponentUpdate() for (var i = 0; i < _stars.Length; i++) { + var starTransform = _starTransforms[i]; + _starRenderers[i].color = new Color(1, 1, 1, alpha); - _stars[i].transform.localScale = new Vector3(alpha + 0.5f, alpha + 0.5f, alpha + 0.5f); - _stars[i].transform.position = _slideStartPositions[i]; + starTransform.localScale = new Vector3(alpha + 0.5f, alpha + 0.5f, alpha + 0.5f); + starTransform.position = _slideStartPositions[i]; } } else - UpdateStar(); + { + StarUpdate(); + } CheckAll(); } - void UpdateStar() + void StarUpdate() { var timing = _gpManager.AudioTime - _timing; var process = (Length - timing) / Length; process = 1f - process; - if (process >= 1) + for (var i = 0; i < _stars.Length; i++) { - for (var i = 0; i < _stars.Length; i++) + var starTransform = _starTransforms[i]; + if (process >= 1) { _starRenderers[i].color = Color.white; - _stars[i].transform.position = _slideEndPositions[i]; - _stars[i].transform.localScale = new Vector3(1.5f, 1.5f, 1.5f); + starTransform.position = _slideEndPositions[i]; + starTransform.localScale = new Vector3(1.5f, 1.5f, 1.5f); + _isArrived = true; } - } - else - { - for (var i = 0; i < _stars.Length; i++) + else { _starRenderers[i].color = Color.white; - _stars[i].transform.position = + starTransform.position = (_slideEndPositions[i] - _slideStartPositions[i]) * process + _slideStartPositions[i]; //TODO add some runhua - _stars[i].transform.localScale = new Vector3(1.5f, 1.5f, 1.5f); + starTransform.localScale = new Vector3(1.5f, 1.5f, 1.5f); } } + + if (_gpManager.IsAutoplay) { var queue = _judgeQueues?[0]; @@ -336,13 +365,12 @@ public override void End(bool forceEnd = false) _objectCounter.ReportResult(this, result); if (IsBreak && _judgeResult == JudgeType.Perfect) { - var anim = _slideOK.GetComponent(); - anim.runtimeAnimatorController = MajInstances.SkinManager.JustBreak; + _slideOKAnim.runtimeAnimatorController = MajInstances.SkinManager.JustBreak; } - _slideOK.GetComponent().SetResult(_judgeResult); + _slideOKController.SetResult(_judgeResult); PlayJudgeSFX(result); PlaySlideOK(result); - Destroy(gameObject); + //Destroy(gameObject); } protected override void LoadSkin() { @@ -363,9 +391,9 @@ protected override void LoadSkin() barSprites = skin.Break; starSprite = skin.Star.Break; breakMaterial = skin.BreakMaterial; - var controller = gameObject.AddComponent(); - controller.Parent = this; - controller.Initialize(); + _slideBarShineController = gameObject.AddComponent(); + _slideBarShineController.Parent = this; + _slideBarShineController.Initialize(); } foreach(var (i,bar) in bars.WithIndex()) { @@ -391,8 +419,8 @@ protected override void LoadSkin() if (breakMaterial != null) { starRenderer.material = breakMaterial; - var controller = star.AddComponent(); - controller.Parent = this; + _starShineController = star.AddComponent(); + _starShineController.Parent = this; } star.transform.rotation = Quaternion.Euler(0, 0, -22.5f * (8 + i + 2 * (StartPos - 1))); star.SetActive(false); diff --git a/Assets/Script/Game/ObjectCounter.cs b/Assets/Script/Game/ObjectCounter.cs index 1f4b5311..71502c09 100644 --- a/Assets/Script/Game/ObjectCounter.cs +++ b/Assets/Script/Game/ObjectCounter.cs @@ -952,7 +952,7 @@ void UpdateAchievementColor(double achievementRate, Text textElement) SimaiNoteType GetNoteType(NoteDrop note) => note switch { TapDrop => SimaiNoteType.Tap, - StarDrop => SimaiNoteType.Tap, + //StarDrop => SimaiNoteType.Tap, HoldDrop => SimaiNoteType.Hold, SlideDrop => SimaiNoteType.Slide, WifiDrop => SimaiNoteType.Slide, diff --git a/Assets/Script/Misc/Types/Buffers/EachLinePool.cs b/Assets/Script/Misc/Types/Buffers/EachLinePool.cs index 2965b589..5d7e0667 100644 --- a/Assets/Script/Misc/Types/Buffers/EachLinePool.cs +++ b/Assets/Script/Misc/Types/Buffers/EachLinePool.cs @@ -6,7 +6,7 @@ #nullable enable namespace MajdataPlay.Buffers { - public class EachLinePool : NotePool + public sealed class EachLinePool : NotePool { public EachLinePool(GameObject prefab, Transform parent, EachLinePoolingInfo[] noteInfos, int capacity) : base(prefab, parent, noteInfos, capacity) { diff --git a/Assets/Script/Misc/Types/Buffers/ElementNotMatchException.cs b/Assets/Script/Misc/Types/Buffers/ElementNotMatchException.cs new file mode 100644 index 00000000..eaf6bcea --- /dev/null +++ b/Assets/Script/Misc/Types/Buffers/ElementNotMatchException.cs @@ -0,0 +1,18 @@ +using System; + +namespace MajdataPlay.Buffers +{ + public class ElementNotMatchException : ArgumentException + { + public TElement Element { get; init; } + + public ElementNotMatchException(TElement element) : this(element,"The element do not match") + { + } + + public ElementNotMatchException(TElement element, string message) : base(message) + { + Element = element; + } + } +} \ No newline at end of file diff --git a/Assets/Script/Misc/Types/Buffers/ElementNotMatchException.cs.meta b/Assets/Script/Misc/Types/Buffers/ElementNotMatchException.cs.meta new file mode 100644 index 00000000..7f8131e7 --- /dev/null +++ b/Assets/Script/Misc/Types/Buffers/ElementNotMatchException.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3854d67b5e8f476683e968b118f12bd6 +timeCreated: 1732092081 \ No newline at end of file diff --git a/Assets/Script/Misc/Types/Buffers/INotePool.cs b/Assets/Script/Misc/Types/Buffers/INotePool.cs index 433366bb..5b964531 100644 --- a/Assets/Script/Misc/Types/Buffers/INotePool.cs +++ b/Assets/Script/Misc/Types/Buffers/INotePool.cs @@ -2,11 +2,10 @@ namespace MajdataPlay.Buffers { - public interface INotePool where TInfo : NotePoolingInfo where TMember : NoteQueueInfo + public interface INotePool: IObjectPool> + where TInfo : NotePoolingInfo where TMember : NoteQueueInfo { - public int Capacity { get; } public void Update(float currentSec); - public void Collect(IPoolableNote endNote); public void Destroy(); } } diff --git a/Assets/Script/Misc/Types/Buffers/IObjectPool.cs b/Assets/Script/Misc/Types/Buffers/IObjectPool.cs new file mode 100644 index 00000000..f011ec57 --- /dev/null +++ b/Assets/Script/Misc/Types/Buffers/IObjectPool.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +#nullable enable +namespace MajdataPlay.Buffers +{ + public interface IObjectPool + { + int Capacity { get; set; } + /// + /// If the pool is static, it will not be dynamically expanded when there are no available elements. + /// + bool IsStatic { get; } + + /// + /// Get an available element from the pool + /// + /// For a non-expandable static pool, null is returned when there are no available elements in the pool. + /// + /// + /// a element in the pool + TElement? Dequeue(); + /// + /// Returns the used element to the pool + /// + /// The element obtained from the pool + /// Thrown when the returned element is not an element in the pool. + void Collect(in TElement element); + } +} diff --git a/Assets/Script/Game/Notes/StarDrop.cs.meta b/Assets/Script/Misc/Types/Buffers/IObjectPool.cs.meta similarity index 83% rename from Assets/Script/Game/Notes/StarDrop.cs.meta rename to Assets/Script/Misc/Types/Buffers/IObjectPool.cs.meta index b022430d..19e843bf 100644 --- a/Assets/Script/Game/Notes/StarDrop.cs.meta +++ b/Assets/Script/Misc/Types/Buffers/IObjectPool.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 309cdd5d8b4098f46aab9707812f563d +guid: 10559ed3104922d41bb510a53a66ac68 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Script/Misc/Types/Buffers/IPoolableNote.cs b/Assets/Script/Misc/Types/Buffers/IPoolableNote.cs index 880c2297..fd81b87f 100644 --- a/Assets/Script/Misc/Types/Buffers/IPoolableNote.cs +++ b/Assets/Script/Misc/Types/Buffers/IPoolableNote.cs @@ -1,5 +1,6 @@ using MajdataPlay.Interfaces; using MajdataPlay.Types; +using System; namespace MajdataPlay.Buffers { diff --git a/Assets/Script/Misc/Types/Buffers/NotePool.cs b/Assets/Script/Misc/Types/Buffers/NotePool.cs index 1fd62eb5..89175462 100644 --- a/Assets/Script/Misc/Types/Buffers/NotePool.cs +++ b/Assets/Script/Misc/Types/Buffers/NotePool.cs @@ -10,7 +10,8 @@ namespace MajdataPlay.Buffers public class NotePool : INotePool where TInfo : NotePoolingInfo where TMember : NoteQueueInfo { - public int Capacity { get; private set; } = 64; + public int Capacity { get; set; } = 64; + public bool IsStatic { get; } = true; protected TimingPoint?[] _timingPoints; protected List> _idleNotes; @@ -69,31 +70,36 @@ bool Dequeue(TInfo?[] infos) { if (info is null) continue; - else if (!Dequeue(info)) + var idleNote = Dequeue(); + if (idleNote is null) return false; + ActiveObject(idleNote, info); infos[i] = null; } return true; } - bool Dequeue(TInfo info) + public IPoolableNote? Dequeue() { if (_idleNotes.IsEmpty()) { Debug.LogWarning($"No more Note can use"); - return false; + return null; } var idleNote = _idleNotes[0]; - var obj = idleNote.GameObject; - info.Instance = obj; - _inUseNotes.Add(idleNote); _idleNotes.RemoveAt(0); - idleNote.Initialize(info); + return idleNote; + } + void ActiveObject(IPoolableNote element, TInfo info) + { + var obj = element.GameObject; + info.Instance = obj; + _inUseNotes.Add(element); + element.Initialize(info); if (!obj.activeSelf) obj.SetActive(true); - return true; } - public virtual void Collect(IPoolableNote endNote) + public virtual void Collect(in IPoolableNote endNote) { _inUseNotes.Remove(endNote); _idleNotes.Add(endNote); diff --git a/Assets/Script/Misc/Types/Buffers/SlideLauncherPool.cs b/Assets/Script/Misc/Types/Buffers/SlideLauncherPool.cs deleted file mode 100644 index 345f71d9..00000000 --- a/Assets/Script/Misc/Types/Buffers/SlideLauncherPool.cs +++ /dev/null @@ -1,71 +0,0 @@ -using MajdataPlay.Extensions; -using MajdataPlay.Interfaces; -using MajdataPlay.Types; -using System; -using UnityEngine; - -#nullable enable -namespace MajdataPlay.Buffers -{ - public class SlideLauncherPool : NotePool - { - public SlideLauncherPool(GameObject prefab, Transform parent, TapPoolingInfo[] noteInfos, int capacity) : base(prefab, parent, noteInfos, capacity) - { - - } - public SlideLauncherPool(GameObject prefab, Transform parent, TapPoolingInfo[] noteInfos) : base(prefab, parent, noteInfos) - { - - } - public override void Update(float currentSec) - { - if (_idleNotes.IsEmpty()) - return; - foreach (var (i, tp) in _timingPoints.WithIndex()) - { - if (tp is null) - continue; - var timeDiff = currentSec - tp.Timing; - if (timeDiff > -0.15f) - { - if (!Dequeue(tp.Infos)) - return; - _timingPoints[i] = null; - } - } - } - bool Dequeue(TapPoolingInfo?[] infos) - { - foreach (var (i, info) in infos.WithIndex()) - { - if (info is null) - continue; - else if (!Dequeue(info)) - return false; - infos[i] = null; - } - return true; - } - bool Dequeue(TapPoolingInfo info) - { - if (_idleNotes.IsEmpty()) - { - Debug.LogWarning($"No more SlideLauncher can use"); - return false; - } - var idleNote = _idleNotes[0]; - var obj = idleNote.GameObject; - info.Instance = obj; - var launcher = obj.GetComponent(); - if (launcher is null) - throw new NullReferenceException("This type does not implement ISlideLauncher"); - launcher.SlideObject = info.Slide; - _inUseNotes.Add(idleNote); - _idleNotes.RemoveAt(0); - idleNote.Initialize(info); - if (!obj.activeSelf) - obj.SetActive(true); - return true; - } - } -} diff --git a/Assets/Script/Misc/Types/Buffers/SlideLauncherPool.cs.meta b/Assets/Script/Misc/Types/Buffers/SlideLauncherPool.cs.meta deleted file mode 100644 index c211b1e0..00000000 --- a/Assets/Script/Misc/Types/Buffers/SlideLauncherPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4edf833e9e55ff34c912f0081197764f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Script/Misc/Types/PoolingInfo/TapPoolingInfo.cs b/Assets/Script/Misc/Types/PoolingInfo/TapPoolingInfo.cs index 351019be..276ea346 100644 --- a/Assets/Script/Misc/Types/PoolingInfo/TapPoolingInfo.cs +++ b/Assets/Script/Misc/Types/PoolingInfo/TapPoolingInfo.cs @@ -10,12 +10,8 @@ namespace MajdataPlay.Types public sealed class TapPoolingInfo : NotePoolingInfo { public bool IsStar { get; init; } - public bool IsNoHead { get; init; } public bool IsDouble { get; init; } - public bool IsFakeStar { get; init; } - public bool IsForceRotate { get; init; } - public float RotateSpeed { get; init; } = 1f; + public float RotateSpeed { get; set; } = 1f; public TapQueueInfo QueueInfo { get; init; } = TapQueueInfo.Default; - public GameObject? Slide { get; init; } = null; } } diff --git a/Assets/Script/Misc/Types/QueueInfo/SlideQueueInfo.cs b/Assets/Script/Misc/Types/QueueInfo/SlideQueueInfo.cs new file mode 100644 index 00000000..0c3b99f4 --- /dev/null +++ b/Assets/Script/Misc/Types/QueueInfo/SlideQueueInfo.cs @@ -0,0 +1,15 @@ +using MajdataPlay.Game.Notes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +#nullable enable +namespace MajdataPlay.Types +{ + public class SlideQueueInfo : NoteQueueInfo + { + public float AppearTiming { get; init; } + public SlideBase SlideObject { get; init; } + } +} diff --git a/Assets/Script/Game/Notes/TapBase.cs.meta b/Assets/Script/Misc/Types/QueueInfo/SlideQueueInfo.cs.meta similarity index 83% rename from Assets/Script/Game/Notes/TapBase.cs.meta rename to Assets/Script/Misc/Types/QueueInfo/SlideQueueInfo.cs.meta index 2b43a2b2..1a2c1b6b 100644 --- a/Assets/Script/Game/Notes/TapBase.cs.meta +++ b/Assets/Script/Misc/Types/QueueInfo/SlideQueueInfo.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 43a4a1be0a3c9af41918c882a121a7f8 +guid: 7e387653ea069264eaa64d0fff09047a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index a67f3289..22b9461e 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -140,7 +140,7 @@ PlayerSettings: loadStoreDebugModeEnabled: 0 visionOSBundleVersion: 1.0 tvOSBundleVersion: 1.0 - bundleVersion: 0.1.0-alpha.4.2.9 + bundleVersion: 0.1.0-alpha.4.2.14 preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0