Acabo de ver esa implementación y me pregunto por qué se necesita tanto código para algo relativamente simple.
Según lo que dices, quieres una forma simple de componer comportamientos. Un comportamiento aquí, supongo, es un mapeo de un estado a cero o más acciones de un agente. Puedes modelar esto muy fácilmente usando C# lambdas. Por ejemplo:
Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) {
return() => { if cond() then ifTrue() else ifFalse() };
}
Action Sequencer(Action a, Action b) {
return() => { a(); b(); }
}
Las hojas de su árbol son simples Acciones que hacen algo apropiado para el estado. Usted "ejecuta" un árbol simplemente ejecutándolo.
Si quieres ser elegante, puedes parametrizar este esquema para hacer explícito el estado.
Espero que esto ayude.
---- ---- Adición
Jason pidió un ejemplo de cómo se puede utilizar este enfoque, así que aquí está un ejemplo simple guardia patrullando "AI" (supongo WorldState corresponde a una descripción de la medio ambiente en el momento de evaluar el comportamiento del árbol):
Func<bool> ifPlayerIsInSight =() => ...true iff WorldState shows guard can see player...;
Action shootAtPlayer =() => { ...aim guard's weapon at player and fire... };
Func<bool> ifUnderFire =() => ...true iff WorldState shows guard hears player gunfire...;
Action takeCover =() => { ...guard runs for nearest shelter... };
Action walkBackAndForthGuardingDoorway =() => { ...default guard patrol behaviour... };
Action patrollingGuardBehaviour =
Selector(ifPlayerIsInSight, shootAtPlayer,
Selector(ifUnderFire, takeCover,
walkBackAndForthGuardingDoorway));
Para hacer que el guardia de hacer algo, simplemente llame patrollingGuardBehaviour()
. Tenga en cuenta que las diversas subacciones y pruebas se pueden implementar como métodos con las firmas correctas en lugar de en línea como lambdas. Puede agregar otros combinadores a Selector
y Sequencer
, por ejemplo, para actividad paralela.
La biblioteca que mencionó en code.google.com se agregó hace casi un año y se actualizó por última vez dos semanas después. Si planea usarlo, probablemente no encontrará ningún ejemplo, puede ser mejor si busca otra biblioteca o desarrolla la suya propia. – tbridge