我正在使用 Unity 开发一个个人小型 RTS 项目,我正在尝试构建我的单位 AI,用于 Harvester、Solider 等。 我用几个不同的节点构建了一个行为树,这边的一切都运行良好, 我的问题是如何向我的单位下达命令 现在,我的场景中有一个收割机 AI,它收割周围的资源并将它们运送到仓库 单位选择有效,如果我右键单击地形上的某处,命令将发送到所选单位 我的问题从这里开始,我不知道我的做法是否正确 我将
targetPosition
分配给我的单位,并将 _hasOrder
布尔值变为真
在我的 BehavioutTree 中,第一个序列是关于订单的,它检查 _hasOrder
是否为真,然后执行这些操作
问题是,这个序列永远不会运行..
如果有人有想法,也许我应该在我向 AI 发出任何命令时暂停行为树,并在命令完成后恢复行为树?
让我觉得我没有以正确的方式做的事情是,当我试图想象如果我给出一个新订单我怎么能停止当前订单,例如,我多次下达去一个地方的订单,唯一应该考虑的是最后一个,所以必须忽略前面的顺序
public class HarvestingUnit : BaseUnit
{
[SerializeField] private HarvestingBuilding _associatedBuilding = default;
private int _inventorySlots = 1;
private int _collectedResources = 0;
private float _harvestingTime = 3.0f;
protected override Node SetupTree()
{
Node root = new Selector(new List<Node>
{
// First sequence will execute only when _hasOrder is true
new Sequence(new List<Node>
{
new Condition(() => _hasOrder == true),
new GiveTarget(() => _targetPosition),
new TaskGoTo(transform, _agent),
new ActionNode(() => _hasOrder = false),
}),
// Second sequence
new Sequence(new List<Node>
{
new CheckForAvailableResource(_associatedBuilding),
// A selector with two child nodes to handle harvesting and transporting resources
new Selector(new List<Node>
{
// Transport collected resources to warehouse if inventory is full
new Sequence(new List<Node>
{
new Condition(() => _collectedResources == _inventorySlots),
new GiveTarget(() => _associatedBuilding.GetNearestWarehoursePosition()),
new TaskTransportResource(transform, _agent, _associatedBuilding.GetNearestWarehoursePosition()),
new ActionNode(() => _collectedResources = 0)
}),
// Harvest resources while collected resources are less than inventory slots
new Sequence(new List<Node>
{
new Repeater(new List<Node>
{
new Condition(() => _collectedResources < _inventorySlots),
new TaskGoTo(transform, _agent),
new TaskHarvest(transform),
new Wait(_harvestingTime),
new ActionNode(() => _collectedResources++),
})
}),
})
})
});
// Reset the tree when the behaviour is restarted
root.Reset();
return root;
}
}
public void Move(Vector3 targetPosition)
{
_hasOrder = true;
Debug.Log(_hasOrder);
_targetPosition = targetPosition;
}
}
我已经尝试添加多个 Condition 节点来检查
_hasOrder
值,但没有按预期工作..
我希望我提供了足够的信息来理解我的问题..