我已经慢慢开始使用C#/ Unity学习AI编程。我刚完成我的第一个FSM,现在想搬到决策树。我希望它简单易行。我只是在尝试以任何方式进行推广之前,四处游玩以了解概念。
我买了一本AI-Unity书,上面有一个代码示例的轮廓。我觉得书中没有足够的信息继续学习。
这就是多数民众赞成:
父类 DecisionTreeNode ,从中派生其他类。
public class DecisionTreeNode : MonoBehaviour
{
public virtual DecisionTreeNode MakeDecision()
{
return null;
}
}
伪抽象类决定
public class Decision : DecisionTreeNode
{
public Action nodeTrue;
public Action nodeFalse;
public virtual Action GetBranch()
{
return null;
}
}
伪抽象类动作
public class Action : DecisionTreeNode
{
public bool activated = false;
public override DecisionTreeNode MakeDecision()
{
return this;
}
}
public virtual void LateUpdate()
{
if (!activated)
return;
// Implement your behaviors here
}
最后一堂课 DecisionTree
public class DecisionTree : DecisionTreeNode
{
public DecisionTreeNode root;
private Action actionNew;
private Action actionOld;
}
public override DecisionTreeNode MakeDecision()
{
return root.MakeDecision();
}
void Update()
{
actionNew.activated = false;
actionOld = actionNew;
actionNew = root.MakeDecision() as Action;
if (actionNew == null)
actionNew = actionOld;
actionNew.activated = true;
}
所以可以说我想要一个带有4个参数的NPC的简单游戏:饿,渴,困和无聊。 这些参数可以用“是”或“否”(是或否)回答。
如果签出饿了,NPC将步行到苹果吃它。如果它是困了,它将走到床上;如果渴了,它将走到床上;如果感到无聊,它将走到球上。
如何执行决定?
据我所知,决策可以实现为单独的类,而所有类都可以从DecisionTreeNode中获取。 像这样:
public class FoodClass : DecisionTreeNode {}
public void GotoApple()
{
// Walk to the apple
}
现在从这里我看不到如何继续。
在动作类的LateUpdate()中,// //在此处执行您的行为。 我是否应该在此函数中实现if / else-statements,它检查某些布尔值,如
If(isHungry)
{
foodclass.GoToApple();
}
else if(IsSleepy)
...等等,以及所有不同的布尔值?所有这些if / else语句都好像在破坏DT的目的吗?
或者这些节点类都应该具有LateUpdate(),在那里它们自己在这里检查NPC是否饿?
您认为决定类别的 Action 紫色是什么?
我真的希望你们中的一些人能看到它们将所有这些类及其功能相互连接的含义。谢谢您阅读本文!