Я являюсь автором TreeSharp, если у вас, ребята, есть какие-либо вопросы, не стесняйтесь отправлять мне электронные письма (они содержатся в каждом исходном файле в шапке).
Сначала вам нужно понять концепции деревьев поведения (различия между селекторами, последовательностями, декораторами, действиями и т. П.). Я также предоставляю несколько «тщеславных» композиций, чтобы немного упростить задачу (например, «Ожидание»).
API на основе конструктора позволяет полностью определять деревья с помощью ctors (с использованием делегатов, которые оцениваются во время выполнения для принятия решений и т. Д.)
К сожалению, я так и не удосужился реализовать класс TreeExecutor, который обрабатывает выполнение ветви произвольного поведения из чего-то вроде метода Tick (). Самый простой способ (с использованием PrioritySelector в этом примере, но вы можете использовать любой композит) заключается в следующем:
static void Start()
{
// Start MUST be called before you can tick the tree.
Logic.Start(null);
// do work to spool up a thread, or whatever to call Tick();
}
private static void Tick()
{
try
{
Logic.Tick(null);
// If the last status wasn't running, stop the tree, and restart it.
if (Logic.LastStatus != RunStatus.Running)
{
Logic.Stop(null);
Logic.Start(null);
}
}
catch (Exception e)
{
// Restart on any exception.
Logging.WriteException(e);
Logic.Stop(null);
Logic.Start(null);
throw;
}
}
К сожалению, приведение «примеров» его использования действительно зависит от того, для чего вы его используете. (Поскольку он настолько общий, трудно давать примеры, которые будут иметь смысл для любого конкретного проекта. Я использовал его от вещей до логики ИИ, рабочих процессов, вплоть до процессов планирования)
Небольшой пример, который может немного помочь;
static Composite CreateFireMissile()
{
return new PrioritySelector(
new Decorator(ret => CurrentShip.CurrentTarget != null,
new Action(ret => CurrentShip.CurrentTarget.FireMissile())),
new Decorator(ret => CurrentShip.CurrentTarget == null,
new Decorator(ret => CurrentShip.NearbyHostiles.Count > 0,
new Sequence(
new Action(ret => CurrentShip.SetTarget(CurrentShip.NearbyHostiles[0])),
new Action(ret => CurrentShip.RotateTo(CurrentShip.CurrentTarget.Location))
)
)
)
);
}
Опять же, это действительно зависит от ваших требований. Библиотека позволит вам создавать подклассы для любых композитов для упрощения их повторного использования. (Например, вы можете создать действие SetTargetAndRotate, которое исключает два действия в последовательности)
Опять же, если у вас, ребята, есть вопросы, не стесняйтесь спрашивать.