The worldwide video game industry is bigger than global music industry, and bigger than all movie industries like Hollywood and Bollywood put together. And it is not stopping to grow.
Moving from 2D to 3D games was a watershed moment, and then more recently the proliferation of mobile-based multiplayer gaming has changed the landscape.
Going into the future, AR is a tool that is actively changing the experience of all big and small games. Live object detection, which at one point was not possible without powerful TPUs is not becoming a reality on handheld Android and iOS devices. This opens up the possiblity for games that bridge the gap between physical and virtual worlds. Viral success of games like Ingress and Pokemon Go shows that people are interested in games which have real world experience baked into it.
PKBG brings the familiar PUBG / CS:GO like shooting dynamics, combined with Fortnite's building mechanics that allow us to build walls around us in an AR world and then engage in a shootout with real people who can hide behind virtual walls.
Syncing the AR world across all the players was a big challenge. So we stored AR Cloud anchors in firebase realtime database for all the assets that exists in the Game World, and the world is recreated when anyone joins a game using a game id.
Being able to identify hitboxes for separate body parts, so we can assign difference damage (eg high damage for headshot, less for leg/arm hits) was also challenging. We are using 2 parallel object detection mechanisms (both on-device, because for the required latency, doing cloud-based inference would have been too slow). We are using YOLO Voc conv-net to detect human body forms, even when it is partially visible behind obstacles. We are using Firebase MLKit to detect faces which helps us identify head shots.
Finally there were a lot of game state mutation and concurrency issues, like when someone shoots in quick succession, and the state when the ML inference is running, we can end up with inconsistent state. To prevent this, we have artificially kept a minimum time difference between two gunshots (implemented on the UX layer via 'reloading the gun' state) so that we do not hit race conditions when calculating damage.