地图初步

This commit is contained in:
SoulliesOfficial
2026-04-30 07:06:38 -04:00
parent 8ad26129b2
commit 47125f95f4
98 changed files with 2237 additions and 20524 deletions

View File

@@ -36,6 +36,14 @@ namespace Cielonos.MainGame.Effects.Feedback
[Tooltip("开启时,结果叠加在初始值上;关闭时,结果为绝对值")]
public bool relativeToInitial;
public FloatCurveChannel(AnimationCurve curve, float remapMin, float remapMax, bool relativeToInitial)
{
this.curve = curve;
this.remapMin = remapMin;
this.remapMax = remapMax;
this.relativeToInitial = relativeToInitial;
}
/// <summary>
/// 创建默认的曲线通道。
/// </summary>

View File

@@ -27,17 +27,13 @@ namespace Cielonos.MainGame.Effects.Feedback
[HideIf("modifySpeed")]
[LabelText("速度")]
[Range(0f, 100f)]
public float speed = 30f;
public float speed = 10f;
protected override void TriggerEvent(FeedbackContext context)
{
FloatCurveChannel finalSpeedCurve = modifySpeed
? speedCurve
: new FloatCurveChannel
{
curve = AnimationCurve.Constant(0f, 1f, speed),
relativeToInitial = false
};
FloatCurveChannel finalSpeedCurve = modifySpeed
? speedCurve
: new FloatCurveChannel(AnimationCurve.Constant(0, 1, 1), 0, speed, false);
RGBSplitGlitchShakeEvent.Trigger(
context,

View File

@@ -14,40 +14,86 @@ namespace Cielonos.MainGame.Effects.Feedback
{
public override string DisplayName => "Strobe Flash";
/// <summary>
/// 是否修改频率和颜色参数。
/// </summary>
[TitleGroup("闪烁设置")]
[LabelText("修改额外参数")]
public bool modifyExtra;
// ─── Frequency ───
[ShowIf("modifyExtra")]
[TitleGroup("频率设置")]
[LabelText("频率模式")]
public StrobeFrequencyMode frequencyMode = StrobeFrequencyMode.Constant;
[TitleGroup("频率设置")]
[ShowIf("@frequencyMode == StrobeFrequencyMode.Constant")]
[LabelText("固定频率")]
[Range(0f, 100f)]
public float constantFrequency = 15f;
[TitleGroup("频率设置")]
[ShowIf("@frequencyMode == StrobeFrequencyMode.Curve")]
[LabelText("频率曲线")]
public FloatCurveChannel frequencyCurve = FloatCurveChannel.CreateDefault(remapMax: 15f);
public FloatCurveChannel frequencyCurve = FloatCurveChannel.CreateDefault(remapMax: 30f);
[ShowIf("modifyExtra")]
[TitleGroup("频率设置")]
[ShowIf("@frequencyMode == StrobeFrequencyMode.Manual")]
[LabelText("手动曲线Y >= 1 时翻转)")]
public AnimationCurve manualCurve = AnimationCurve.Constant(0f, 1f, 0f);
// ─── Color High ───
[TitleGroup("颜色设置")]
[LabelText("修改高颜色")]
public bool modifyColorHigh;
[TitleGroup("颜色设置")]
[ShowIf("modifyColorHigh")]
[LabelText("使用渐变色")]
public bool useColorHighGradient;
[TitleGroup("颜色设置")]
[ShowIf("@modifyColorHigh && !useColorHighGradient")]
[LabelText("高颜色")]
public ColorCurveChannel colorHigh = ColorCurveChannel.CreateDefault();
public Color colorHighConstant = Color.white;
[ShowIf("modifyExtra")]
[TitleGroup("颜色设置")]
[ShowIf("@modifyColorHigh && useColorHighGradient")]
[LabelText("高颜色渐变")]
public ColorCurveChannel colorHighCurve = ColorCurveChannel.CreateDefault();
// ─── Color Low ───
[TitleGroup("颜色设置")]
[LabelText("修改低颜色")]
public bool modifyColorLow;
[TitleGroup("颜色设置")]
[ShowIf("modifyColorLow")]
[LabelText("使用渐变色")]
public bool useColorLowGradient;
[TitleGroup("颜色设置")]
[ShowIf("@modifyColorLow && !useColorLowGradient")]
[LabelText("低颜色")]
public ColorCurveChannel colorLow = ColorCurveChannel.CreateDefault();
public Color colorLowConstant = Color.black;
[TitleGroup("颜色设置")]
[ShowIf("@modifyColorLow && useColorLowGradient")]
[LabelText("低颜色渐变")]
public ColorCurveChannel colorLowCurve = ColorCurveChannel.CreateDefault();
protected override void TriggerEvent(FeedbackContext context)
{
StrobeFlashShakeEvent.Trigger(
context,
context.duration,
modifyExtra,
frequencyMode,
constantFrequency,
frequencyCurve,
colorHigh,
colorLow
manualCurve,
modifyColorHigh, useColorHighGradient, colorHighConstant, colorHighCurve,
modifyColorLow, useColorLowGradient, colorLowConstant, colorLowCurve
);
}
protected override void StopEvent(FeedbackContext context)
{
StrobeFlashShakeEvent.Trigger(context, 0f, stop: true);
StrobeFlashShakeEvent.Trigger(context, stop: true);
}
public override bool Validate(out string error)

View File

@@ -89,8 +89,10 @@ namespace Cielonos.MainGame.Effects.Feedback
float additiveIntensity = 0f;
float absoluteIntensity = 0f;
bool hasAbsolute = false;
bool hasAbsoluteIntensity = false;
float additiveSpeed = 0f;
float absoluteSpeed = 0f;
bool hasAbsoluteSpeed = false;
for (int i = _activeShakes.Count - 1; i >= 0; i--)
{
@@ -107,10 +109,19 @@ namespace Cielonos.MainGame.Effects.Feedback
else
{
absoluteIntensity = intensityValue;
hasAbsolute = true;
hasAbsoluteIntensity = true;
}
additiveSpeed += shake.speedCurve.Evaluate(normalizedTime);
float speedValue = shake.speedCurve.Evaluate(normalizedTime);
if (shake.speedCurve.relativeToInitial)
{
additiveSpeed += speedValue;
}
else
{
absoluteSpeed = speedValue;
hasAbsoluteSpeed = true;
}
if (shake.IsFinished)
{
@@ -118,9 +129,10 @@ namespace Cielonos.MainGame.Effects.Feedback
}
}
float finalIntensity = hasAbsolute ? absoluteIntensity : _initialIntensity + additiveIntensity;
float finalIntensity = hasAbsoluteIntensity ? absoluteIntensity : _initialIntensity + additiveIntensity;
float finalSpeed = hasAbsoluteSpeed ? absoluteSpeed : _initialSpeed + additiveSpeed;
_component.intensity.value = finalIntensity;
_component.speed.value = _initialSpeed + additiveSpeed;
_component.speed.value = finalSpeed;
if (_activeShakes.Count == 0)
{

View File

@@ -5,6 +5,19 @@ using UnityEngine;
namespace Cielonos.MainGame.Effects.Feedback
{
/// <summary>
/// 频率控制模式。
/// </summary>
public enum StrobeFrequencyMode
{
/// <summary>使用固定频率数值。</summary>
Constant,
/// <summary>使用 FloatCurveChannel 以动画曲线控制频率。</summary>
Curve,
/// <summary>使用 AnimationCurve 手动控制 ManualInvertY >= 1 时翻转)。</summary>
Manual
}
/// <summary>
/// 黑白闪震动事件。
/// </summary>
@@ -17,11 +30,18 @@ namespace Cielonos.MainGame.Effects.Feedback
public delegate void ShakeDelegate(
FeedbackContext feedbackContext,
float duration,
bool modifyExtra,
StrobeFrequencyMode frequencyMode,
float constantFrequency,
FloatCurveChannel frequencyCurve,
ColorCurveChannel colorHigh,
ColorCurveChannel colorLow,
AnimationCurve manualCurve,
bool modifyColorHigh,
bool useColorHighGradient,
Color colorHighConstant,
ColorCurveChannel colorHighCurve,
bool modifyColorLow,
bool useColorLowGradient,
Color colorLowConstant,
ColorCurveChannel colorLowCurve,
bool stop
);
@@ -30,14 +50,25 @@ namespace Cielonos.MainGame.Effects.Feedback
public static void Trigger(
FeedbackContext feedbackContext,
float duration,
bool modifyExtra = false,
StrobeFrequencyMode frequencyMode = StrobeFrequencyMode.Constant,
float constantFrequency = 15f,
FloatCurveChannel frequencyCurve = default,
ColorCurveChannel colorHigh = default,
ColorCurveChannel colorLow = default,
AnimationCurve manualCurve = null,
bool modifyColorHigh = false,
bool useColorHighGradient = false,
Color colorHighConstant = default,
ColorCurveChannel colorHighCurve = default,
bool modifyColorLow = false,
bool useColorLowGradient = false,
Color colorLowConstant = default,
ColorCurveChannel colorLowCurve = default,
bool stop = false)
{
OnEvent?.Invoke(feedbackContext, duration, modifyExtra, frequencyCurve, colorHigh, colorLow, stop);
OnEvent?.Invoke(feedbackContext,
frequencyMode, constantFrequency, frequencyCurve, manualCurve,
modifyColorHigh, useColorHighGradient, colorHighConstant, colorHighCurve,
modifyColorLow, useColorLowGradient, colorLowConstant, colorLowCurve,
stop);
}
}
@@ -46,28 +77,52 @@ namespace Cielonos.MainGame.Effects.Feedback
/// </summary>
public class StrobeFlashShakeInstance : ShakeInstanceBase
{
public readonly bool modifyExtra;
public readonly StrobeFrequencyMode frequencyMode;
public readonly float constantFrequency;
public readonly FloatCurveChannel frequencyCurve;
public readonly ColorCurveChannel colorHigh;
public readonly ColorCurveChannel colorLow;
public readonly AnimationCurve manualCurve;
public readonly bool modifyColorHigh;
public readonly bool useColorHighGradient;
public readonly Color colorHighConstant;
public readonly ColorCurveChannel colorHighCurve;
public readonly bool modifyColorLow;
public readonly bool useColorLowGradient;
public readonly Color colorLowConstant;
public readonly ColorCurveChannel colorLowCurve;
public StrobeFlashShakeInstance(
FeedbackContext feedbackContext,
bool modifyExtra,
StrobeFrequencyMode frequencyMode,
float constantFrequency,
FloatCurveChannel frequencyCurve,
ColorCurveChannel colorHigh,
ColorCurveChannel colorLow)
AnimationCurve manualCurve,
bool modifyColorHigh,
bool useColorHighGradient,
Color colorHighConstant,
ColorCurveChannel colorHighCurve,
bool modifyColorLow,
bool useColorLowGradient,
Color colorLowConstant,
ColorCurveChannel colorLowCurve)
: base(feedbackContext.timeSettings, feedbackContext.player.TimeProvider, feedbackContext.duration)
{
this.modifyExtra = modifyExtra;
this.frequencyMode = frequencyMode;
this.constantFrequency = constantFrequency;
this.frequencyCurve = frequencyCurve;
this.colorHigh = colorHigh;
this.colorLow = colorLow;
this.manualCurve = manualCurve;
this.modifyColorHigh = modifyColorHigh;
this.useColorHighGradient = useColorHighGradient;
this.colorHighConstant = colorHighConstant;
this.colorHighCurve = colorHighCurve;
this.modifyColorLow = modifyColorLow;
this.useColorLowGradient = useColorLowGradient;
this.colorLowConstant = colorLowConstant;
this.colorLowCurve = colorLowCurve;
}
}
/// <summary>
/// StrobeFlash 的震动聚合器。
/// StrobeFlash 的震动聚合器。最新添加的 Shake 具有最高优先级。
/// </summary>
[AddComponentMenu("SLS Utilities/Feedback Shakers/Strobe Flash Shaker")]
public class StrobeFlashShaker : MonoBehaviour
@@ -100,55 +155,72 @@ namespace Cielonos.MainGame.Effects.Feedback
{
if (!_resolved || _activeShakes.Count == 0) return;
float latestFrequency = _initialFrequency;
Color latestColorHigh = _initialColorHigh;
Color latestColorLow = _initialColorLow;
bool hasExtra = false;
for (int i = _activeShakes.Count - 1; i >= 0; i--)
{
StrobeFlashShakeInstance shake = _activeShakes[i];
shake.timer += shake.timeProvider.GetDeltaTime(shake.timeSettings);
float normalizedTime = shake.timer / shake.duration;
if (shake.modifyExtra && !shake.IsFinished)
{
latestFrequency = shake.frequencyCurve.Evaluate(normalizedTime);
latestColorHigh = shake.colorHigh.Evaluate(normalizedTime);
latestColorLow = shake.colorLow.Evaluate(normalizedTime);
hasExtra = true;
}
if (shake.IsFinished)
{
_activeShakes[i].timer += _activeShakes[i].timeProvider.GetDeltaTime(_activeShakes[i].timeSettings);
if (_activeShakes[i].IsFinished)
_activeShakes.RemoveAt(i);
}
}
_component.enableEffect.value = true;
_component.autoFlash.value = true;
if (hasExtra)
{
_component.frequency.value = latestFrequency;
_component.colorHigh.value = latestColorHigh;
_component.colorLow.value = latestColorLow;
}
if (_activeShakes.Count == 0)
{
Restore();
return;
}
// 最新添加(最高索引)的 Shake 具有最高优先级。
StrobeFlashShakeInstance dominant = _activeShakes[_activeShakes.Count - 1];
float normalizedTime = dominant.timer / dominant.duration;
_component.enableEffect.value = true;
switch (dominant.frequencyMode)
{
case StrobeFrequencyMode.Constant:
_component.autoFlash.value = true;
_component.manualInvert.value = false;
_component.frequency.value = dominant.constantFrequency;
break;
case StrobeFrequencyMode.Curve:
_component.autoFlash.value = true;
_component.manualInvert.value = false;
_component.frequency.value = dominant.frequencyCurve.Evaluate(normalizedTime);
break;
case StrobeFrequencyMode.Manual:
_component.autoFlash.value = false;
_component.manualInvert.value = dominant.manualCurve.Evaluate(normalizedTime) >= 1f;
break;
}
if (dominant.modifyColorHigh)
{
_component.colorHigh.value = dominant.useColorHighGradient
? dominant.colorHighCurve.Evaluate(normalizedTime)
: dominant.colorHighConstant;
}
if (dominant.modifyColorLow)
{
_component.colorLow.value = dominant.useColorLowGradient
? dominant.colorLowCurve.Evaluate(normalizedTime)
: dominant.colorLowConstant;
}
}
private void OnShakeEvent(
FeedbackContext feedbackContext,
float duration,
bool modifyExtra,
StrobeFrequencyMode frequencyMode,
float constantFrequency,
FloatCurveChannel frequencyCurve,
ColorCurveChannel colorHigh,
ColorCurveChannel colorLow,
AnimationCurve manualCurve,
bool modifyColorHigh,
bool useColorHighGradient,
Color colorHighConstant,
ColorCurveChannel colorHighCurve,
bool modifyColorLow,
bool useColorLowGradient,
Color colorLowConstant,
ColorCurveChannel colorLowCurve,
bool stop)
{
if (stop) { StopAll(); return; }
@@ -156,7 +228,10 @@ namespace Cielonos.MainGame.Effects.Feedback
if (!_resolved) return;
var instance = new StrobeFlashShakeInstance(
feedbackContext, modifyExtra, frequencyCurve, colorHigh, colorLow
feedbackContext,
frequencyMode, constantFrequency, frequencyCurve, manualCurve,
modifyColorHigh, useColorHighGradient, colorHighConstant, colorHighCurve,
modifyColorLow, useColorLowGradient, colorLowConstant, colorLowCurve
);
_activeShakes.Add(instance);
}
@@ -176,6 +251,9 @@ namespace Cielonos.MainGame.Effects.Feedback
private void Restore()
{
if (!_resolved) return;
_component.enableEffect.value = false;
_component.autoFlash.value = false;
_component.manualInvert.value = false;
_component.frequency.value = _initialFrequency;
_component.colorHigh.value = _initialColorHigh;
_component.colorLow.value = _initialColorLow;