Unity - 我应该如何使用行为树向我的 Harvester AI 发出命令?

问题描述 投票:0回答:0

我正在使用 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
值,但没有按预期工作..

我希望我提供了足够的信息来理解我的问题..

c# unity3d artificial-intelligence
© www.soinside.com 2019 - 2024. All rights reserved.