提交
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user