Aetheria/Assets/Scripts/Gameplay/ImpactFeedback.cs
Meta Vens 97d94ecfae Present landed impacts: shield ripple, hull reaction and camera kick through one ImpactPresenter
ImpactPresenter (bound on every EntityInstance by SetEntity through the one CapabilityPresentationBinder) renders
feedback-1's absorbs: Feedback.Cue decides intensity and shake, DrawAhead.Carried the drawn point; a hull absorb
spawns ImpactFeedback's pooled effect under the instance, and a cue with shake raises a Cinemachine impulse.
ShieldManager ripples on a Shield-layer absorb. MainMenu gains a Screen Shake slider that persists on Back.
Editor: WireImpactFeedback (scene wiring, scene diff in the next commit) and ImpactPresenterSmoke.
Unity batchmode compile 0 error CS; ImpactPresenterSmoke exit 0. The scene is not yet wired in this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:10:04 +02:00

39 lines
1.5 KiB
C#

using Cinemachine;
using UnityEngine;
// Presentation tuning for landed impacts (ImpactPresenter reads it, nothing in the simulation does): the hull
// reaction's effect prefab and size, how strongly a hit's share of the hull reads (Feedback.Cue's intensityScale),
// and the camera impulse. A scene component, so the scene is where it is tuned; absent in menus and test scenes,
// where ImpactPresenter does nothing.
public class ImpactFeedback : MonoBehaviour
{
public static ImpactFeedback Instance { get; private set; }
// A scene instance of a pooled hit effect (Prototype); a hit spawns one under the struck EntityInstance.
public Prototype HullEffect;
// Multiplies a hit's share of the receiver's max durability before it saturates to 0..1 (Feedback.Cue).
public float IntensityScale = 10f;
// The effect's scale never drops below this, so the lightest hit still reads.
public float MinEffectScale = .3f;
public CinemachineImpulseDefinition Impulse = new CinemachineImpulseDefinition();
// Impulses raised since the scene loaded; the batchmode smoke reads it.
public int KicksRaised { get; private set; }
private void Awake() => Instance = this;
private void OnDestroy()
{
if (Instance == this) Instance = null;
}
// Raises one camera impulse of the given force, travelling along `direction` from `position`.
public void Kick(Vector3 position, Vector3 direction, float force)
{
KicksRaised++;
Impulse.CreateEvent(position, direction.normalized * force);
}
}