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

coroutine c# problem unity gra

Object Storage Arubacloud
0 głosów
125 wizyt
pytanie zadane 15 grudnia 2020 w C# przez kubaa322 Użytkownik (710 p.)

Witam, mam problem z metodą MoveTowards. Otóż mam ustawione obiekty typu transform które mam w tablicy. Element bottomObstacle (nowy pojawia się co sekunde za pomocą instantiate()) powinien z pomocą metody przenieść się z pierwszego obiektu tablicy do drugiego(ostatniego), jednak tak sie nie dzieje. Nowe obiekty są tworzone, lecz pozostają na swoim miejscu(miejscu pierwszego elementu tablicy). Prosze o pomoc.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pathing : MonoBehaviour
{
    [SerializeField] GameObject bottomObstacle;
    [SerializeField] Transform[] pointsArray;
    void Start()
    {
        StartCoroutine(SpawnBottomObstacle());
    }
    private IEnumerator SpawnBottomObstacle()
    {
        Transform firstPoint = pointsArray[0];
        Transform targetPoint = pointsArray[1];
        while (true)
        {
            Instantiate(bottomObstacle, firstPoint.transform.position, Quaternion.identity);
            transform.position = Vector2.MoveTowards(firstPoint.transform.position, targetPoint.transform.position, 3f);
            yield return new WaitForSeconds(1f);
            //Destroy(gameObject, 2f);
        }
    }
}

podejrzewam ze problem tkwi w metodzie movetowards lub jej umiejscowieniu, ale sam nie daje rady pozdrawuiam

komentarz 16 grudnia 2020 przez senpai desu Mądrala (5,720 p.)
edycja 16 grudnia 2020 przez senpai desu

Nowo utworzony obiekt nigdzie się nie przeniesie, ponieważ nie zmieniasz jego wartości transform on po prostu sobie istnieje na scenie. Po utworzeniu od razu przypisz mu pozycje

Instantiate(bottomObstacle, firstPoint.transform.position, Quaternion.identity).transform.position = Vector2.MoveTowards(firstPoint.transform.position, targetPoint.transform.position, 3f);

 

komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)
Ok, teraz pojawia się w miejscu oddalonym o 3f od pozycji firstPoint, jednak nie o taki efekt mi chodziło. Chodzi mi aby przejechał płynnie z pozycji firstPoint do pozycji targetPoint. Domyślam się, że musze mu updateować pozycję w Update(), ale nie wiem jak to zrobić.
komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)

tak to wygląda jeśli chodzi o scene

komentarz 16 grudnia 2020 przez senpai desu Mądrala (5,720 p.)
Może dodaj skrypt do bottomObstacle który będzie kierował jego ruchem po utworzeniu
komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)
Ale jeśli w skrypcie, który wysyłałem powyżej mam zmienna bottomObstacle która przechowuje GameObject to chyba nie ma potrzeby dodawania nowego skryptu do tego obiektu? Tak mi się wydaje logicznie myśląc, ale dopiero się uczę więc mogę się mylić.
komentarz 16 grudnia 2020 przez senpai desu Mądrala (5,720 p.)
Zawsze jest kilka sposobów rozwiązania problemu, dodanie skryptu do obiektu sprawi ze będzie mógł on sam sterować swoim ruchem od razu w swojej metodzie update.

Drugim sposobem może być update position w pętli, musisz znaleźć wszystkie utworzone obiekty np GameObject.FindGameObjectsWithTag("jakis_tag");

https://docs.unity3d.com/ScriptReference/GameObject.FindGameObjectsWithTag.html

trzeba dodać tag do tego obiektu bottomObstacle, potem w metodzie update w pętli wywoływać metodę MoveTowards() , lub Lerp().
komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)
ok, dodając skrypt do prefaba bottomObstacle, w jaki sposób mogę uzyskać dany efekt? Ja osobiście próbowałem w metodzie update() dodać transform.position = nowametoda();

gdzie nowa metoda() zwraca taki vector2:

Vector2.MoveTowards(firstPoint.transform.position, targetPoint.transform.position, 3f);

jednak mi to nie działa, podsuniesz jakiś inny sposób, albo wiesz co z tym jest nie tak?
komentarz 16 grudnia 2020 przez senpai desu Mądrala (5,720 p.)
konsola pokazuje jakieś błędy ? Czy te punkty firstPoint i targetPoint są obecne w tym skrypcie ? Możesz wyświetlić je w konsoli ? W jaki sposób przekazujesz je do skryptu ?
komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)
Tak jak wyżej, w skrypcie mam tablice pointsArray w której są dwa punkty: zmienna firstPoint przyjmuje punkt z indekesm [0], analogicznie targetPoint odwołuje się do tablicy do indeksu [1] więc tak, są. Konsola milczy.
komentarz 16 grudnia 2020 przez senpai desu Mądrala (5,720 p.)

jeśli robisz instantiate w punkcie firstPoint to transform.position utworzonego obiektu  będzie: transform.position = firstPoint.transform.position więc w nowym skrypcie użyj

Vector2.MoveTowards(transform.position, targetPoint.transform.position, 3f); 

bo inaczej metoda będzie zwracać zawsze tą samą wartość i nic się nie będzie przesuwało

komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)

Ok, zrobiłem w ten sposób, kod który jest dodany do bottomObstacle wygląda tak:

public class Obstacle : MonoBehaviour
{
    Pathing path; // - path odwoluje sie do skryptu pathing,
    //gdzie jest metoda Movement();
    void Update()
    {
        transform.position = path.Movement();
    }
}

Dla przejrzystości dodam też aktualny wygląd skryptu pathing:

public class Pathing : MonoBehaviour
{
    [SerializeField] GameObject bottomObstacle;
    [SerializeField] Transform[] pointsArray;
    void Start()
    {
        StartCoroutine(SpawnBottomObstacle());
    }
    private void Update()
    {
        
    }
    private IEnumerator SpawnBottomObstacle()
    {
            Transform firstPoint = pointsArray[0];
            Instantiate(bottomObstacle, firstPoint.transform.position, Quaternion.identity).transform.position = Movement();
            yield return new WaitForSeconds(1f);
            //Destroy(gameObject, 2f);
    }
    public Vector2 Movement()
    {
        Transform targetPoint = pointsArray[1];
        return Vector2.MoveTowards(transform.position, targetPoint.transform.position, 3f);
    }
}

Konsola teraz zaczęła wyrzucać błąd w 11 linijce skryptu obstacle.cs : object refernce not set to an instant of an object

komentarz 16 grudnia 2020 przez senpai desu Mądrala (5,720 p.)
O jaki obiekt chodzi? path.Movement(); ?  W inspektorze przeniosłeś ten obiekt pathing ze sceny do tego prefaba w pole Pathing path w skrypcie Obstacle? Inaczej nie będzie działać
komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)

niezbyt rozumiem, o co ci chodzi, wiec najlepiej zamieszcze wyglad moich prefabów

komentarz 16 grudnia 2020 przez senpai desu Mądrala (5,720 p.)
ok jeśli Pathing path; zamienisz na public Pathing path; to pojawia się pole ? jeśli tak wtedy przenieś obiekt do tego pola
komentarz 16 grudnia 2020 przez kubaa322 Użytkownik (710 p.)
zmieniłem na public, i przeniosłem obiekt bottom spawner(ten co ma dołączony skrypt pathing) i pojawia się kolejny błąd(poprzedni znika) : the variable pointsArray of Pathing has not been asigned - co jest dla mnie niezrozumiałe, bo przecież wszystko jest podłączone
komentarz 17 grudnia 2020 przez senpai desu Mądrala (5,720 p.)
Rozwiązałeś ? jeśli pojawia się błąd w konsoli to wklej jego treść, jeśli jest podany numer wiersza gdzie jest błąd to też wklej to co jest w tym wierszu, przenosiłeś obiekt do inspektora z okna projektu czy z hierarchy?
komentarz 17 grudnia 2020 przez kubaa322 Użytkownik (710 p.)
Poradziłem sobie w inny sposób, bo ta ścieżka mnie przerosła. Po prostu użyłem Vector3.left do przeniesienia obstacle. Wcześniej po prostu nie wiedziałem o takim rozwiązaniu, trochę się napociłem żeby znależć taką metodę jak vector3.left.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 209 wizyt
pytanie zadane 6 stycznia 2021 w C# przez kubaa322 Użytkownik (710 p.)
0 głosów
1 odpowiedź 159 wizyt
pytanie zadane 13 lipca 2019 w C# przez Bezy Bywalec (2,280 p.)
0 głosów
2 odpowiedzi 304 wizyt
pytanie zadane 25 kwietnia 2017 w C# przez niezalogowany

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 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!

...