Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/vchelaru/flatredball2/cameranpx skills add vchelaru/FlatRedBall2 --skill cameragit clone --depth 1 https://github.com/vchelaru/FlatRedBall2Wrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/vchelaru/flatredball2/camera)<a href="https://agentmods.dev/skills/vchelaru/flatredball2/camera"><img src="https://agentmods.dev/badge/skills/vchelaru/flatredball2/camera.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00079 | $0.03457 |
| Opus 5 | $0.00039 | $0.01729 |
| Sonnet 5 | $0.00016 | $0.00691 |
| Haiku 4.5 | $0.00008 | $0.00346 |
Grade A, and why
camera scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 296 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Camera in FlatRedBall2
Every Screen has a Camera property. Access it directly — no initialization required.
Screen.Camera // type: FlatRedBall2.Rendering.Camera
Background Color
Camera.BackgroundColor = Color.Black; // default
Camera.BackgroundColor = Color.CornflowerBlue;
Set this in CustomInitialize. It applies immediately.
World Bounds
Camera.OrthogonalWidth and Camera.OrthogonalHeight are the visible world extents at Zoom = 1. They are computed by the engine from DisplaySettings — do not assign directly.
World coordinates are centered at the origin:
- X ∈ [−OrthogonalWidth/2, OrthogonalWidth/2]
- Y ∈ [−OrthogonalHeight/2, OrthogonalHeight/2]
Y+ is up (see physics-and-movement).
wall.Y = -Camera.OrthogonalHeight / 2f; // bottom of screen
Prefer Camera.Left/Right/Top/Bottom for edges — they account for Zoom and camera position.
Screen-edge boundaries (keeping entities in bounds) are a collision concern, not a camera concern — use wall entities or
TileShapes. See thecollision-relationshipsandshapesskills.
DisplaySettings — Resolution, Aspect, Zoom
FlatRedBallService.Default.DisplaySettings controls how the camera is configured at each screen start. Set these before calling Start<T>() or between screens.
var ds = FlatRedBallService.Default.DisplaySettings;
ds.ResolutionWidth = 1280; // design world width in world units
ds.ResolutionHeight = 720; // design world height in world units
ds.AspectPolicy = AspectPolicy.Locked; // default: pillar/letterbox to aspect
ds.FixedAspectRatio = null; // default: derive from Resolution; set to override
ds.DominantAxis = DominantAxis.Height; // default: pin design height when aspect differs
ds.ResizeMode = ResizeMode.StretchVisibleArea; // default: same world always visible
ds.LetterboxColor = Color.Black;
ds.WindowMode = WindowMode.Windowed; // or FullscreenBorderless
ds.PreferredWindowWidth = 1280; // startup window pixel size (null = leave as-is)
ds.PreferredWindowHeight = 720;
ds.AllowUserResizing = false; // default: fixed canvas; set true to let the player resize
ds.TextureFilterMode = TextureFilterMode.Point; // default: crisp pixel art; Linear for smooth-scaled/card art
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 296 lines · 79 tokens per session scan A eb55b887e047
camera is a skill published in the GitHub repository vchelaru/FlatRedBall2 (14 stars, last pushed yesterday), licensed MIT. It adds 79 tokens to every session and 3,457 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-04.
Other skills, from other repositories
gameobject-component-destroy
Destroy one or more Components from a target GameObject. Missing (null) components are skipped — they cannot be destroyed. Use 'gameobject-find' and 'gameobject-component-get' to identify the components first.
unity-version-split
Split a C# file into Unity 6.5+ and pre-Unity 6.5 variants. Use when a file needs different implementations for different Unity versions due to API changes (e.g., EntityId vs int, GetEntityId vs GetInstanceID).
playtest-report
Generates a structured playtest report template or analyzes existing playtest notes into a structured format. Use this to standardize playtest feedback collection and analysis.
unity-manual-component
Manually add, configure, reorder, and copy components on GameObjects using Unity Editor UI. For one-off Inspector workflows that do not need REST automation.
godot-signals-groups
Build event-driven, decoupled Godot 4.7 gameplay with signals and node groups: declare and emit custom signals, connect with Callables (incl. bind/one-shot), and broadcast to many nodes via groups and callgroup. Use when wiring node communication in a Godot project, replacing tight references with signals…
threejs-exposure-color-grading
Build a measured exposure and grading path in Three.js. Use for a 64x36 encoded luminance meter, asynchronous readback, weighted log-average exposure, asymmetric adaptation, single tone-map ownership, and a generated 32-cube post-tone-map LUT.