Beispiel #1
0
    private void UpdateStateMachine()
    {
        switch (state)
        {
        case (State.Idle):
            UpdateInventoryText();
            if (currentExtractor != null && currentExtractor.HasResources())
            {
                state = State.MovingToResource;
            }
            else
            {
                int size = extractorList.Count;
                if (extractorList != null && size > 0)
                {
                    currentExtractor = extractorList[Random.Range(0, extractorList.Count)];
                }
            }
            break;

        case (State.MovingToResource):
            UpdateInventoryText();
            if (unit.is_Idle && currentExtractor != null)
            {
                unit.MoveTo(currentExtractor.GetPosition(), () =>
                {
                    state = State.CollectingResource;
                });
            }
            if (currentExtractor == null)
            {
                state = State.Idle;
            }
            break;

        case (State.CollectingResource):
            UpdateInventoryText();
            if (unit.is_Idle)
            {
                if (resourceInventory >= inventorySpace)
                {
                    state = State.MovingToStorage;
                }
                else if (!currentExtractor.HasResources())
                {
                    state = State.Idle;
                }
                else
                {
                    currentExtractor.GrabResource();
                    resourceInventory++;
                    UpdateInventoryText();
                }
            }
            break;

        case (State.MovingToStorage):
            UpdateInventoryText();
            if (unit.is_Idle)
            {
                if (storageNodeList.Count > 0)
                {
                    if (storageNode != null)
                    {
                        unit.MoveTo(storageNode.GetPosition(), () =>
                        {
                            state = State.DroppingInStorage;
                        });
                    }
                    else
                    {
                        storageNode = storageNodeList[0];
                    }
                }
            }
            break;

        case (State.DroppingInStorage):
            UpdateInventoryText();
            if (unit.is_Idle)
            {
                storageNode.DropResource(resourceInventory);
                resourceInventory = 0;
                UpdateInventoryText();
                state = State.Idle;
            }
            break;
        }
    }