diff --git a/Assets/Resources/Art/Fix/flash遮罩.png b/Assets/Resources/Art/Fix/flash遮罩.png new file mode 100644 index 000000000..d6cf05f87 --- /dev/null +++ b/Assets/Resources/Art/Fix/flash遮罩.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a700548dc08622c53ec0e7e4a60fb4f7d9c37db11f7fb2132fcdd682ca0e3581 +size 99085 diff --git a/Assets/Resources/Art/Fix/flash遮罩.png.meta b/Assets/Resources/Art/Fix/flash遮罩.png.meta new file mode 100644 index 000000000..6194c702d --- /dev/null +++ b/Assets/Resources/Art/Fix/flash遮罩.png.meta @@ -0,0 +1,153 @@ +fileFormatVersion: 2 +guid: b01da57c8313bd040b2c8493173aa01b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 200 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/OpenFixScene.unity b/Assets/Scenes/OpenFixScene.unity index 575efc0e8..36ea9e318 100644 --- a/Assets/Scenes/OpenFixScene.unity +++ b/Assets/Scenes/OpenFixScene.unity @@ -5626,6 +5626,7 @@ MonoBehaviour: sliderBar: {fileID: 971947940} flashHeadSpriteRenderer: {fileID: 2126788502} flashBackgroundSpriteRenderer: {fileID: 1488327801} + flashSpriteRenderer: {fileID: 1954721089} flashHeadSprites: - {fileID: 21300000, guid: ec352317d5419ee46bcd238c319ac018, type: 3} - {fileID: 21300000, guid: 79aa88d0c51f4034d8366baa2ca3ee18, type: 3} @@ -5642,6 +5643,11 @@ MonoBehaviour: flashCount: 3 strength: 0.25 vibrate: 60 + minVibrateStrength: 0.05 + maxVibrateStrength: 0.2 + vibrateInterval: 0.1 + deviceShakeAmount: 0.1 + deviceShakeSpeed: 10 --- !u!4 &772885936 Transform: m_ObjectHideFlags: 0 @@ -6189,6 +6195,7 @@ Transform: m_Children: - {fileID: 1488327802} - {fileID: 2126788501} + - {fileID: 1954721090} m_Father: {fileID: 265073919} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!212 &866752978 @@ -6950,15 +6957,15 @@ RectTransform: m_GameObject: {fileID: 971947939} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.3125, y: 1.5, z: 1} + m_LocalScale: {x: 0.3125, y: 2, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1221487248} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 104} - m_SizeDelta: {x: 100, y: 100} + m_AnchoredPosition: {x: 0, y: 80} + m_SizeDelta: {x: 100, y: 99.999985} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &971947941 MonoBehaviour: @@ -10886,7 +10893,7 @@ SpriteRenderer: m_SortingLayer: 11 m_SortingOrder: 7 m_Sprite: {fileID: 21300000, guid: fab06e0be9375cc4d823efa71629885c, type: 3} - m_Color: {r: 0, g: 0, b: 0, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 0.6666667} m_FlipX: 0 m_FlipY: 0 m_DrawMode: 0 @@ -10905,8 +10912,8 @@ Transform: m_GameObject: {fileID: 1488327800} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 2.74, y: 0.22, z: 0} - m_LocalScale: {x: 20.686226, y: 11.172307, z: 11.172307} + m_LocalPosition: {x: 3.6, y: 0, z: 0} + m_LocalScale: {x: 20.7, y: 11.32, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 866752977} @@ -12764,6 +12771,90 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 +--- !u!1 &1954721088 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1954721090} + - component: {fileID: 1954721089} + m_Layer: 0 + m_Name: flashspriteRenderer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!212 &1954721089 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954721088} + 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: 2100000, guid: 39fa61e2f0a4e6c4baa90336635134a7, type: 2} + 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: 1016946085 + m_SortingLayer: 11 + m_SortingOrder: 8 + m_Sprite: {fileID: 21300000, guid: b01da57c8313bd040b2c8493173aa01b, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 17.3, y: 21.6039} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1954721090 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954721088} + 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: 866752977} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1955821305 GameObject: m_ObjectHideFlags: 0 @@ -13913,7 +14004,7 @@ SpriteRenderer: m_LightmapParameters: {fileID: 0} m_SortingLayerID: 1016946085 m_SortingLayer: 11 - m_SortingOrder: 8 + m_SortingOrder: 9 m_Sprite: {fileID: 21300000, guid: ec352317d5419ee46bcd238c319ac018, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 diff --git a/Assets/Scripts/FixSystemNew/Open/ShockSystem.cs b/Assets/Scripts/FixSystemNew/Open/ShockSystem.cs index ccce1eefa..d9bce2643 100644 --- a/Assets/Scripts/FixSystemNew/Open/ShockSystem.cs +++ b/Assets/Scripts/FixSystemNew/Open/ShockSystem.cs @@ -17,6 +17,7 @@ public class ShockSystem : MonoBehaviour [SerializeField] private Transform sliderBar; // 推杆的杆部分 [SerializeField] private SpriteRenderer flashHeadSpriteRenderer; // 头部闪烁精灵渲染器 [SerializeField] private SpriteRenderer flashBackgroundSpriteRenderer; // 背景闪烁精灵渲染器 + [SerializeField] private SpriteRenderer flashSpriteRenderer; [SerializeField] private List flashHeadSprites; // 头部闪烁精灵列表 [Header("Settings")] [SerializeField] private Vector3 shockDeviceTargetPos; // 电击器目标位置 @@ -33,21 +34,30 @@ public class ShockSystem : MonoBehaviour [SerializeField] private int flashCount = 3; // 闪烁次数 [SerializeField] private float strength = 1f; // 震动强度 [SerializeField] private int vibrate = 10; // 震动次数 + [SerializeField] private float minVibrateStrength = 0.05f; // 最小震动强度 + [SerializeField] private float maxVibrateStrength = 0.2f; // 最大震动强度 + [SerializeField] private float vibrateInterval = 0.1f; // 震动间隔 + [SerializeField] private float deviceShakeAmount = 0.1f; // 电击器震动幅度 + [SerializeField] private float deviceShakeSpeed = 10f; // 电击器震动速度 private bool isCharging = false; private float currentProgress = 0f; - private Vector3 sliderBarStartScale; - private Vector3 sliderBarEndScale = new Vector3(1.2f, 1.2f, 1.2f); // 推杆最大缩放 private Slider baseSlider; // 基础Slider组件 private Tweener progressTweener; // 用于存储进度条动画 private Sequence flashSequence; // 用于存储闪烁动画序列 private int currentFlashHeadIndex = 0; // 当前闪烁头部精灵索引 private Tweener sliderReturnTweener; // 用于存储滑块回弹动画 + private float lastVibrateTime = 0f; // 上次震动时间 + private Vector3 deviceOriginalPos; // 电击器原始位置 + private Tweener deviceShakeTweener; // 电击器震动动画 private void Start() { - // 初始化推杆缩放 - sliderBarStartScale = sliderBar.localScale; + // 保存电击器原始位置 + if (shockDevice != null) + { + deviceOriginalPos = shockDevice.localPosition; + } // 获取基础Slider组件 baseSlider = powerSlider.GetComponent(); @@ -100,11 +110,31 @@ public class ShockSystem : MonoBehaviour private void OnSliderValueChanged(float value) { + if(value > 0) + { + sliderBar.localPosition = new Vector3(0, -89, 0); + } + else + { + sliderBar.localPosition = new Vector3(0, 80, 0); + // 停止电击器震动 + if (deviceShakeTweener != null) + { + deviceShakeTweener.Kill(); + deviceShakeTweener = null; + } + // 重置电击器位置 + // if (shockDevice != null) + // { + // shockDevice.localPosition = deviceOriginalPos; + // } + } // 如果滑块值大于0,取消回弹动画 if (value > 0 && sliderReturnTweener != null) { sliderReturnTweener.Kill(); sliderReturnTweener = null; + sliderBar.localPosition = new Vector3(0, -89, 0); } // 更新推杆的缩放 @@ -188,10 +218,46 @@ public class ShockSystem : MonoBehaviour int progressValue = Mathf.FloorToInt(currentProgress); progressBar.CurrentValue = progressValue; + // 计算震动强度 + float progressRatio = Mathf.Min(currentProgress / progressBar.MaxValue, 1f); + float currentVibrateStrength = Mathf.Lerp(minVibrateStrength, maxVibrateStrength, progressRatio); + + // 检查是否需要震动 + if (Time.time - lastVibrateTime >= vibrateInterval) + { + // 相机震动 + //StartCoroutine(CameraKit.Instance.ShakeCamera(vibrateInterval, currentVibrateStrength, vibrate)); + + // 电击器震动 + if (shockDevice != null) + { + if (deviceShakeTweener != null) + { + deviceShakeTweener.Kill(); + } + + // 计算电击器震动幅度(随进度增加) + float currentShakeAmount = deviceShakeAmount * progressRatio; + + // 创建电击器震动动画 + deviceShakeTweener = shockDevice.DOShakePosition( + vibrateInterval, + currentShakeAmount, + vibrate, + deviceShakeSpeed, + false, + false + ).SetEase(Ease.Linear); + } + + lastVibrateTime = Time.time; + } + // 检查是否达到最大值 if (currentProgress >= progressBar.MaxValue) { - // 不再自动释放电击,等待玩家松开滑块 + // 继续充电和震动 + DOVirtual.DelayedCall(Time.deltaTime, StartCharging); return; } else @@ -220,7 +286,7 @@ public class ShockSystem : MonoBehaviour if (flashBackgroundSpriteRenderer != null) { flashBackgroundSpriteRenderer.gameObject.SetActive(true); - flashBackgroundSpriteRenderer.color = new Color(0, 0, 0, 1); // 确保初始alpha为0 + flashBackgroundSpriteRenderer.color = new Color(0, 0, 0, 1f); // 确保初始alpha为0 } // // 首先整体淡入 @@ -244,10 +310,12 @@ public class ShockSystem : MonoBehaviour if (currentFlashHeadIndex == 1) { flashBackgroundSpriteRenderer.color = Color.white; + //flashSpriteRenderer.gameObject.SetActive(true); } else { flashBackgroundSpriteRenderer.color = Color.black; + //flashSpriteRenderer.gameObject.SetActive(false); } // 切换头部图片 @@ -308,5 +376,9 @@ public class ShockSystem : MonoBehaviour { sliderReturnTweener.Kill(); } + if (deviceShakeTweener != null) + { + deviceShakeTweener.Kill(); + } } } \ No newline at end of file