Had a really weird bug. I'd run it once and it'd be fine, then again and lots of errors. Turned out that the IsRunning state on the GameModeTrigger was being saved between runs on the ScriptableObject. So I'd run it, the end trigger would be running, then I'd stop it. Then I'd run again, and IsRunning on the end trigger was still true, so it'd mess up. BUT IsRunning is a property... surely properties aren't usually serialized! Really weird but totally confirmed in testing.