地图初步

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

@@ -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;