This commit is contained in:
2025-05-26 15:40:53 +08:00
parent b603f4986f
commit ebf9dd0237
40 changed files with 976 additions and 219 deletions
+102 -42
View File
@@ -6,6 +6,9 @@ using RainbowArt.CleanFlatUI;
using System.Collections.Generic;
using AibisDream.Framework;
using UnityEngine.EventSystems;
using AibisDream.FixSystem;
using System.Collections;
using AibisDream; // 添加 SpriteFlashSystem 的命名空间
public class ShockSystem : MonoBehaviour
{
@@ -19,6 +22,7 @@ public class ShockSystem : MonoBehaviour
[SerializeField] private SpriteRenderer flashBackgroundSpriteRenderer; // 背景闪烁精灵渲染器
[SerializeField] private SpriteRenderer flashSpriteRenderer;
[SerializeField] private List<Sprite> flashHeadSprites; // 头部闪烁精灵列表
[SerializeField] private SpriteFlashSystem spriteFlashSystem; // Sprite闪烁系统
[Header("Settings")]
[SerializeField] private Vector3 shockDeviceTargetPos; // 电击器目标位置
[SerializeField] private Vector3 operationPanelTargetPos; // 操作面板目标位置
@@ -27,6 +31,7 @@ public class ShockSystem : MonoBehaviour
[SerializeField] private float progressIncreaseSpeed = 1f; // 进度增加基础速度
[SerializeField] private float maxSliderValue = 3f; // 滑块最大值
[SerializeField] private float progressDecreaseDuration = 1f; // 进度下降持续时间
[SerializeField] private string shockEffectNode = "ShockEffect"; // 电击效果节点名称
[Header("Shock Effects")]
[SerializeField] private float flashDuration = 0.1f; // 每次闪烁持续时间
@@ -40,6 +45,10 @@ public class ShockSystem : MonoBehaviour
[SerializeField] private float deviceShakeAmount = 0.1f; // 电击器震动幅度
[SerializeField] private float deviceShakeSpeed = 10f; // 电击器震动速度
[Header("Auto Charge Settings")]
[SerializeField] private float autoChargeSpeed = 5f; // 自动充能速度
[SerializeField] private float autoChargeDuration = 1f; // 自动充能持续时间
private bool isCharging = false;
private float currentProgress = 0f;
private Slider baseSlider; // 基础Slider组件
@@ -51,6 +60,18 @@ public class ShockSystem : MonoBehaviour
private Vector3 deviceOriginalPos; // 电击器原始位置
private Tweener deviceShakeTweener; // 电击器震动动画
// 公共访问器
public float FlashDuration => flashDuration;
public float FlashInterval => flashInterval;
public int FlashCount => flashCount;
private void Awake()
{
// 注册
FixSystemCenter.SystemDic.Register(this);
}
private void Start()
{
// 保存电击器原始位置
@@ -98,14 +119,41 @@ public class ShockSystem : MonoBehaviour
}
InitializeShock();
//InitializeShock();
}
public void InitializeShock()
// public void InitializeShock()
// {
// // 移动电击器和操作面板到指定位置
// shockDevice.DOLocalMove(shockDeviceTargetPos, moveDuration);
// operationPanel.DOLocalMove(operationPanelTargetPos, moveDuration);
// powerSlider.EnableSliderInteraction();
// }
// public void SetFlashBack(bool useFlashback,)
// {
// this.useFlashback = useFlashback;
// }
public IEnumerator StartShock()
{
// 移动电击器和操作面板到指定位置
shockDevice.DOLocalMove(shockDeviceTargetPos, moveDuration);
operationPanel.DOLocalMove(operationPanelTargetPos, moveDuration);
var move1 = shockDevice.DOLocalMove(shockDeviceTargetPos, moveDuration);
var move2 = operationPanel.DOLocalMove(operationPanelTargetPos, moveDuration);
powerSlider.EnableSliderInteraction();
yield return move1.WaitForCompletion();
yield return move2.WaitForCompletion();
}
public IEnumerator StopShock()
{
var move1 = shockDevice.DOLocalMove(deviceOriginalPos, moveDuration);
var move2 = operationPanel.DOLocalMove(operationPanelTargetPos, moveDuration);
powerSlider.DisableSliderInteraction();
yield return move1.WaitForCompletion();
yield return move2.WaitForCompletion();
}
private void OnSliderValueChanged(float value)
@@ -123,11 +171,6 @@ public class ShockSystem : MonoBehaviour
deviceShakeTweener.Kill();
deviceShakeTweener = null;
}
// 重置电击器位置
// if (shockDevice != null)
// {
// shockDevice.localPosition = deviceOriginalPos;
// }
}
// 如果滑块值大于0,取消回弹动画
if (value > 0 && sliderReturnTweener != null)
@@ -137,10 +180,6 @@ public class ShockSystem : MonoBehaviour
sliderBar.localPosition = new Vector3(0, -89, 0);
}
// 更新推杆的缩放
// float t = value / maxSliderValue;
// sliderBar.localScale = Vector3.Lerp(sliderBarStartScale, sliderBarEndScale, t);
if (value > 0)
{
if (!isCharging)
@@ -157,7 +196,8 @@ public class ShockSystem : MonoBehaviour
// 只有在进度条满时才触发闪烁效果
if (currentProgress >= progressBar.MaxValue)
{
PlayFlashEffect();
// 触发 Yarn 节点来决定使用哪种效果
DialogController.Instance.StartDialogNode(shockEffectNode);
}
// 重置进度条
ResetProgress();
@@ -267,7 +307,7 @@ public class ShockSystem : MonoBehaviour
}
}
private void PlayFlashEffect()
public IEnumerator PlayFlashEffect()
{
if (flashSequence != null)
{
@@ -289,17 +329,6 @@ public class ShockSystem : MonoBehaviour
flashBackgroundSpriteRenderer.color = new Color(0, 0, 0, 1f); // 确保初始alpha为0
}
// // 首先整体淡入
// if (flashHeadSpriteRenderer != null)
// {
// flashSequence.Join(flashHeadSpriteRenderer.DOFade(1f, flashDuration));
// }
// if (flashBackgroundSpriteRenderer != null)
// {
// flashSequence.Join(flashBackgroundSpriteRenderer.DOFade(1f, flashDuration));
// }
// flashHeadSpriteRenderer
// 创建指定次数的闪烁
for (int i = 0; i < flashCount; i++)
{
@@ -310,12 +339,10 @@ public class ShockSystem : MonoBehaviour
if (currentFlashHeadIndex == 1)
{
flashBackgroundSpriteRenderer.color = Color.white;
//flashSpriteRenderer.gameObject.SetActive(true);
}
else
{
flashBackgroundSpriteRenderer.color = Color.black;
//flashSpriteRenderer.gameObject.SetActive(false);
}
// 切换头部图片
@@ -334,7 +361,6 @@ public class ShockSystem : MonoBehaviour
}
}
// 最后整体淡出
if (flashHeadSpriteRenderer != null)
{
@@ -345,21 +371,55 @@ public class ShockSystem : MonoBehaviour
flashSequence.Join(flashBackgroundSpriteRenderer.DOFade(0f, flashDuration));
}
// 等待序列完成
yield return flashSequence.WaitForCompletion();
// 闪烁结束后禁用所有精灵并重置状态
flashSequence.OnComplete(() =>
if (flashHeadSpriteRenderer != null)
{
if (flashHeadSpriteRenderer != null)
{
flashHeadSpriteRenderer.gameObject.SetActive(false);
flashHeadSpriteRenderer.color = new Color(1, 1, 1, 0);
flashHeadSpriteRenderer.sprite = flashHeadSprites[0];
}
if (flashBackgroundSpriteRenderer != null)
{
flashBackgroundSpriteRenderer.gameObject.SetActive(false);
flashBackgroundSpriteRenderer.color = new Color(0, 0, 0, 0);
}
});
flashHeadSpriteRenderer.gameObject.SetActive(false);
flashHeadSpriteRenderer.color = new Color(1, 1, 1, 0);
flashHeadSpriteRenderer.sprite = flashHeadSprites[0];
}
if (flashBackgroundSpriteRenderer != null)
{
flashBackgroundSpriteRenderer.gameObject.SetActive(false);
flashBackgroundSpriteRenderer.color = new Color(0, 0, 0, 0);
}
}
// 自动充能并释放
public IEnumerator AutoChargeAndRelease(float chargeSpeed = 5f, float duration = 1f)
{
// 设置滑块值
baseSlider.value = maxSliderValue;
// 等待充能完成
float startTime = Time.time;
while (Time.time - startTime < duration)
{
// 使用指定的充能速度
currentProgress += chargeSpeed * Time.deltaTime;
progressBar.CurrentValue = Mathf.FloorToInt(currentProgress);
yield return null;
}
// 确保进度达到最大值
currentProgress = progressBar.MaxValue;
progressBar.CurrentValue = Mathf.FloorToInt(currentProgress);
// 触发 Yarn 节点来决定使用哪种效果
DialogController.Instance.StartDialogNode(shockEffectNode);
// 重置滑块
baseSlider.value = 0;
ResetProgress();
}
// 使用默认参数的自动充能方法
public IEnumerator AutoChargeAndRelease()
{
yield return AutoChargeAndRelease(autoChargeSpeed, autoChargeDuration);
}
private void OnDestroy()