So, I’m making a Cat and Lazer pointer game in UE4. I’ve redone the AI system now several times, I’m on my 4th iteration.
I had been using the built in Behavior Tree system in UE4, but I kept having issues with it. Basically I would get a behavior to work and move on to another part of the game, then when I’d come back to the AI a couple months later my cat wouldn’t move, or no longer looked at the laser etc.
I give up. I don’t know if I’m using it in a way that wasn’t intended or changes are made to the system that break my functionality when I update. Either way, it’s better for me if I just do it myself.
What is an Infinite Axis Utility System?
Here is a screenshot of the GUI Editor for the System:
In a nutshell it is a system that returns an Action to perform with the highest value. It’s bascially a list of Actions and each Action has a list of “Axis”. Dave Mark did a talk on it at GDC a couple years ago and that’s where I heard about it. I think he also mentioned a Cat and Laser pointer game in the same talk actually which was the initial seed idea of Lol Cats I Can Has Lazer, though our game went it’s own design direction.
Here is a link to the talks:
Those videos go into the nuts and bolts of the system. The book Behavioral Mathmatics for Game AI is also a good source and I recommend reading it if you intend to implement a Utility System. It really gets into the design aspect of how to model behaviors as math functions.
Here is a link to a GDC talk of an evolved version of the Utility System used in an MMO:
http://www.gdcvault.com/play/1021848/Building-a-Better-Centaur-AI
After watching that I decided to incorporate some of the ideas into my system. My first couple IAUS ( Infinite Axis Utility System ) were not optimized at all. They were dynamic classes with functions. I wanted to describe my system in a more Data Centric way, and then have the System itself hold the functions that work on the data.
I choose this because it was easier to describe a system of data in the UE4 Editor than classes. Having TARRAY’s of structs with enums and floats as variables is very easy. With classes it’s not so easy.