Unity (C#) error tracking
Know when your Unity (C#) app breaks, before your users do
Any uncaught managed exception is reported automatically, once ForgeOpsTrackerClient.Init has run. Self-hosted, so nothing about a Unity (C#) app's errors or its users' data ever leaves infrastructure you control.
Install
// Packages/manifest.json
{ "dependencies": { "com.forgeops.tracker": "file:/path/to/forge_ops/sdks/unity" } }
using ForgeOpsTracker.Unity;
ForgeOpsTrackerClient.Init(c => {
c.Dsn = "https://<api_key>@your-forgeops-host/api/v1/events";
});
A true native crash in IL2CPP-compiled code needs a separate native crash layer this package doesn't cover yet.
Every client reports the same shape
Wherever it comes from, an event arrives with an exception class, a message, and a backtrace, plus whatever environment/release/server context that client can gather on its own. ForgeOps fingerprints and groups on the first three, so a Unity (C#) app's issues list works exactly the same way every other language's does: report the same bug a thousand times and it's still one row, not a thousand.
No agent, no sidecar: it's a plain HTTPS POST to your own ForgeOps instance's ingestion API, so nothing about a Unity (C#) app's traffic ever leaves infrastructure you control.
Works with your framework
The Unity (C#) client hooks in at the framework level, not by wrapping individual calls, so nothing about how you already write Unity (C#) code has to change.
Uncaught managed exceptions
Application.logMessageReceivedThreaded catches whatever the player loop's own try/catch already logs as LogType.Exception.
Background-thread exceptions
AppDomain.UnhandledException covers a thread your own game code started, one Unity's player loop doesn't already protect.
Caught exceptions
ForgeOpsTrackerClient.CaptureException reports directly from a catch block, with optional context.
What it looks like
The issue list
Every Unity (C#) issue reported into a project shows up here: title, status, assignee, event count, and when it was last seen, the same columns as any other language's project.
The issue detail
Every occurrence keeps its own timestamp, environment, release, and server, plus the backtrace exactly as Unity (C#) reported it, expandable per occurrence rather than flattened into one generic stack.
Alerting
A new Unity (C#) issue, a regression, or a spike past a threshold you set can reach Slack, email, SMS, a voice call, or a generic webhook, configured per project, per trigger.
Heartbeats
For the failure mode error tracking can't see on its own: a Unity (C#) cron job or recurring task that's supposed to run but silently stopped. Each heartbeat gets its own ping URL and its own grace period before it alerts.
Questions
Do I need to change how I already handle errors?
No. Every client hooks the framework's own exception handling directly, the same way the install snippet above shows -- your own logs, error pages, and rescue blocks keep working exactly as they did before. ForgeOps just also finds out about it.
Where does the data actually go?
Straight to your own ForgeOps instance over plain HTTPS. No agent, no sidecar, no third-party ingestion service in between -- nothing about your app's traffic or its users' data ever leaves infrastructure you control.
What happens if the same bug fires a thousand times?
It's fingerprinted from its exception class, message, and backtrace, so a thousand reports of the same bug still show up as one issue with an event count of 1,000, not a thousand separate rows to dig through.
Is anything scrubbed before it's stored?
Yes. Emails, credit card numbers, and known API key/token formats are redacted out of every event before it's even written, on every plan, with room for per-project custom field names on top of the defaults.