コード例 #1
0
    void Update()
    {
        if (isBusy() && agent.velocity.magnitude == 0)
        {
            if (++staticTime > 200)
            {
                agent.SetDestination(agent.destination);
                staticTime = 0;
            }
        }


        if (state == BOTSTATE.toCrate)
        {
            if (agent.remainingDistance < 0.2f && !agent.pathPending)
            {
                //GRAB BOX
                //Debug.Log("Accessing crate for order" + order.id);
                //Debug.Log(transform.name + " Accessing " + order.crate.GetInstanceID() + " of " + order.crate.r + " for order" + order.id);
                order.crate.transform.SetParent(transform);
                order.crate.transform.localPosition = new Vector3(0, 1f, -0.2f);
                order.crate.transform.localRotation = Quaternion.identity;
                state = BOTSTATE.toModule;
                agent.SetDestination(order.deliveryModule.transform.position);
            }
        }
        else if (state == BOTSTATE.toModule)
        {
            if (agent.remainingDistance < 0.2f && !agent.pathPending)
            {
                //DROP BOX
                state = BOTSTATE.idle;
                order.deliveryModule.notifyDelivery(order.crate);
                //GO TO BASE
                agent.SetDestination(Vector3.zero);

                //Destro BOX Model
                //Debug.Log(transform.name + " Destroying " + order.crate.GetInstanceID() + " of " + order.crate.r + " for order" + order.id);
                Destroy(order.crate.gameObject);
            }
        }
        else if (state == BOTSTATE.toPickUp)
        {
            if (agent.remainingDistance < 0.2f && !agent.pathPending)
            {
                order.pickUpModule.notifyPickUp(order.r);
                //GET BOX
                GameObject crate = Instantiate(rManager.cratePrefab, transform);
                crate.transform.localPosition = new Vector3(0, 1f, -0.2f);
                CrateBehavior c = crate.transform.GetComponent <CrateBehavior>();
                order.crate = c;
                c.setType(order.r);
                //Debug.Log(transform.name + " Spawning " + order.crate.GetInstanceID() + " of " + order.crate.r + " for order" + order.id);

                state = BOTSTATE.toModule;
                agent.SetDestination(order.deliveryModule.transform.position);
            }
        }
    }
コード例 #2
0
    public void postPushCrate(CrateBehavior c)
    {
        Order o = new Order(null, c.r);

        o.crate = c;
        orders.Add(o);

        ++amounts[o.r];
    }
コード例 #3
0
    private CrateBehavior spawnCrate(Vector3 offset)
    {
        GameObject    g = Instantiate(cratePrefab, holderAndRef.position + offset, Quaternion.identity, holderAndRef);
        CrateBehavior c = g.GetComponent <CrateBehavior>();

        c.setType(generatedResource);

        return(c);
    }
コード例 #4
0
    public override void notifyDelivery(CrateBehavior crate)
    {
        --incomingDeliveries;

        if (amounts.ContainsKey(crate.r))
        {
            ++amounts[crate.r];
        }
        else
        {
            amounts[crate.r] = 1;
        }
    }
コード例 #5
0
    private void tryAnOrder()
    {
        if (orders.Count > 0)
        {
            int   rand = (int)Random.Range(0, orders.Count);
            Order o    = orders[rand];

            if (o.deliveryModule == null)
            {
                bool foundAnOrder = false;
                //IT IS A PUSH, we must find an order for that resource, or a container.
                for (int i = 0; i < orders.Count && !foundAnOrder; ++i)
                {
                    if (orders[i].r == o.r && orders[i].deliveryModule != null && orders[i].crate == null) // if order is about the same resource AND not a push of crate
                    {
                        //Debug.Log("Merging orders " + o.id + " and " + orders[i].id);
                        o.deliveryModule = orders[i].deliveryModule;            //Merging the orders and deleting one.
                        orders.Remove(orders[i]);
                        foundAnOrder = true;
                    }
                }


                if (!foundAnOrder)
                {
                    //We must find a container
                    ContainerController cc = getRandomAvailableContainer();
                    if (cc != null)
                    {
                        //Debug.Log("order" + o.id + " incontainer");
                        o.deliveryModule = cc;
                        cc.notifyIncomingDelivry();
                    }
                    else
                    {
                        return; //Can't find any order or containers, can't do anything.
                    }
                }
            }

            if (amounts[o.r] > 0)
            {
                List <RobotController> readyBots = getAvailableBots();

                if (readyBots.Count > 0)
                {
                    if (o.pickUpModule != null || o.crate != null)
                    {
                        //ITS A PUSH
                        getRandomAvailableBot().setOrder(o);
                        orders.Remove(o);
                    }
                    else
                    {
                        //GET A CRATE
                        CrateBehavior c = getCrateOf(o.r);
                        if (c != null)
                        {
                            //Debug.Log("Assigning crate " + c.GetInstanceID() + " to order" + o.id + " ");
                            o.crate = c;
                            crates.Remove(c);
                            --amounts[c.r];
                            //ASSIGN ORDER
                            getRandomAvailableBot().setOrder(o);
                            orders.Remove(o);
                        }
                        else
                        {
                            ContainerController cc = getContainerWith(o.r);
                            if (cc != null)
                            {
                                o.pickUpModule = cc;
                                cc.bookCrate(o.r);
                                --amounts[o.r];
                                //ASSIGN ORDER
                                getRandomAvailableBot().setOrder(o);
                                orders.Remove(o);
                            }
                        }
                    }
                }
                else if (debug)
                {
                    Debug.Log("Not enough bots for " + o.r + " order.");
                }
            }
            else if (debug)
            {
                Debug.Log("Not enough resrouces for " + o.r + " order.");
            }
        }
        else if (debug)
        {
            Debug.Log("No order.");
        }
    }
コード例 #6
0
 public abstract void notifyDelivery(CrateBehavior crate);
コード例 #7
0
 public override void notifyDelivery(CrateBehavior crate)
 {
     loadedInputR++;
 }