新Feedback系统

This commit is contained in:
SoulliesOfficial
2026-04-12 02:11:15 -04:00
parent f26f9fd374
commit 41140a2017
171 changed files with 296190 additions and 219527 deletions

View File

@@ -0,0 +1,98 @@
using System;
using MoreMountains.FeedbacksForThirdParty;
using Sirenix.OdinInspector;
using SLSUtilities.Feedback;
using UnityEngine;
namespace Cielonos.MainGame.Effects.Feedback
{
/// <summary>
/// 摄像机旋转震动反馈,通过 MMCinemachineRotationShakeEvent 触发现有的 Shaker。
/// X/Y 作用于 FollowTarget 旋转Z 作用于 Dutch 倾斜。
/// </summary>
[Serializable]
public class CameraRotationShakeAction : FeedbackActionBase
{
public override string DisplayName => "Camera Rotation Shake";
/// <summary>
/// 震动曲线,定义震动强度随时间的变化。
/// </summary>
[Title("Rotation Shake")]
[LabelText("Shake Curve")]
public AnimationCurve shakeCurve = new AnimationCurve(
new Keyframe(0f, 0f),
new Keyframe(0.2f, 1f),
new Keyframe(1f, 0f)
);
/// <summary>
/// 最大旋转角度振幅。X/Y -> FollowTarget, Z -> Dutch。
/// </summary>
[LabelText("Rotation Amplitude")]
public Vector3 rotationAmplitude = new Vector3(2f, 2f, 5f);
/// <summary>
/// 方向影响设置。
/// </summary>
[Title("Direction")]
public CameraDirectionSettings directionSettings = new CameraDirectionSettings();
/// <summary>
/// 距离衰减。
/// </summary>
[Title("Distance Attenuation")]
[LabelText("Use Attenuation")]
public bool useAttenuation;
[ShowIf("useAttenuation")]
[LabelText("Attenuation Range")]
public float attenuationRange = 50f;
[ShowIf("useAttenuation")]
[LabelText("Attenuation Curve")]
public AnimationCurve attenuationCurve = new AnimationCurve(
new Keyframe(0f, 1f),
new Keyframe(1f, 0f)
);
public override void OnStart(FeedbackContext context)
{
Vector3 finalAmplitude = directionSettings.TransformAmplitude(rotationAmplitude, context.owner);
float intensityMultiplier = ComputeAttenuation(context);
MMCinemachineRotationShakeEvent.Trigger(
null,
shakeCurve,
context.duration,
finalAmplitude,
0f, 1f, false,
intensityMultiplier
);
}
public override void OnInterrupt(FeedbackContext context)
{
MMCinemachineRotationShakeEvent.Trigger(
null, shakeCurve, 0f, Vector3.zero,
0f, 1f, false,
stop: true
);
}
/// <summary>
/// 计算距离衰减系数。
/// </summary>
private float ComputeAttenuation(FeedbackContext context)
{
if (!useAttenuation || context.owner == null) return 1f;
Camera mainCamera = Camera.main;
if (mainCamera == null) return 1f;
float distance = Vector3.Distance(context.owner.position, mainCamera.transform.position);
float normalizedDistance = Mathf.Clamp01(distance / attenuationRange);
return attenuationCurve.Evaluate(normalizedDistance);
}
}
}