Como las personas existentes ya han agregado buenas respuestas, permítanme responder situaciones no cubiertas.
Si está en una posición en la que ha completado la codificación de su juego y ahora comienza a codificar los logros y le resulta muy complejo mantener demasiadas variables y recuentos y eliminarlos en ciertos eventos y cosas por el estilo.
Siempre puede crear una clase (preferiblemente singleton) para recibir todos los eventos. Ahora enumera todos tus logros. Luego, enumere todos los eventos del juego necesarios para realizar un seguimiento. Por ejemplo, mi lista actual se ve así
KILL ENEMY - caminar, balas MUERTE DEL JUGADOR - caer_off, salud ENTER_ROOM, EXIT_ROOM etc.
Esos detalles adicionales como caminar, las balas pueden ser parámetros. Ahora tenga una función llamada fireEvent en esa clase de seguimiento de Logro. Busque todos los lugares en el código donde necesita disparar eventos y llamar a esa función. Ahora haga el resto del trabajo sucio en la clase Logros. Esta es la forma más segura de no alterar el código existente y los logros del código. Funcionó bastante rápido para mí.