コード例 #1
0
    public override void Update()
    {
        base.Update();

        if (refineryHomebase == null)
        {
            refineryHomebase = FindOreRefinery();
            if (refineryHomebase == null)
            {
                return;
            }
        }


        switch (mineState)
        {
        case MineState.IDLE:
            //check if both minerals and a ore factory exists, iff -> SEARCH
            float shortestDistance = Vector3.Distance(transform.position, resources[0].transform.position);
            closestResource = resources[0];
            for (int i = 1; i < resources.Length; i++)
            {
                float distance = Vector3.Distance(transform.position, resources[i].transform.position);
                if (distance < shortestDistance)
                {
                    shortestDistance = distance;
                    closestResource  = resources[i];
                }
            }

            ai.destination = closestResource.transform.position;
            ai.SearchPath();

            mineState = MineState.SEARCH;

            break;

        case MineState.SEARCH:
            if ((ai.reachedEndOfPath && !ai.pathPending) || ai.remainingDistance < 6)
            {
                mineState = MineState.MINE;
                mineTime  = Time.time;
            }

            break;

        case MineState.MINE:

            if (mineTime + mineInterval < Time.time)
            {
                addOreToInventory(closestResource.getResourceValue());
                mineTime = Time.time;
            }
            if (inventorySize <= currentInventory)
            {
                if (refineryHomebase)
                {
                    ai.destination = refineryHomebase.GetEntrancePosition();
                    ai.SearchPath();
                    mineState = MineState.RETURN;
                }
            }
            break;

        case MineState.RETURN:

            if ((ai.reachedEndOfPath && !ai.pathPending) && refineryHomebase)
            {
                enterUnloadState();


                Vector3 _direction = (refineryHomebase.transform.position - transform.position).normalized;

                Quaternion _lookRotation = Quaternion.LookRotation(_direction);

                transform.rotation = Quaternion.Slerp(transform.rotation, _lookRotation, 0.35f);



                transform.position = Vector3.MoveTowards(transform.position, refineryHomebase.GetUnloadPosition(), 0.2f);
                if (Vector3.Distance(transform.position, refineryHomebase.GetUnloadPosition()) < 1f)
                {
                    mineState = MineState.UNLOAD;
                }
            }
            break;

        case MineState.UNLOAD:
            refineryHomebase.AddResources(inventoryValue);
            Reset();
            mineState = MineState.EXIT;
            break;

        case MineState.EXIT:

            if (refineryHomebase)
            {
                transform.position = Vector3.MoveTowards(transform.position, refineryHomebase.GetEntrancePosition(), 0.3f);
                if (Vector3.Distance(transform.position, refineryHomebase.GetEntrancePosition()) < 2f)
                {
                    GetComponent <Collider>().enabled = true;
                    //ai.gravity = savedGravity;
                    ai.enabled = true;
                    mineState  = MineState.IDLE;
                }
            }
            break;
        }
    }