Wykrycie kolizji innych obiektow w unity

0

Mam problem wykrycia kolizji obiektow ze soba. Nie chodzi mi o kolizje gracza tylko obiektow. Gracz tworzy domek i jezeli domek koliduje z drzewem ma dawac golda co np 5 sekund.
To jest skrypt ktory jest w obiekcie domku. BoxCollidery po dodawane do objektow drzewo i dom.

GameObject Gracz;
    // Start is called before the first frame update
    void Start()
    {
        

    }

    // Update is called once per frame
    void Update()
    {
        
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        print("Wykryto kolizje 1");
        if (other.gameObject.name == "drzewo")
        {
            Gracz.gameObject.GetComponent<Stats>().Odbierz_Gold(10);
            print("Domek daje golda");
        }
    }
    void OnCollisionStay2D(Collision2D collision)
    {
        print("Wykryto kolizje 2");
        if (collision.gameObject.name == "drzewo")
        {
            Gracz.gameObject.GetComponent<Stats>().Odbierz_Gold(10);
            print("Domek daje golda");
        }
        Invoke("ReSpawnn", 5);
    }
    void ReSpawnn()
    {

            Gracz.gameObject.GetComponent<Stats>().Odbierz_Gold(100);
     
    }
0

Jeśli Collider jest triggerem (ma zaznaczone pole isTrigger), to nie działają na niego zdarzenia OnCollision***.

Ponadto obiekt z colliderem powinien mieć jeszcze dodany komponent Rigidbody.

Z tego co pamiętam dwa triggery nie kolidują ze sobą. Jeden collider musi być triggerem, a drugi nie.

Jakby jeszcze kolizje nie działały, to sprawdź warstwy przypisane obiektom i czy ustawienia fizyki pozwalają na kolizje odpowiednich warstw.

0

Triggery byly juz tak jak wspomniales ustawione. Wszystko znajduje sie na jednej warstwie. Dostaje printa("wykryto kolizje 2") jezeli gracz zderzy sie z domem. A mi chodzi jak postawiony dom bedzie sie zderzac z drzewem a nie z graczem.

0

Kiedy dom zderza się z drzewem?
Dom i drzewo nie stoją w miejscu? Przemieszczają się?

Twój skrypt może obsługiwać albo OnTriggerEnter2D, albo OnCollisionStay2D.
Nie może implementować zdarzeń Trigger i Collision jednocześnie.
Chyba, że Rigidbody domu ma w hierarchii obiektów DWA collidery. Jeden z ustawieniem isTrigger, a drugi nie - chociaż nie jestem na 100% pewien, czy to będzie działać, ale tylko wtedy to by było możliwe.

Czyli bez kombinowania, Twój dom musi być triggerem, żeby obsługiwać OnTrigger.
Albo musi NIE BYĆ triggerem, żeby obsługiwać OnCollision.

Jeśli dom jest triggerem, to drzewo musi nie być.
Jeśli drzewo jest triggerem, to dom musi nie być.

Zdarzenia OnCollision nie zadziałają przy kontakcie z triggerami. Obiekty, które są triggerami powinny obsługiwać kolizje z NIE-TRIGGERAMI w zdarzeniach OnTrigger.

0

Dobra udało się wykryc ta kolizje. Mialem zle ustawiony rigidbody. Ale mam problem teraz z dodaniem wartosci co okreslony czas. Zrobiłem cos takiego.

void OnCollisionStay2D(Collision2D collision)
    {
        print("Wykryto kolizje 2");
        if(collision.gameObject.tag == "drzewo")
        {
            // Gracz.gameObject.GetComponent<Stats>().Odbierz_Gold(100);
            Invoke("ReSpawnn", 5);
        }       
     
    }

    void ReSpawnn()
    {
        Gracz.gameObject.GetComponent<Stats>().Odbierz_Gold(100);
    }

Ale działa tylko poprawnie jak gracz i tak styka sie z domem. Bo jak odejdzie pieniadze leca bez czasu w wartosci +1;

0

Taki zapis robi Invoke tysiące razy...

Co konkretnie chcesz zrobić? Żeby podczas stykania się z obiektem gracz dostawał kasę co 5 sekund?

0

No to tak chyba najprościej ;)

const float ReSpawnnInterval = 5.0f;
float LastReSpawnnTime = -ReSpawnnInterval;

void OnCollisionStay2D(Collision2D collision)
{
        print("Wykryto kolizje 2");
        if (collision.gameObject.tag == "drzewo" && Time.time - LastReSpawnnTime > ReSpawnnInterval)
        {
            ReSpawnn();
            LastReSpawnnTime = Time.time;
        }
}
0

Działa jak nalezy tylko na start dodaje + 50 :D i co 5 sekund 100. Dzieki za rozwiazanie problemu ;]

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