Destrukcja ściany jeżeli nie dotyka podłoża

0

Witam,
chciałbym żeby ściana zawalała się a nie lewitowała.
Widzę to tak że skrypt sprawdza czy jakikolwiek collider dotykający danego fragmentu dotyka ziemi. Jeśli nie to włącza się jego rigidbody i spada z całą resztą. Wiem że jest to możliwe do zrobienia z pomocą tablic etc. ale nie wiem jak zrobić to poprawnie.

Oto mój skrypt (jest on dodany do każdego elementu ściany (98) )

using UnityEngine;

public class destructiblesCollisions : MonoBehaviour
{

    void Start()
    {
        GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
    }

    private void OnCollisionEnter(Collision other) {
        if (other.collider.tag == "enemyBullet" | other.collider.tag == "bullet"){
            GetComponent<Rigidbody>().constraints = RigidbodyConstraints.None;
        }

    }

}

screenshot-20211105134921.pngscreenshot-20211105134644.png

2

Ściana niech ma rigidbody + collider + skrypt.
Do skryptu podepnij wszystkie rigidbody odłamków.
W momencie kolizji, skrypt ściany niech się dezaktywuje (razem z colliderem i rigidbody) oraz w pętli aktywuje rigidbody odłamków.

1

Też o tym myślałem, ale wtedy nie jest możliwa sytuacja ze screena. Jeśli dobrze zrozumiałem, to chodzi o to, żeby spadały tylko te elementy, które nie są związane z żadnym elementem, które z kolei nie są związane z innymi elementami, które dotykają ziemi.
W takim przypadku dam tylko tipy, bo brak czasu na właściwy kod, to trochę roboty jest.

  • każdy element musi mieć info, jakie są jego sąsiednie elementy - czyli właśnie tablica. nie ma co przed tym uciekać
public destructiblesCollisions[] connected;

i jazda. dużo przeciągania w inspectorze. Dałoby się zrobić to wykrywając przez kolizje elementów pewnie, ale prościej będzie w ten sposób jednak.

  • jak strzelisz w element, on odpada, ustawia sobie jakiegoś boola, że jest odpadnięty, a następnie musisz wywołać coś na JEGO sąsiadach - nie na wszystkich elementach, tylko na sąsiadach.
    to coś powinno zebrać wszystkie sąsiadujące nieodpadnięte elementy, i sprawdzić, czy wśród nich jest którykolwiek dolny (kolejna tablica, zawierająca dolne elementy).
    Jeśli jest taki - ok, nic nie robimy.
    jeśli nie ma - na wszystkich w grupie - czyli tych zebranych, wywołujemy odpadnięcie - żeby nie wpaść w pętle nieskończoności, nie lecimy już po ich sąsiadach, wystarczy po zebranej grupie.

Załóżmy, że jest ścianka o kształcie "T", gdzie pionowa linia ma 7 klocków, pozioma 5.
Strzelasz w środek poziomej, łączenie.
Odpada lewe ramie (2 klocki)
Odpada środek (bo strzelony)
Odpada prawa strona (2 klocki)
Zostaje tyczka, bo zawiera dolny kafelek

mam nadzieję że w miarę prosto to opisałem

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