Unity - postać chodząca po nierównościach

0

Dwa pytania:

  1. Mam postać, która chodzi po chodniku i w momencie gdy z niego schodzi na trawę (która jest odrobinę niżej niż chodnik) cały czas idzie w linii prostej zamiast na nią spaść. Jak można to naprawić?

  2. Jak zrobić aby po zetknięciu z trawą postać zawracała? Chodzi mi o sam fakt wykrycia, że postać chce wejść na trawę. Trawa to jeden duży prefab, na który są nałożone prefaby ulicy i budynków.

1
  1. Dodaj na swoją scenę odpowiednie collidery (mogą być podpięte pod odpowiadające im obiekty 3D) i ustaw odpowiednie warstwy kolizji (żeby collider postaci się z nimi widział).
    Swoją postać wyposaż w edytorze w CharacterController. Ruch postaci wykonuj odpowiednią metodą https://docs.unity3d.com/ScriptReference/CharacterController.Move.html
    Może zadowoli Cię też uproszczona metoda https://docs.unity3d.com/ScriptReference/CharacterController.SimpleMove.html

  2. Możesz zaprogramować trigger do coliiderów trawy, który uaktywni odpowiednią akcję (np. obrót o 180 stopni + krok w przód).

0
Spine napisał(a):
  1. Dodaj na swoją scenę odpowiednie collidery (mogą być podpięte pod odpowiadające im obiekty 3D) i ustaw odpowiednie warstwy kolizji (żeby collider postaci się z nimi widział).
    Swoją postać wyposaż w edytorze w CharacterController. Ruch postaci wykonuj odpowiednią metodą https://docs.unity3d.com/ScriptReference/CharacterController.Move.html
    Może zadowoli Cię też uproszczona metoda https://docs.unity3d.com/ScriptReference/CharacterController.SimpleMove.html

  2. Możesz zaprogramować trigger do coliiderów trawy, który uaktywni odpowiednią akcję (np. obrót o 180 stopni + krok w przód).

Dzięki za odpowiedź, ale chyba nie do końca zrozumiałam, bo nadal mi nie wychodzi. Po dodaniu colliderów nic się nie zmienia, nadal postać unosi się zamiast iść po trawie. CharacterContoller mam, postacią poruszam za pomocą Move.

Co do drugiego punktu to postać obróciła mi się automatycznie po uruchomieniu mimo że nie doszła do trawy. Collider musiałam dodać wyższy (bo jak pisałam nadal mi nie działa to opadanie na trawę więc inaczej by nie wykryło kolizji) więc to może dlatego, że od początku już przebywała w tym colliderze? I jeszcze jedno pytanie, czemu musi być OnTriggerEnter, a nie może być OnCollisionEnter?

1
.Monika napisał(a):

Dzięki za odpowiedź, ale chyba nie do końca zrozumiałam, bo nadal mi nie wychodzi. Po dodaniu colliderów nic się nie zmienia, nadal postać unosi się zamiast iść po trawie. CharacterContoller mam, postacią poruszam za pomocą Move.

Skoro używasz Move, to czy zaimplementowałaś grawitację, tak jak na stronie dokumentacji? https://docs.unity3d.com/ScriptReference/CharacterController.Move.html

moveDirection.y -= gravity * Time.deltaTime;

Od tego zależy opadanie na ziemię.

Co do drugiego punktu to postać obróciła mi się automatycznie po uruchomieniu mimo że nie doszła do trawy.

Prawdopodobnie Twój trigger zaregował na inny obiekt niż gracz. Musisz ustawić w ustawieniach fizyki, żeby layer trawy reagował tylko na layer gracza, albo w kodzie triggera na początku sprawdzać layer, obiektu, który wywołał trigger i wykonywać resztę kodu, tylko jeśli to layer gracza.

Collider musiałam dodać wyższy (bo jak pisałam nadal mi nie działa to opadanie na trawę więc inaczej by nie wykryło kolizji) więc to może dlatego, że od początku już przebywała w tym colliderze?

To w końcu chcesz, żeby można było wchodzić na trawę, czy nie?
Bo z jednej strony chcesz, żeby przy trawie postać zawracała, a z drugiej strony chcesz, żeby na trawę opadała.

I jeszcze jedno pytanie, czemu musi być OnTriggerEnter, a nie może być OnCollisionEnter?

Trigger jest wydajniejszy i nie wchodzi w interakcje z obiektami fizycznymi (np. nie odbije spadającej kulki, przeniknie ona przez niego).
Ale jeśli chcesz, żeby coś chodziło po trawie, to collider trawy nie może być triggerem.
Możesz zrobić 2 collidery. Jeden trigger, drugi do interakcji. W zależności od potrzeb...

1

Dziękuję, bardzo mi pomogłeś :) Jednak teraz pojawił się problem, że po opadnięciu na trawę nie jest wykrywany OnCollisionEnter. Collidery są, Trigger odznaczony...

Spine napisał(a):

To w końcu chcesz, żeby można było wchodzić na trawę, czy nie?
Bo z jednej strony chcesz, żeby przy trawie postać zawracała, a z drugiej strony chcesz, żeby na trawę opadała.

Docelowo nie ma być możliwości wchodzenia na trawę, ale bez względu na to chciałam naprawić ten błąd niespadania.

0
.Monika napisał(a):

po opadnięciu na trawę nie jest wykrywany OnCollisionEnter. Collidery są, Trigger odznaczony...

A czy trawa ma komponent Rigidbody? Maska kolizji ustawiona?

Nie jestem pewien jak z CharacterControllerem wygląda OnCollisionEnter. Nie miałem dużo do czynienia z CharacterControllerem (chwilę eksperymentowałem ;) ).

Znalazłem taką metodę do kolizji z innymi obiektami: https://docs.unity3d.com/ScriptReference/CharacterController.OnControllerColliderHit.html
To jest chyba strzał w dziesiątkę, bo chcemy wykryć podczas poruszania się, czy zaszła kolizja z trawą ;)

0

Maskę w sensie warstwy? To mam. Mam też Rigidbody. Mimo to żadna z metod nie działa :/

1
.Monika napisał(a):

Maskę w sensie warstwy? To mam.

Tak.

Mam też Rigidbody. Mimo to żadna z metod nie działa :/

A może postać nie opada na trawę? Zatrzymuje się tuż przed nią i nie dochodzi do kolizji.
Kontrolowany ruch postaci (nieoparty o Rigidbody) zazwyczaj implementuje się w ten sposób, że już przed wykonaniem ruchu postać "wie" gdzie się znajdzie. Wektor przemieszczenia jest modyfikowany tak aby nie doszło do faktycznej kolizji. W przypadku opadania postać będzie utrzymywać się jakiś ułamek wysokości nad ziemią.
Być może CharacterController działa właśnie w ten sposób...

W tym przypadku chyba najprościej typ podłoża wykrywać raycastem wystrzelonym w dół z zadanym dystansem niewiele przekraczającym "nogi" postaci. Sprawdzisz przy okazji w konsoli (Debug.Log("kolizja");), czy Raycast w coś trafia... https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

1
Spine napisał(a):

W tym przypadku chyba najprościej typ podłoża wykrywać raycastem wystrzelonym w dół z zadanym dystansem niewiele przekraczającym "nogi" postaci.

Działa :) Dziękuję Ci bardzo za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1