Creare Videogiochi - Game Developer
Collider....che non collide - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Unity3D Italia (https://www.making-videogames.net/giochi/Forum-Unity3D-Italia)
+--- Forum: Richieste di Aiuto per Unity 3D (https://www.making-videogames.net/giochi/Forum-Richieste-di-Aiuto-per-Unity-3D)
+--- Discussione: Collider....che non collide (/thread-Collider-che-non-collide)



Collider....che non collide - samuele55598@gmail.com - 03-01-2016

Ciao a tutti, beh vi sembrerà strano ma è così, non è la prima volta che mi succede ed è mooolto strano, ma non ho toccato molte impostazioni di collider e rb del player. Beh se il player va "troppo veloce" quest'ultimo trapassa il muro (non solo quello di sinistra ma anche quello di destra). Sto lavorando in 2d comunque quindi collider e rb 2d ovviamente non so da cosa possa esser dato, le collisioni funzionano ma non se va troppo veloce, e come se lo attraversa tutto insieme senza poter fare tipo mezzo fuori e mezzo dentro, ma lo attraversa tutto insieme ecco.


Collider....che non collide - davidecreatoreapp - 03-01-2016

Potresti fare uno script che arrivato ad una certa transform.position (o quando entra in un trigger) ferma l'oggetto ad esempio impostando la velocità del rb a 0 (ovviamente dipende dalle circostanze nella quale serve ciò quindi magari non ti è nemmeno molto utile come cosa)


RE: Collider....che non collide - samuele55598@gmail.com - 03-01-2016

beh ma è molto strano comunque, e non cerco una soluzione in codice ma una soluzione al problema, in quanto lo considero un bug, ma comunque grazie Smile


RE: Collider....che non collide - davidecreatoreapp - 03-01-2016

Ah, allora in tal caso hai provato a rendere più grande il collider nella direzione nella quale l'oggetto lo oltrepassa?

Inviato dal mio GT-I9301I utilizzando Tapatalk


RE: Collider....che non collide - samuele55598@gmail.com - 03-01-2016

???Sono un pò perplesso:
1: In che senso nella direzione in cui lo oltrepassa
2: più grande come parlo di collider 2d può essere solo più o meno largo e più o meno alto. Solo con 2d<->2d se si prova a far collidere un 2d con un 3d non funziona, e viceversa Sad


RE: Collider....che non collide - davidecreatoreapp - 03-01-2016

Sì, probabilmente non mi sono spiegato bene.
Intendevo dire che se il player o chi per lui oltrepassa il collider lo oltrepassa per le coordinate x o y.
Tu dunque vai ad allargare in quella direzione (nello stesso verso, nella x o nella y) il collider e vedi come si comporta.

Inviato dal mio GT-I9301I utilizzando Tapatalk


RE: Collider....che non collide - Snaptrex - 04-01-2016

Controlla nel collider che non funziona che la spunta di check trigger non sia attiva


RE: Collider....che non collide - Zettamax - 04-01-2016

Molto probabilmente il player si muove talmente veloce che, in un solo frame, passa da un lato a l'altro del collider.
Hai provato ad usare Rigidbody2D.MovePosition per il movimento?
Se puoi, posta qui lo script che usi per il movimento del player così da poterti aiutare di più.


RE: Collider....che non collide - Master Gabriel - 04-01-2016

Lo dava anche a me lo stesso problema, dipendeva da che comando usavo per muovere il player.


RE: Collider....che non collide - samuele55598@gmail.com - 04-01-2016

Ok allora ecco a voi:
Codice:
using UnityEngine;
using System.Collections;

public class player1Move : MonoBehaviour {
    //Public:
    public float force=5f;
    public float force_up=10f;

    //Private:
    Rigidbody2D pl1Rig;

    // Use this for initialization
    void Awake()
    {
        pl1Rig=GetComponent<Rigidbody2D>();
    }
    
    // Update is called once per frame
    void Update ()
    {
        if(Input.GetKey(KeyCode.LeftArrow)||Input.GetKey(KeyCode.A))
            move("left");

        else if(Input.GetKey(KeyCode.RightArrow)||Input.GetKey(KeyCode.D))
            move ("right");

        else if(Input.GetKey(KeyCode.UpArrow)||Input.GetKey(KeyCode.W))
            move ("up");


    }

    void move(string dir){
        switch(dir)
        {
        case "left":
            pl1Rig.AddForce(Vector2.left*force,ForceMode2D.Impulse);
            break;

        case "right":
            pl1Rig.AddForce(Vector2.right*force,ForceMode2D.Impulse);
            break;

        case "up":
            pl1Rig.AddForce(Vector2.up*force_up,ForceMode2D.Impulse);
            break;
        }
    }
}

(04-01-2016, 01:06 PM)Snaptrex Ha scritto: Controlla nel collider che non funziona che la spunta di check trigger non sia attiva

No no, magari fosse così semplice...va be che non sono un esperto di unity ma non arrivo a questi livelli fino ad ora Big Grin


RE: Collider....che non collide - Snaptrex - 04-01-2016

Prova a mettere lo switch con gli addforce nel FixedUpdate,la parte di codice riguardante la fisica va sempre messa nel FixedUpdate e mai nell'update altrimenti non viene nemmeno presa in nota


RE: Collider....che non collide - samuele55598@gmail.com - 04-01-2016

Non ha molto senso, forse intendi i se, nel fixedUpdate, perchè fare come dici tu non lo muove proprio se prendo cosa hai detto alla lettera, quindi
Codice:
//tutte le libreria di unity

public class playerMove : MonoBehaviour{
     void Update(){
          if(Input.GetKey(KeyCode.LeftArrow)||Input.GetKey(KeyCode.A))
            move("left");

        else if(Input.GetKey(KeyCode.RightArrow)||Input.GetKey(KeyCode.D))
            move ("right");

        else if(Input.GetKey(KeyCode.UpArrow)||Input.GetKey(KeyCode.W))
            move ("up");
     }

     void FixedUpdate(){
           switch(dir)
        {
        case "left":
            pl1Rig.AddForce(Vector2.left*force,ForceMode2D.Impulse);
            break;

        case "right":
            pl1Rig.AddForce(Vector2.right*force,ForceMode2D.Impulse);
            break;

        case "up":
            pl1Rig.AddForce(Vector2.up*force_up,ForceMode2D.Impulse);
            break;
        }
     }
}
Non ha un senso logico, in quanto non funziona


RE: Collider....che non collide - davidecreatoreapp - 04-01-2016

Hai provato ad allargare il collider?

O prova quello o prova a fare uno script che fermi la sfera una volta arrivata ad una certa posizione.


RE: Collider....che non collide - Zettamax - 05-01-2016

Sostituisci void Update() con void FixedUpdate()


RE: Collider....che non collide - samuele55598@gmail.com - 05-01-2016

(04-01-2016, 08:41 PM)davidecreatoreapp Ha scritto: Hai provato ad allargare il collider?

O prova quello o prova a fare uno script che fermi la sfera una volta arrivata ad una certa posizione.

Perchè dovrei farlo? La possibilità di poter collidere con il muro è una prerogativa obbligatoria in quanto rappresenta parte integrante del concept :/ se creo qualcosa per fermarlo prima, che tra parentesi per me si tradurrebbe in un raycast verso la direzione di movimento e in questo momento sto impazzendo non poco per il raycast di mira, ma per non andare troppo off topic, è una soluzione che non va bene per questo caso, e generalmente se non posso collidere direttamente che senso ha?


Collider....che non collide - davidecreatoreapp - 06-01-2016

Probabilmente non sono in grado di spiegarmi, non importa, rinuncio. Comunque in caso ti serviva proprio di fermarti alla collisione poteva anche essere tramite un oncollisionenter2d e non tramite la posizione.


RE: Collider....che non collide - samuele55598@gmail.com - 06-01-2016

il problema è che credo che non dovrebbe accadere, ho modificato e messo le chiamate nel FixedUpdate, stesso problema, posso provare a cambiare e spostare l'oggetto tramite rigidbody.velocity


RE: Collider....che non collide - Zettamax - 06-01-2016

Ho fatto una scena di prova e anche a mè dava il tuo problema. l'ho risolto cambiando il Collision Detection del rigidbody del player da Discrete a Continuous.
Questo è lo script che ho usato per il movimento del player:
Codice:
using UnityEngine;
using System.Collections;

public class player1Move : MonoBehaviour {
    //Public:
    public float force=5f;
    public float force_up=10f;
    
    //Private:
    Rigidbody2D pl1Rig;
    
    // Use this for initialization
    void Awake()
    {
        pl1Rig=GetComponent<Rigidbody2D>();
    }
    
    void FixedUpdate ()
    {
        if(Input.GetKey(KeyCode.LeftArrow)||Input.GetKey(KeyCode.A))
            move("left");
        
        else if(Input.GetKey(KeyCode.RightArrow)||Input.GetKey(KeyCode.D))
            move ("right");
        
        else if(Input.GetKey(KeyCode.UpArrow)||Input.GetKey(KeyCode.W))
            move ("up");
        
        
    }
    
    void move(string dir){
        switch(dir)
        {
        case "left":
            pl1Rig.AddForce(Vector2.left*force,ForceMode2D.Impulse);
            break;
            
        case "right":
            pl1Rig.AddForce(Vector2.right*force,ForceMode2D.Impulse);
            break;
            
        case "up":
            pl1Rig.AddForce(Vector2.up*force_up,ForceMode2D.Impulse);
            break;
        }
    }
}



RE: Collider....che non collide - samuele55598@gmail.com - 07-01-2016

Risolto, solo che se mi dovesse ricapitare, e fixo in questo modo, il ciclo di polling per le collisioni in questo modo risulta più frequente-> ho paura che in progetti grandi potrebbe influire sulle performanche. E l'unica soluzione che funziona per ora quindi ok si può chiudere, nonostante ciò concludo: tu cosa ne pensi @Zettamax quanto potrebbe influire sulle performance?


RE: Collider....che non collide - Zettamax - 07-01-2016

In questo modo avrai un grosso impatto sulle performance, infatti il consiglio è quello di utilizzare il Collision Detection impostato su Discrete, e di cambiarlo solo se si verificano dei problemi(come in questo caso).
Se solo il player ha il Collision Detection come Continuous non dovresti avere grossi problemi di performance.