Exemplo n.º 1
0
        public override IEnumerator Execute()
        {
            bool success = false;
            LookForFoodAround();
            foreach (var foodItem in _visibleFood)
            {
                if (_agent.Character.BackPack.IsFull)
                {
                    break;
                }

                //двигаемся к следующему объекту
                var moveTo = new MoveToAction(_agent, foodItem.transform.position);
                yield return _agent.StartCoroutine(moveTo.Execute());

                //TODO: нужно еще раз проверить дистанцию до цели
                //подбераем объект, к которому подошли
                var pickUpAction = new PickupItemAction(_agent, foodItem);
                pickUpAction.Finished = (finished) =>success = finished;
                yield return _agent.StartCoroutine(pickUpAction.Execute());

                yield return new WaitForSeconds(0.5f);

                if (_visibleFood.Count < 2)
                    LookForFoodAround();

                if (!success) break;
            }
            yield return new WaitForSeconds(0.5f);

            Finished(true);
        }
Exemplo n.º 2
0
        public override IEnumerator Execute()
        {
            if (_tree == null)
            {
                //look for trees
                var trees = _agent.GetItems<Tree>(tree => tree.Alive);

                //if nearby there are not trees, go to place from momory
                if (trees.Count == 0)
                {
                    var memoryTrees = _agent.GetItemsFromMemory(typeof (Tree));
                    memoryTrees.SortActorsByDisntace(_agent.Character.Position);

                    var treeInfo = memoryTrees.FirstOrDefault();
                    if (treeInfo == null)
                    {
                        Debug.Log("Nearby there are no trees");
                        Cancel();
                        yield break;
                    }

                    var moveTo = new MoveToAction(_agent, treeInfo.Position);
                    yield return _agent.StartCoroutine(moveTo.Execute());
                    yield return new WaitForSeconds(1f);

                    trees = _agent.GetItems<Tree>(tree => tree.Alive);
                }

                //go to closest  visible tree
                trees.SortActorsByDisntace(_agent.Character.Position);
                _tree = trees.FirstOrDefault();
            }

            if (_tree == null)
            {
                Debug.LogError("targetTree == null, BUG");
                Cancel();
                yield break;
            }

            var goTo = new MoveToAction(_agent, _tree.Position);
            yield return _agent.StartCoroutine(goTo.Execute());
            yield return new WaitForSeconds(1f);

            _agent.Memory.Forget(_tree);
            //chop the tree
            var chopTree = new ChopTreeAction(_agent, _tree);
            yield return _agent.StartCoroutine(chopTree.Execute());
            yield return new WaitForSeconds(0.5f);

            //cut the log
            var cutLog = new CutLogAction(_agent);
            yield return _agent.StartCoroutine(cutLog.Execute());
            yield return new WaitForSeconds(1f);

            //collect woodbeams

            var woodBeams =
                _agent.GetItems<WoodBeam>(wb => (wb.Position - _agent.Character.Position).sqrMagnitude < 12);
            if (woodBeams.Count == 0)
            {
                yield return new WaitForSeconds(0.1f);
                woodBeams =_agent.GetItems<WoodBeam>(wb => (wb.Position - _agent.Character.Position).sqrMagnitude < 12);
            }
            if (woodBeams == null || woodBeams.Count == 0)
            {
                Debug.LogError("Nearby there are no woodbeams");
                Cancel();
                yield break;
            }

            foreach (var woodBeam in woodBeams)
            {
                var collectWoodBeam = new PickupItemAction(_agent, woodBeam);
                yield return _agent.StartCoroutine(collectWoodBeam.Execute());
                yield return new WaitForSeconds(0.5f);
            }

            Finished(true);
        }