Пример #1
0
 //når senke-animasjonen er ferdig
 public void UnloadComplete()
 {
     //Laster ikke av lengre
     unloading = false;
     //Skrur på collideren til lasten
     target.navMeshObstacle.enabled = true;
     //Sier at andre an løfte den igjen
     target.liftable = true;
     //Har ikke noe last/target lenger
     target = null;
     //Vi kan ture rundt igjen
     unit.cMoveable.canMove = true;
 }
Пример #2
0
    //Hver frame
    void Update()
    {
        //Om vi har satt en spesiell cursor
        if (cursorControll)
        {
            //Forandrer den tilbake
            GameManager.controlls.SetCursor(Cursors.Select);
            //Husker at vi gjorde det
            cursorControll = false;
        }
        //Om uniten er valgt og ikke allerede har en last
        if (selected && !carrynig)
        {
            //Om vi holder musen over et objekt og holder nede control
            if (GameManager.controlls.holdOverObject != null && Input.GetKey(KeyCode.LeftControl))
            {
                //Ser om det kan løftes
                CHookliftable hookliftable = GameManager.controlls.holdOverObject.GetComponent <CHookliftable>();
                if (hookliftable != null)
                {
                    //Ser om det ikke allerede er på en lastebil eller av en annen grunn ikke kan løftes
                    if (!hookliftable.onTruck && hookliftable.liftable)
                    {
                        //Om alt er good skifter vi cursor til load ikonet
                        GameManager.controlls.SetCursor(Cursors.Load);
                        cursorControll = true;

                        //Om man så trykker på venstre museknapp
                        if (Input.GetMouseButtonDown(1))
                        {
                            //Ser om ikke vi allerede driver å løfter noe
                            if (loading)
                            {
                            }
                            //Om vi ikke holder på å løfte noe
                            else
                            {
                                //Setter targetet til det objektet vi holdt musen over
                                target = hookliftable;
                                //Ser hvilken vei det står
                                Vector3 targetDir = target.hookPoint.position - target.transform.position;
                                //Driter fint i høyde
                                targetDir.y = 0;
                                //Lagrer en Quaternion for den veien lastebilen må stå
                                parkDir = Quaternion.LookRotation(targetDir, Vector3.up);
                                //Ser hvor langtbak fra senteret posisjonen til kroken er når den skal løfte shit
                                float hookPointDist = hookPoint.localPosition.z;
                                //Der vi skal stå blir posisjonen til targetets krokfeste minus litt lengre bak langs retningen til det vi skal løfte
                                parkPos = target.hookPoint.position - targetDir.normalized * hookPointDist;
                                //Høyden vi må stå i er lik høydeforskjelden til krokfeset og kroken (forhåpentlig vi vil dette tilsvare at vi står på bakken)
                                parkPos.y = target.hookPoint.position.y - hookPoint.position.y;
                                //Sier til move-komponenten at vi gjerne vil kjøre til målet
                                unit.cMoveable.SetTarget(parkPos);
                            }
                        }
                    }
                    else //Om objektet ikke kan løftes akkurat nå
                    {
                        //Bytter vi cursor til load blocked
                        GameManager.controlls.SetCursor(Cursors.LoadBlocked);
                        cursorControll = true;
                    }
                }
            }
        }
        //Om vi har settoss ut noe vi skal kroke
        if (target != null)
        {
            //Om det allerede er på lasteplanet
            if (target.onTruck)
            {
                //Om vi holder ikke kontroll
                if (Input.GetKey(KeyCode.LeftControl))
                {
                    //Setter musen til unload-ikonet
                    GameManager.controlls.SetCursor(Cursors.Unload);
                    cursorControll = true;
                    //Om vi så tryker på venstre museknapp
                    if (Input.GetMouseButtonDown(1))
                    {
                        //Setter posisjonen til pilen lik musens posisjon i verden+ litt opp
                        GameManager.controlls.directionArrow.position = GameManager.controlls.mouseWorldPosition + Vector3.up / 10;
                        //Setter den like lang som collideren til lasten
                        GameManager.controlls.directionArrow.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, target.GetComponent <Collider>().bounds.size.z * 100);
                        //Gjør pilen synelig
                        GameManager.controlls.directionArrow.gameObject.SetActive(true);
                    }
                    //Så lenge vi holder den inne
                    else if (Input.GetMouseButton(1))
                    {
                        //Henter posisjonen til musen da museknappen ble trykket inn
                        Vector3 pos1 = GameManager.controlls.directionArrow.position;
                        //Posisjonen nå
                        Vector3 pos2 = GameManager.controlls.mouseWorldPosition;
                        //Lager en vektor fra den første posisjonen til den andre
                        Vector3 dir = pos2 - pos1;
                        //Driter i høyde
                        dir.y = 0;

                        //Vinkelen i fohold til rett frem på z-aksen (blå pil i editoren)
                        float angle = Vector3.Angle(Vector3.back, dir);
                        if (dir.x > 0)
                        {
                            angle *= -1;
                        }

                        //Setter rotasjonen til objektet
                        GameManager.controlls.directionArrow.rotation = Quaternion.Euler(90, angle, 0);
                    }
                    //Når den slippes
                    else if (Input.GetMouseButtonUp(1))
                    {
                        //Skjuler pilen
                        GameManager.controlls.directionArrow.gameObject.SetActive(false);

                        //Henter rorasjonen til pilen
                        parkDir = GameManager.controlls.directionArrow.rotation;
                        //Trenger bare rotasjonen rundt y-aksen
                        Vector3 targetDir = new Vector3(0, parkDir.eulerAngles.y, 0);
                        parkDir = Quaternion.Euler(targetDir);

                        // Parkpos = (posisjonen til pilen) + retning * ((9.2 - 4.2 = 4.5) - (distansen fra senteret av kontaineren til krokfestet))
                        // 9.2 = (distansen fra krokløfteren til kontaineren når den er satt ned)
                        // 4.2 = (distensen den kjører frem når den setter ned kontaineren)
                        parkPos = GameManager.controlls.directionArrow.position + (parkDir * Vector3.forward).normalized * (4.5f - target.GetComponent <Collider>().bounds.extents.z);
                        //Trekker fra distansen pilen står over bakken
                        parkPos.y -= 0.1f;
                        //Husker at vi er på vei
                        travelToUnload = true;
                        //Turer dit
                        unit.cMoveable.SetTarget(parkPos);

                        Debug.Log("Parkpos: " + parkPos.ToString());
                        Debug.Log("Parkdir: " + parkDir.eulerAngles.ToString());
                    }
                }
                //Om vi har planer om å laste av noe
                if (travelToUnload)
                {
                    //Ser om vi er der driten skal
                    if (Vector3.Distance(transform.position, parkPos) < 0.2)
                    {
                        //Roterer til den veien vi skal stå
                        transform.rotation = Quaternion.RotateTowards(transform.rotation, parkDir, 45f * Time.deltaTime);
                        //Om det er innafor
                        if (Quaternion.Angle(transform.rotation, parkDir) < 1)
                        {
                            //Vi er fremme
                            travelToUnload = false;
                            //Gjør at lasten ikke lengre er et child av krokløfteren
                            target.transform.parent = transform.parent;
                            //Vi bærer ikke noe lengre
                            carrynig = false;
                            //Driver å laster av
                            unloading = true;
                            //Skal ikke flytte oss men vi laster av
                            unit.cMoveable.ClearTarget();
                            unit.cMoveable.canMove = false;
                            //Sier til lasten at den ikke lenger sitter på en bil
                            target.onTruck = false;
                            //Starter animajonen
                            anim.SetTrigger("Unhook");
                        }
                    }
                }
            }
            //Hvis vi holder på å løfte det
            else if (loading || unloading)
            {
                //Setter posisjonen til det vi løfter i henhold til animasjonen
                target.transform.position = cargoTransform.position;
                //Henter vinkelene rotasjonen skal ha fra animasjonen
                Vector3 euler = cargoTransform.rotation.eulerAngles;
                //Justerer for rotasjonen rundt yaksen objektet kan ha hatt da vi begynte å løfte det
                euler.y += targetYDiff;
                //Passerpå at det roterer riktig vei når det løftes
                // (Fungerer bare ved ish 0 og 180 grader
                if ((targetYDiff < 185 && targetYDiff > 175) || (targetYDiff > -185 && targetYDiff < -175))
                {
                    //Om driten står ~180 grader feil vei, så snur vi på x-rotasjonen
                    euler.x *= -1;
                }
                //Setter rotasjonen til objektet
                target.transform.rotation = Quaternion.Euler(euler);
            }
            //Hvis vi er i posisjon til å kroke
            else if (Vector3.Distance(transform.position, parkPos) < 0.2)
            {
                //Roterer til den veien vi skal stå
                transform.rotation = Quaternion.RotateTowards(transform.rotation, parkDir, 45f * Time.deltaTime);
                //Om det er innafor
                if (Quaternion.Angle(transform.rotation, parkDir) < 1)
                {
                    //Husker at vi driver å kroker
                    loading = true;
                    //Slår av kollideren så stuff ikke f****r seg
                    target.navMeshObstacle.enabled = false;
                    //Husker hvilken vei objektet er rotert så vi kan justere det ift animasjonen
                    targetYDiff = parkDir.eulerAngles.y - target.transform.rotation.eulerAngles.y;
                    //Starter løfte-animasjonen
                    anim.SetTrigger("Hook");
                    //Står her vi
                    unit.cMoveable.ClearTarget();
                    unit.cMoveable.canMove = false;
                    //Sier at ingen andre kan løfte den nå;
                    target.liftable = false;
                }
            }
        }
    }
Пример #3
0
 void Start()
 {
     anim         = GetComponent <Animator>();
     hookliftable = GetComponent <CHookliftable>();
 }