Autor Wątek: Unity kolizje gracza z otoczeniem  (Przeczytany 1647 razy)

Offline lao

  • Użytkownik

# Styczeń 15, 2017, 18:33:37
Hej, mam taki mały problem, robię symulator pływania pod wodą, mam postać i kilka meshy do kolizji, chcę zrobić tak żeby postać zatrzymała sie jak dotknie sciany. Wydaje mi sie że moje rozwiązanie tego problemu jest mało eleganckie, zrobiłem coś takiego:   
void OnTriggerEnter(Collider other)
    {
// zatrzymanie postaci
            speed = 0f;
//cofnięcie postaci zeby znalazła sie poza koliderem, bo jak zostanie to speed==0 i nigdy nie wyjdzie
            this.transform.Translate(0, 0, -0.05f);
    }

void OnTriggerExit(Collider other)
    {
//ustawienie prędkosci z powrotem po opuszczeniu kolidera
            speed = 0.5f;
    }

Macie pomysł jak to zrobić inaczej?
« Ostatnia zmiana: Styczeń 15, 2017, 18:35:22 wysłana przez lao »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline laggyluk

  • Użytkownik
    • http://laggyluk.com

# Styczeń 15, 2017, 20:52:11
jeżeli działa to jest ok :P

możesz też zapisywać pozycję w każdej klatce i w razie kolizji cofnąć się tam

Offline koirat

  • Użytkownik

# Styczeń 16, 2017, 00:04:50
Najlepiej to zastosuj fizykę do tego.

Co do:
this.transform.Translate(0, 0, -0.05f);
Nie jest to dobre rozwiązanie, nie wiesz jak głęboko w trigger weszła postać. Może się okazać że głębiej niż 0.05f
Jak już musisz tak robić to lepiej było by to zrealizować w OnTriggerStay w ten czas najwyżej ciało opuści trigger w kilku klatkach.


Offline lao

  • Użytkownik

# Styczeń 16, 2017, 18:39:08
No własnie fizyki niezbyt mam jak zastosowac bo graczem trzeba sterować a przy uzyciu OnCollision moga byc uzywane tylko siły fizyczne. Przy uzyciu tego co napisałem jest jeszcze taki problem, ze jak gracz wejdzie gdzieś gdzie jest kąt ostry to moze go cofnąć tak że wpadnie w inny trigger. Nie chcialem tego dawać w OnTriggerStay z tego względu, ze jak gracz sie szybko obróci to go może cofnąć do środka, a jak w jednej klatce go cofa to nie bedzie mial takiej mozliwosci.

Offline koirat

  • Użytkownik

# Styczeń 16, 2017, 22:19:08
To używaj sił fizycznych.
Powiedz z czym masz problem z siłami fizycznymi spróbuje pomóc, są wzory dzieki którym można za pomocą sił fizycznych osiągnąć podobne rezultaty jak sterowanie kinematyczne.

Czy to jest gra 2D czy 3d ? (zakładam że 2d)

Wogóle to twoje rozwiązanie jest dość dziwne. Masz ściane tylko z jednej strony czy dla każdej ściany będziesz pisał osobny kierunek odpychania ?

Offline matheavyk

  • Użytkownik
    • rabagames.com

# Styczeń 17, 2017, 06:23:30
Koirat, co do ścian z jednej strony, to po prostu Translate() działa względem kierunku, w którym zwrócona jest postać.

Z dokumentacji:
Cytuj
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
(...)If relativeTo is left out or set to Space.Self the movement is applied relative to the transform's local axes.

Offline lao

  • Użytkownik

# Styczeń 17, 2017, 16:22:02
gra jest 3d, widok jest "z oczu" i postać porusza się w kierunku w którym aktualnie patrzy ze stałą prędkoscią, metoda prób i błędów doszedlem ze cofnięcie o 0,5f jest optymalne. No narazie tak zostawie, to jest mój pierwszy projekt w Unity, myślałem ze moze jest jakaś funkcja która blokuje postać przed wejściem w Collider tylko nie moge sie do niej dokopać.

Offline Rakieta

  • Użytkownik

# Styczeń 17, 2017, 22:32:54
Nie znam się na tym, ale zawsze sądziłem, że triggerów używamy właśnie po to by obiekty mogły przez siebie przenikać. Przykładem mógłby być mechanizm "ukryty w podłodze", który uruchomi zbliżające się ściany. To znaczy gracz wchodzi w niewidzialny sześcian z Colliderem, ale żeby mógł przez niego przejść jak przez powietrze dajemy mu Trigger.

Piszę o tym tylko dlatego, że zaznaczyłeś, że to Twój pierwszy projekt w Unity. Samego problemu natomiast nie rozumiem i nie zrozumiałem waszej dyskusji.

Offline lao

  • Użytkownik

# Styczeń 18, 2017, 17:08:47
Cytuj
Nie znam się na tym, ale zawsze sądziłem, że triggerów używamy właśnie po to by obiekty mogły przez siebie przenikać
Też tak sądziłem, a uścislająclając że dwa kolidery powoduja domyślnie "zderzenie", ale w Unity jest tak jedynie pod warunkiem ze uzywasz sił fizycznych. Jesli sterujesz graczem jak ja, przez prosta funkcję void IdzTamGdziePatrzysz() to musisz uzyć triggera. Wczesniej robiłem w UDK/UE4 i tam wszystko działało jak trzeba.
« Ostatnia zmiana: Styczeń 18, 2017, 17:12:38 wysłana przez lao »

Offline laggyluk

  • Użytkownik
    • http://laggyluk.com

# Styczeń 18, 2017, 17:42:34
Character controller w ue4 nie jest oparty na fizyce, to wielki kawałek kodu który dba o to żebyś nie mógł wejść w tą ścianę. W standard assets unity też jest coś podobnego.

Offline stefanozord

  • Użytkownik

# Luty 12, 2017, 13:09:00
jesli chcesz wprowadzic jakies niestandardowe zachowania kolizji to chyba lepiej zrobic isKinematik i samemu reagowac na kolizje.