Bezi回来了

This commit is contained in:
SoulliesOfficial
2026-04-28 15:46:32 -04:00
parent 7379583165
commit 0902ca8a9e
56 changed files with 3285 additions and 3803 deletions

View File

@@ -12,29 +12,21 @@ namespace Cielonos.MainGame.Effects.Feedback
[Serializable]
public struct FloatCurveChannel
{
/// <summary>
/// 是否启用此通道。
/// </summary>
public bool active;
/// <summary>
/// 震动曲线X轴为归一化时间[0,1]Y轴为强度[0,1]。
/// </summary>
[ShowIf("active")]
[ShakeCurvePreset]
public AnimationCurve curve;
/// <summary>
/// 曲线值0对应的实际数值。
/// </summary>
[ShowIf("active")]
[LabelText("Remap Min")]
public float remapMin;
/// <summary>
/// 曲线值1对应的实际数值。
/// </summary>
[ShowIf("active")]
[LabelText("Remap Max")]
public float remapMax;
@@ -47,11 +39,10 @@ namespace Cielonos.MainGame.Effects.Feedback
/// <summary>
/// 创建默认的曲线通道。
/// </summary>
public static FloatCurveChannel CreateDefault(bool active = true, float remapMin = 0f, float remapMax = 1f, bool relativeToInitial = true)
public static FloatCurveChannel CreateDefault(float remapMin = 0f, float remapMax = 1f, bool relativeToInitial = true)
{
return new FloatCurveChannel
{
active = active,
curve = new AnimationCurve(
new Keyframe(0f, 0f),
new Keyframe(0.5f, 1f),
@@ -68,7 +59,7 @@ namespace Cielonos.MainGame.Effects.Feedback
/// </summary>
public readonly float Evaluate(float normalizedTime)
{
if (!active || curve == null) return 0f;
if (curve == null) return 0f;
float t = Mathf.Clamp01(normalizedTime);
float curveValue = curve.Evaluate(t);
return Mathf.LerpUnclamped(remapMin, remapMax, curveValue);
@@ -81,15 +72,9 @@ namespace Cielonos.MainGame.Effects.Feedback
[Serializable]
public struct ColorCurveChannel
{
/// <summary>
/// 是否启用此通道。
/// </summary>
public bool active;
/// <summary>
/// 颜色渐变。
/// </summary>
[ShowIf("active")]
[LabelText("颜色渐变")]
public Gradient gradient;
@@ -100,7 +85,6 @@ namespace Cielonos.MainGame.Effects.Feedback
{
return new ColorCurveChannel
{
active = true,
gradient = new Gradient()
};
}
@@ -110,7 +94,7 @@ namespace Cielonos.MainGame.Effects.Feedback
/// </summary>
public Color Evaluate(float normalizedTime)
{
if (!active || gradient == null) return Color.white;
if (gradient == null) return Color.white;
return gradient.Evaluate(Mathf.Clamp01(normalizedTime));
}
}
@@ -121,23 +105,17 @@ namespace Cielonos.MainGame.Effects.Feedback
[Serializable]
public struct Vector2CurveChannel
{
public bool active;
[ShowIf("active")]
[LabelText("曲线 X")]
[ShakeCurvePreset]
public AnimationCurve curveX;
[ShowIf("active")]
[LabelText("曲线 Y")]
[ShakeCurvePreset]
public AnimationCurve curveY;
[ShowIf("active")]
[LabelText("Remap Min")]
public Vector2 remapMin;
[ShowIf("active")]
[LabelText("Remap Max")]
public Vector2 remapMax;
@@ -153,7 +131,6 @@ namespace Cielonos.MainGame.Effects.Feedback
{
return new Vector2CurveChannel
{
active = true,
curveX = new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f)),
curveY = new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f)),
remapMin = Vector2.zero,
@@ -164,9 +141,8 @@ namespace Cielonos.MainGame.Effects.Feedback
/// <summary>
/// 根据归一化时间计算Vector2值。
/// </summary>
public Vector2 Evaluate(float normalizedTime, Vector2 initialValue)
public readonly Vector2 Evaluate(float normalizedTime, Vector2 initialValue)
{
if (!active) return Vector2.zero;
float t = Mathf.Clamp01(normalizedTime);
float x = curveX?.Evaluate(t) ?? 0f;
float y = curveY?.Evaluate(t) ?? 0f;

View File

@@ -39,26 +39,19 @@ namespace Cielonos.MainGame.Effects.Feedback
/// 将给定的本地空间向量根据当前设置转换到世界空间。
/// 如果两个方向都开启,角色方向优先。
/// </summary>
/// <param name="localAmplitude">本地空间的振幅向量</param>
/// <param name="standardScreenVector">在摄像机和角色相同朝向时,屏幕空间的振幅向量</param>
/// <param name="ownerTransform">角色 Transform可能为 null</param>
/// <returns>经方向变换后的振幅向量</returns>
public Vector3 TransformAmplitude(Vector3 localAmplitude, Transform ownerTransform)
public Vector3 TransformAmplitude(Vector3 standardScreenVector, Transform ownerTransform)
{
if (affectedByCharacterDirection && ownerTransform != null)
{
return ownerTransform.TransformDirection(localAmplitude);
}
Camera mainCamera = MainGameManager.Instance?.player?.viewSc?.playerCamera;
if (mainCamera == null) return standardScreenVector;
if (affectedByCameraDirection)
{
Camera mainCamera = MainGameManager.Instance.player.viewSc.playerCamera;
if (mainCamera != null)
{
return mainCamera.transform.TransformDirection(localAmplitude);
}
}
Quaternion characterRotation = ownerTransform?.rotation ?? Quaternion.identity;
Quaternion cameraRotation = mainCamera.transform.rotation;
return localAmplitude;
Quaternion deltaRotation = Quaternion.Inverse(cameraRotation) * characterRotation;
return deltaRotation * standardScreenVector;
}
}
}

View File

@@ -16,7 +16,7 @@ namespace Cielonos.MainGame.Effects.Feedback
[TitleGroup("FOV设置")]
[LabelText("FOV曲线")]
public FloatCurveChannel fovCurve = FloatCurveChannel.CreateDefault(remapMax: 10f);
public FloatCurveChannel fovCurve = FloatCurveChannel.CreateDefault();
protected override void TriggerEvent(FeedbackContext context)
{
@@ -30,11 +30,6 @@ namespace Cielonos.MainGame.Effects.Feedback
public override bool Validate(out string error)
{
if (!fovCurve.active)
{
error = "FOV curve is not enabled.";
return false;
}
error = null;
return true;
}

View File

@@ -44,7 +44,7 @@ namespace Cielonos.MainGame.Effects.Feedback
{
Vector3 finalAmplitude = directionSettings.TransformAmplitude(amplitude, context.owner);
float intensityMultiplier = ComputeAttenuation(context);
CameraRotationShakeEvent.Trigger(context, intensityCurve, finalAmplitude * intensityMultiplier);
CameraPositionShakeEvent.Trigger(context, intensityCurve, finalAmplitude * intensityMultiplier);
}
protected override void StopEvent(FeedbackContext context)
@@ -66,11 +66,6 @@ namespace Cielonos.MainGame.Effects.Feedback
public override bool Validate(out string error)
{
if (!intensityCurve.active)
{
error = "Intensity curve is not enabled.";
return false;
}
error = null;
return true;
}

View File

@@ -17,8 +17,7 @@ namespace Cielonos.MainGame.Effects.Feedback
public Vector3 amplitude;
[LabelText("X轴曲线")]
public FloatCurveChannel intensityCurve = FloatCurveChannel.CreateDefault(remapMax: 5f);
public FloatCurveChannel intensityCurve = FloatCurveChannel.CreateDefault();
public CameraDirectionSettings directionSettings = new CameraDirectionSettings();
@@ -40,8 +39,8 @@ namespace Cielonos.MainGame.Effects.Feedback
protected override void TriggerEvent(FeedbackContext context)
{
Vector3 finalAmplitude = directionSettings.TransformAmplitude(amplitude, context.owner);
float intensityMultiplier = ComputeAttenuation(context);
CameraRotationShakeEvent.Trigger(context, intensityCurve, finalAmplitude * intensityMultiplier);
float attenuation = ComputeAttenuation(context);
CameraRotationShakeEvent.Trigger(context, intensityCurve, finalAmplitude * attenuation);
}
protected override void StopEvent(FeedbackContext context)

View File

@@ -58,11 +58,11 @@ namespace Cielonos.MainGame.Effects.Feedback
{
AnimeACESShakeEvent.Trigger(
context,
exposureChannel,
contrastChannel,
saturationChannel,
hueChannel,
colorFilterChannel
modifyExposure, exposureChannel,
modifyContrast, contrastChannel,
modifySaturation, saturationChannel,
modifyHue, hueChannel,
modifyColorFilter, colorFilterChannel
);
}

View File

@@ -3,8 +3,16 @@ using UnityEngine;
namespace Cielonos.MainGame.Effects.Feedback
{
public class BloomAction : CurveShakeAction
public class BloomAction : PostprocessingActionBase
{
protected override void TriggerEvent(FeedbackContext context)
{
throw new System.NotImplementedException();
}
protected override void StopEvent(FeedbackContext context)
{
throw new System.NotImplementedException();
}
}
}

View File

@@ -0,0 +1,60 @@
using System;
using Sirenix.OdinInspector;
using SLSUtilities.Feedback;
using UnityEngine;
namespace Cielonos.MainGame.Effects.Feedback
{
/// <summary>
/// RGB分离故障反馈动作通过 RGBSplitGlitchShakeEvent 触发 RGBSplitGlitchShaker。
/// </summary>
[Serializable]
[FeedbackActionColor(1f, 0.3f, 0.8f)]
public class RGBSplitGlitchAction : PostprocessingActionBase
{
public override string DisplayName => "RGB Split Glitch";
[LabelText("强度曲线")]
public FloatCurveChannel intensityCurve = FloatCurveChannel.CreateDefault(remapMax: 1f);
[LabelText("修改速度")]
public bool modifySpeed;
[ShowIf("modifySpeed")]
[LabelText("速度曲线")]
public FloatCurveChannel speedCurve = FloatCurveChannel.CreateDefault(remapMax: 50f);
[HideIf("modifySpeed")]
[LabelText("速度")]
[Range(0f, 100f)]
public float speed = 30f;
protected override void TriggerEvent(FeedbackContext context)
{
FloatCurveChannel finalSpeedCurve = modifySpeed
? speedCurve
: new FloatCurveChannel
{
curve = AnimationCurve.Constant(0f, 1f, speed),
relativeToInitial = false
};
RGBSplitGlitchShakeEvent.Trigger(
context,
intensityCurve,
finalSpeedCurve
);
}
protected override void StopEvent(FeedbackContext context)
{
RGBSplitGlitchShakeEvent.Trigger(context, intensityCurve, stop: true);
}
public override bool Validate(out string error)
{
error = null;
return true;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: dc20b82d80b720247a0ef6db8513af02

View File

@@ -14,73 +14,53 @@ namespace Cielonos.MainGame.Effects.Feedback
{
public override string DisplayName => "Vignette";
public FloatCurveChannel intensityCurve = FloatCurveChannel.CreateDefault(remapMax: 1f);
/// <summary>
/// 是否修改暗角中心点。
/// </summary>
[LabelText("修改中心点")]
public bool modifyCenter;
/// <summary>
/// 模糊中心的屏幕坐标 (0-1)。(0.5, 0.5) 为屏幕正中心。
/// </summary>
[HideIf("modifyCenter")]
[LabelText("中心点")]
public Vector2 center = new Vector2(0.5f, 0.5f);
[ShowIf("modifyCenter")]
[LabelText("中心点曲线")]
public Vector2CurveChannel centerCurve = Vector2CurveChannel.CreateDefault();
/// <summary>
/// 是否修改颜色。
/// </summary>
[LabelText("修改颜色")]
public bool modifyColors;
[HideIf("modifyColors")]
public Color outColor;
[HideIf("modifyColors")]
public Color innerColor;
/// <summary>
/// 外圈颜色。
/// </summary>
[ShowIf("modifyColors")]
[LabelText("外圈颜色")]
public Color outColor = Color.black;
[HideIf("modifyColors")]
[LabelText("内圈颜色")]
public Color innerColor = Color.black;
[ShowIf("modifyColors")]
[LabelText("外圈颜色曲线")]
public ColorCurveChannel outerColorCurve = ColorCurveChannel.CreateDefault();
/// <summary>
/// 内圈颜色。
/// </summary>
[ShowIf("modifyColors")]
[LabelText("内圈颜色")]
[LabelText("内圈颜色曲线")]
public ColorCurveChannel innerColorCurve = ColorCurveChannel.CreateDefault();
/// <summary>
/// 是否修改形状。
/// </summary>
[LabelText("修改形状")]
public bool modifyShape;
[HideIf("modifyShape")]
public float smoothness;
[LabelText("柔和度")]
public float smoothness = 0.5f;
[HideIf("modifyShape")]
public float roundness;
[LabelText("圆度")]
public float roundness = 1f;
/// <summary>
/// 柔和度曲线。
/// </summary>
[ShowIf("modifyShape")]
[LabelText("柔和度曲线")]
public FloatCurveChannel smoothnessCurve = FloatCurveChannel.CreateDefault(remapMax: 0.5f);
/// <summary>
/// 圆度曲线。
/// </summary>
[ShowIf("modifyShape")]
[LabelText("圆度曲线")]
public FloatCurveChannel roundnessCurve = FloatCurveChannel.CreateDefault(remapMax: 1f);
@@ -91,13 +71,18 @@ namespace Cielonos.MainGame.Effects.Feedback
context,
intensityCurve,
modifyCenter,
center,
modifyCenter ? centerCurve : default,
modifyCenter ? center : default(Vector2),
modifyColors,
outerColorCurve,
innerColorCurve,
modifyColors ? outerColorCurve : default,
modifyColors ? innerColorCurve : default,
modifyColors ? outColor : default,
modifyColors ? innerColor : default,
modifyShape,
smoothnessCurve,
roundnessCurve
modifyShape ? smoothnessCurve : default,
modifyShape ? roundnessCurve : default,
modifyShape ? smoothness : 0f,
modifyShape ? roundness : 0f
);
}