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>
39 lines
1.5 KiB
C#
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);
|
|
}
|
|
}
|