Progression
Achievements and stats
Unlocking achievements, reading progress, and all three kinds of stat.
Achievements and stats are static nodes. You do not need a subsystem, just drop the node.
Unlocking
Unlock Achievement takes the API Name and uploads immediately by default.
It is idempotent. Unlocking an already unlocked achievement succeeds and does nothing, so calling it every frame from a condition check costs nothing and will not re trigger the Steam toast. You do not need to track whether you already unlocked something.
| Node | What it does |
|---|---|
| Unlock Achievement | Unlock one |
| Is Achievement Unlocked | Check one |
| Clear Achievement | Lock it again. Development only. |
| Indicate Achievement Progress | Show a progress toast, for example 50 of 100 |
| Get Achievement Unlock Time | When it was unlocked |
Listing them
| Node | What it does |
|---|---|
| Get Achievement Count | How many this app defines |
| Get Achievement Id At | The API Name at an index |
| Get Achievement Display Name | The player facing name |
| Get Achievement Description | The player facing description |
| Is Achievement Hidden | Whether it is a secret achievement |
| Get Achievement Global Percent | What share of all players have it |
That is everything an achievements screen needs. Loop from 0 to Get Achievement Count.
For icons, use Get Achievement Icon (Async), which returns a texture. It is a latent node because Steam downloads the art on demand, so the synchronous version works only when the icon happens to be cached already.
Stats
Three kinds, and they are not interchangeable. The type is set on the partner site and Steam rejects writes of the wrong kind.
| Type | Node | Use for |
|---|---|---|
| Integer | Set Stat (Integer) | Counts: kills, matches played |
| Float | Set Stat (Float) | Measurements: distance, time |
| Average rate | Update Average Rate Stat | Rates: points per hour |
Average rate stats
These are the ones people get wrong. You do not compute the average. You pass what happened this session and how long it lasted, and Steam maintains the running rate.
| Input | Meaning |
|---|---|
| Count This Session | What accumulated, for example points scored |
| Session Length Seconds | How long it took. Must be above zero. |
Computing an average yourself and writing it to a float stat gives you a mean of session means, which is a different and wrong number as soon as sessions differ in length.
Read the current average back with Get Stat (Float).
Storing
Writes are local until uploaded.
Unlock Achievement stores immediately unless you uncheck Store Immediately, which is what you want when unlocking several at once: uncheck it on each, then call Store Stats once.
Testing without the partner site
Set Mock Mode to Always. The mock implements achievements and stats fully, persists them to disk, and needs no App ID. See First steps.