地图初步
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 手动控制 ManualInvert(Y >= 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;
|
||||
|
||||
Reference in New Issue
Block a user