uw-game-feel-integrator-3028cb — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited uw-game-feel-integrator-3028cb (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Apply juice to gameplay events using the GFD Feedback Matrix.
docs/ProjectConfig.yaml for:feel_tools.tweening — which tween library ("dotween", "primetween", or "none").feel_tools.feedback_system — feedback framework if any.feel_tools.audio — audio middleware.feel_tools.camera — camera system (Cinemachine, custom, etc.).mcp.unity_mcp — if true, call refresh_unity after creating files.docs/GFD.md for the Feedback Matrix — it defines which events need which feedback channels.docs/CODING_STANDARDS.md for async patterns (Awaitable + CancellationToken) used in middleware-agnostic patterns.Every meaningful action needs feedback in at least 3 channels: Visual, Audio, Kinesthetic.
async Awaitable coroutinesprivate async Awaitable Hitstop(float duration = 0.05f)
{
Time.timeScale = 0f;
await Awaitable.WaitForSecondsAsync(duration);
Time.timeScale = 1f;
}[System.Serializable]
public struct ShakeProfile
{
public float duration;
public float magnitude;
public static ShakeProfile Light => new() { duration = 0.1f, magnitude = 0.1f };
public static ShakeProfile Medium => new() { duration = 0.2f, magnitude = 0.3f };
public static ShakeProfile Heavy => new() { duration = 0.35f, magnitude = 0.6f };
}Frequently spawned FX (particles, floating text, projectiles) must be pooled to avoid GC spikes:
public class FXPool<T> where T : MonoBehaviour
{
private readonly Queue<T> _pool = new();
private readonly T _prefab;
private readonly Transform _parent;
public T Get() {
var item = _pool.Count > 0 ? _pool.Dequeue() : Object.Instantiate(_prefab, _parent);
item.gameObject.SetActive(true);
return item;
}
public void Return(T item) {
item.gameObject.SetActive(false);
_pool.Enqueue(item);
}
}Rules: Pool all particles, floating text, projectiles. Return to pool on OnParticleSystemStopped or after tween completes. Pre-warm pools during scene load.
Tweens must be killed when their target is destroyed or disabled, otherwise they cause null reference exceptions or operate on stale objects.
DOTween:
private void OnDestroy()
{
transform.DOKill(); // Kill all tweens on this transform
}PrimeTween:
private void OnDestroy()
{
Tween.StopAll(this); // Kill all tweens targeting this object
}No middleware (Awaitable): Use CancellationToken linked to destroyCancellationToken:
private async Awaitable FlashAsync()
{
var ct = destroyCancellationToken;
// Awaitable work — auto-cancels when MonoBehaviour is destroyed
await Awaitable.WaitForSecondsAsync(0.1f, ct);
}docs/ASSET_RESOURCES.md for curated free/paid sources.uw-unity-test-runner — test feel parameters (shake profile values, hitstop duration) in EditMode tests.uw-code-review to verify Rule of Three and tween cleanup before committing.uw-ui-toolkit-binder for UI Toolkit USS transitions. Use game feel patterns here for effects that go beyond USS (complex sequences, screen flash).uw-unity-debugging if effects aren't triggering or timing feels off.Instantiate in hot paths.OnDestroy or OnDisable to prevent null reference exceptions.[SerializeField] private for shake profiles, tween durations, and other tuning values..asmdef.ProjectConfig.yaml -> mcp.unity_mcp is true, call refresh_unity after creating files.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.