• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Podążanie za obiektem | Unity2D

Object Storage Arubacloud
0 głosów
855 wizyt
pytanie zadane 2 września 2018 w OpenGL, Unity przez Yashe Dyskutant (7,720 p.)
zmienione kategorie 2 września 2018 przez Yashe

Witam serdecznie,

Tworzę sobie aplikację na androida i nie mam pomysłu na rozwiązanie pewnego problemu. 
Screen, aby lepiej sobie zobrazować: 

Gracz porusza się w lewo lub prawo -> gdy ktoś kliknie w ekran postać wskakuje wyżej o "poziom" (o ile nie uderzy w ścianę) 

Teraz potrzebuje zrobić skrypt, który wyszuka mi mojego obiektu, który znajduje się na przejściu i przekaże w jakim kierunku ma poruszać się gracz. Oczywiście musi szukać tego obiektu automatycznie i odwoływać się tylko do tego, na którym poziomie jest:

Obiekty "door" mają przypisany tag o tej samej nazwie, a wszystkie typy platform w tym wypadku od "One" do "Ten" mają tag "platform". Wybaczcie za chaotyczne nazwy, lecz próbowałem wielu sposób i nie było czasu na zmiany.

 

    void Start()
    {
        Movement();
    }

    public void Movement()
    {
       platform = GameObject.FindGameObjectWithTag("platform").GetComponent<Transform>();
       door = GameObject.FindGameObjectWithTag("door").GetComponent<Transform>();

        if(transform.position.x < door.position.x)
        {
            rb.velocity = new Vector3(speed, 0, 0);
            //Debug.Log("W prawo");
            Debug.Log("W prawo " + platform.position.y + " || " + transform.position.y);

        }
        else if (transform.position.x > door.position.x)
        {
            rb.velocity = new Vector3(-speed, 0, 0);
            //Debug.Log("W lewo");
            Debug.Log("W prawo " + platform.position.y + " || " + transform.position.y);
        }
        else
        {
            Debug.Log("Error");
            Debug.Log(platform.position.y + " || " + transform.position.y);
        }
    }

Aktualnie kod odnosi się tylko do jednego obiektu (pierwszego) i według niego określa swój kierunek. 
Potrzebuje, aby gracz skupiał się na innym przejściu co każdy poziom.

Gdy jest coś niezrozumiałe, odpowiem w komenatrzach na pytania

Pozdrawiam

komentarz 2 września 2018 przez criss Mędrzec (172,590 p.)
Do Unity jest specjalna kategoria
komentarz 2 września 2018 przez Yashe Dyskutant (7,720 p.)

Poprawione, nie zauważyłem wcześniej, że istnieje taka kategoria frown

1
komentarz 2 września 2018 przez criss Mędrzec (172,590 p.)
Luz :D Dzięki

1 odpowiedź

0 głosów
odpowiedź 2 września 2018 przez 10kw10 Pasjonat (22,880 p.)
edycja 2 września 2018 przez 10kw10
Dobrze by bylo jak bys to wytłumacz na jakims przykładzie (jakies zdjecie etc) bo przynajmniej ja średnio zrozumialem o co chodzi. Postac gracza ma sama wyszukiwać drzwi? Mozesz dac jakis collider lekko podniesiony do góry niz img gracza i jesli nie zachodzi kolizja tzn ze mozesz poruszac sie do gory. Problem w tym ze nie raz drzwi bd po prawej a przejscie po lewej. Btw masz w komentarzach dwa razy prawo.

 

Edit. Jesli drzwi to to przejście pomiędzy platformami to zawsze mozesz policzyc wektor kierunkowy = (koniec - poczatek) / długość tego wektora i wziac tylko wspolrzedna x

 

Edit2. Dobra chyba zrozumiałem xd nie lepiej by bylo trzymać te drzwi w jakiejs tablicy transformow lub vectorow? Po kazdym przejsciu inkrementowalbys zmienna poziom i odczytytal odpowiednia wartosc z tablicy
komentarz 2 września 2018 przez Yashe Dyskutant (7,720 p.)

Zamysł jest taki, że kwadrat czyli nasz "player" porusza się w prawo lub lewo (Decyduje o tym skrypt, bez żadnej ingerencji fizycznej osoby. Za to skrypt na podstawie przejścia pomiędzy platformami, które nazwałem roboczo drzwiami, nadaje kierunek ruchu, czy to w prawo, czy w lewo). 

Sama osoba grająca, za zadanie ma kliknąć w ekran, gdy  postać znajduje się właśnie nad "drzwiami", wtedy trafi na kolejny "poziom", z czasem szybkość ruchu się zwiększa etc. ale nie to jest tutaj ważne.

Potrzebuje wiedzieć, jak sprawić, aby gracz po trafieniu na nowy "poziom" odnalazł sobie gdzie są drzwi (w którym kierunku) i podążał właśnie w tą stronę, i analogicznie z resztą.

Jestem nowy w Unity, i tak samo C# to dla mnie nowy język, na dobrą sprawę uczę się go może od 2 tygodni. Ta gierka to ma być trochę test pewnych mechanik i przyzwyczajenia się do składni etc. 

Co do Edit2, przyznam się, że nie za bardzo rozumiem co miałeś na myśli.
Dodam jeszcze, że poziomy będą generowane przez skrypt, a nie ustawiane ręcznie..

Jakieś pomysły ? frown Myślę, że brakuje mi to jakiejś wiedzy ogólnej, dlatego też ten post.. z pytaniem do was

 

komentarz 2 września 2018 przez 10kw10 Pasjonat (22,880 p.)

Chodzi mi o takie cos

if(transform.position.x < door[currentPlatform].position.x)
    {
        rb.velocity = new Vector3(speed, 0, 0);
        //Debug.Log("W prawo");
        Debug.Log("W prawo " + platform.position.y + " || " + transform.position.y);
 
    }
    else if (transform.position.x > door[currentPlatform].position.x)
    {
        rb.velocity = new Vector3(-speed, 0, 0);
        //Debug.Log("W lewo");
        Debug.Log("W prawo " + platform.position.y + " || " + transform.position.y);
    }

if(wchodze na nastepny poziom)
  currentPlatform++;

Sorry za formatowanie, pisze z telefonu

komentarz 2 września 2018 przez 10kw10 Pasjonat (22,880 p.)
Powinno byc tam jeszcze position.x ale :) poprawianie tego na telefonie to meczarnia xd
komentarz 2 września 2018 przez Yashe Dyskutant (7,720 p.)
Już rozumiem o co chodzi, lecz totalnie nie wiem jak się za to zabrać..

Zakładając ten sposób, skrypt musi i tak samemu zadeklarować pozycje w tablicy na której znajduje się przejście czyż nie ?
komentarz 2 września 2018 przez 10kw10 Pasjonat (22,880 p.)
No tak, musisz wiedziec gdzie sa drzwi. Mozesz użyć FindObject("door" + currentPlatform), dajesz nazwę obiektu, a nie tagu. W dużych projektach gdzie masz dużo obiektów raczej tak nie rob bo bywa to uciążliwe.

A najlepiej niech ten generator ma ta tablice i niech ci ja zwroci lub klasa Map whatever
komentarz 3 września 2018 przez Yashe Dyskutant (7,720 p.)

Korzystając z prefabów, stworzyłem ten generator poziomów ! 

I teraz dalej mam problemy z zaimplementowaniem twojego sposobu do skryptu. Generator sobie tworzy te poziomy, a w raz z nim EmptyObject, który jest punktem środka przejścia. 

Wpadłem na pomysł, aby skrypt wyszukiwał obiektu(naszego przejścia) i z bramką AND wyszukiwał również pozycji...
Skoro wszystkie odległości są równe sobie (o y += 1.2f ), to chyba dałoby się to wykonać co nie ? 

Pytania:

  1. Czy to w ogóle ma sens, czy nie jest bezsensownym pomysłem etc. ? 
  2. Czy FindObjectWithTag (nie wiem czy wyszukiwanie na nazwę ma sens, a nawet gdyby to wychodzi na to samo, ponieważ drzwi każdego poziomu mają te samą nazwę) mi wystarczy. Nie zaistnieje sytuacja, że on sobie weźmie pierwszy obiekt w hierarchii i resztę oleje. Wtedy nie zadziałałoby sprawdzenie obiektu i jego wysokości.
komentarz 3 września 2018 przez 10kw10 Pasjonat (22,880 p.)
to nie tworz pustego obiektu tylko zapisz sobie pozycje do tablicy.

Czy oleje? Musialbys sprawdzic, ale pewnie tak.
komentarz 3 września 2018 przez Yashe Dyskutant (7,720 p.)

uuu... no racja w sumie, tylko jak zapytam ? 
Generator działa tak, że ma prefaby.. i dostęp do nich. W skrypcie mam tablice objektów oraz tworzą się losowe liczby. No i dalej pewnie wiesz:
 

rand = Random.Range(0, poziomy.platforms.Length);
Instantiate(poziomy.platforms[rand], new Vector3(-12.2f, y_axis, 0), poziomy.platforms[rand].transform.rotation);
// sorry za robocze nazwy

 To nie za bardzo ogarniam jak by zapisywać pozycje coś w tablicy : /

1
komentarz 3 września 2018 przez 10kw10 Pasjonat (22,880 p.)
var positions = new List<Vector3>();
rand= Random.Range(0, poziomy.platforms.Length);
positions.add(new Vector3(-12.2f, y_axis, 0));
Instantiate(poziomy.platforms[rand], new Vector3(-12.2f, y_axis, 0), poziomy.platforms[rand].transform.rotation);

Pisane z pamieci, nie wiem jak masz to dokladnie zrobione ale tam gdzie masz pozycje y mozesz pomnozyc przez iterator, bo kazdy poziom jest o iles tam wyzej, no chyba ze jest roznie to nie wiem ;p

 

Edit. aaalbo jak juz tworzysz obiekt to zrob liste obiektow i dawaj Instantiate w add. Wtedy masz object.transform.position

komentarz 3 września 2018 przez Yashe Dyskutant (7,720 p.)

Nie wkleiłem całego kodu ! Tak, tak zgadza się, później mam y_axis += 1.2f  wink

I zaraz sprawdzę, co i jak z tym zapisywaniem w liście !

komentarz 3 września 2018 przez Yashe Dyskutant (7,720 p.)
Niestety poddaje się.. nie wychodzi mi nic co powinno, wrócę do tego za za kilka dni pewnie. Stworzenie tej listy z współrzędnymi obiektów nic nie dało, gdyż to pozycje (patrząc na screen) obiektów One / Two etc. A potrzeba wyszukać jego "dziecka" i wyczytać jego współrzędne

Dziękuje za pomoc !

Podobne pytania

0 głosów
1 odpowiedź 1,264 wizyt
pytanie zadane 27 kwietnia 2019 w C# przez Pytam_PL Użytkownik (520 p.)
0 głosów
3 odpowiedzi 1,937 wizyt
pytanie zadane 22 lutego 2017 w OpenGL, Unity przez Emil Panecki Bywalec (2,100 p.)
0 głosów
1 odpowiedź 955 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...