To make use of behavior instantiation, users should acquaint themselves with Blueprint helper class.

Blueprints are used in Utility Reasoner to identify which evaluators should be taken into consideration for each Context.

Blueprint is a template class so user should provide following template parameters:
  • InstanceType - Type of instantiated object (usually Behavior).

  • ContextType - Context type. It identifies what data should be used during utility selection. It is also used as parameter during object instantiation.

  • DataType - Type of data which containing subset of game state which can be used to generate valid Contexts.

Each blueprint needs to be passed 3 parameters during construction:
  1. name - Used mostly to identify the blueprint during debugging.

  2. contextProducer - Callable returning container of ContextType and taking DataType as an argument. This abstraction should generate Contexts valid at given moment, so that they can be used in Selector to determine which object should be instantiated.

  3. instanceProducer - Callable returning instance of InstanceType and taking ContexType as an argument. This abstraction should instantiate proper object of type InstanceType given Context properly returned from Selector.

Usage Example

  • C++

  • C#

grail::utility::Blueprint<grail::Behavior, grail::EntityBlackboardPair, grail::AIEntity> blueprint{"attack", Attack::ProduceContexts, [](const grail::EntityBlackboardPair& pair} { std::make_unique<Attack>(pair.second.GetValue<Enemy>("enemy")); }
using EntityBlackboardPair = ValueTuple<AIEntity, Blackboard>;

var blueprint = new Blueprint<Behavior, EntityBlackboardPair, AIEntity>("attack", Attack.ProduceContexts, (in EntityBlackboardPair pair) => { return new Attack(pair.Item2.GetValue<Enemy>("enemy"); });

API Reference