Page 1 sur 1

[DB-AL] Collision imparfaite - mon objet traverse parfois les murs

Publié : 01 Juil 2019 15:46
par adrenachrom
Bonjour tout le monde
Je pense que je pose ici une question que tout le monde a déjà posé cent fois mais mes recherches sur le forum sont restée un peu infructueuses, avec des réponses incomplètes ou qui ne me convenaient pas.
J'essaye donc de développer un petit jeu en 3D, vue de dessus, avec un personnage qui évolue dans un labyrinthe. Donc déplacement ( Joystick Gauche)+ rotation (joystick droit) + collision contre les murs.

Au début, j'ai commencé en utilisant un Translate; j'ai vite compris que cette commande posait des problèmes de collisions. Effectivement mon personnage entrait bien en collision avec les murs MAIS en cas de collisions multiples ( notamment dans les coins ) il passait parfois au travers des murs.
J'ai donc testé en changeant pour la commande MovePosition. Exactement le même problème; comme si la modification n'avait rien changé.
Dernière tentative en date, j'ai essayé d'anticiper le contact avec un RayCast. Le problème se manifeste un peu différemment mais je me retrouve avec le même souci. Quand je tourne le long d'un mur, le personnage fini par pénétrer un peu dedans.
Pareil avec un SphereCast.
Du coup je commence à désespérer et je serais curieux de savoir et comprendre comment vous vous y prendriez pour régler ce souci.
Je vous mets un screen de mon jeu ainsi que la partie de mon code qui concerne le mouvement du personnage.
Merci d'avance pour vos réponses ^^



Image

Code : Tout sélectionner

RaycastHit hit;
        Debug.DrawRay(transform.position, new Vector3(-Input.GetAxis(ControlV) * 5, 0, -Input.GetAxis(ControlH) * 5), Color.red);


        // Moving
        if (!Physics.SphereCast(transform.position, 0.6f, new Vector3(-Input.GetAxis(ControlV) * 5, 0, -Input.GetAxis(ControlH) * 5), out hit, 0.2f))
        {
            Vector3 Move = new Vector3(-Input.GetAxis(ControlV) * curSpeed * Time.deltaTime, 0, -Input.GetAxis(ControlH) * curSpeed * Time.deltaTime);
            GetComponent<Rigidbody>().MovePosition(transform.position + Move);
        }


        //transform.Translate(Vector3.back * curSpeed * Time.fixedDeltaTime * (Input.GetAxis(ControlH)), Space.World);
        //transform.Translate(Vector3.left * curSpeed * Time.fixedDeltaTime * (Input.GetAxis(ControlV)), Space.World);

        // Turning head
        float x = Input.GetAxis("RotateH" + MasterSceneScript.Player[1]);
        float y = Input.GetAxis("RotateV" + MasterSceneScript.Player[1]);
        if (x != 0f || y != 0f)
        transform.eulerAngles = new Vector3(transform.eulerAngles.x, Mathf.Atan2(x, y) * Mathf.Rad2Deg, transform.eulerAngles.z);

Re: [DB-AL] Collision imparfaite - mon objet traverse parfois les murs

Publié : 01 Juil 2019 16:05
par E3DStef
Salut

Effectivement problème bizarre.

As tu essayé de "compenser" ces rares glitch via un trigger ?
Tu positionne un trigger sur un mur qui va faire reculer/déplacer le player de x pts afin qu'il n'entre jamais vraiment en contact avec le mur ?

Tu as aussi l'option d'affiner les collisions de DISCRETE a CONTINOUS (collisions mieux gérées mais conso cpu + importante)
C'est dans les paramètres du collider (de mémoire car pas unity sous les yeux)

A+

Stef

Re: [DB-AL] Collision imparfaite - mon objet traverse parfois les murs

Publié : 01 Juil 2019 16:40
par adrenachrom
Merci pour ta réponse

Alors j'ai testé de passer les collisions de discrete a continuous mais aucun changement.
Par-contre je n'ai pas testé de mettre un trigger sur le mur. J'ai du mal à visualiser comment ça fonctionne en fait.
Le trigger va détecter la collision avec le joueur mais comment sait-il vers où le repousser ( le mur ayant potentiellement 4 côté )?
Tu utilises le vecteur Mur/Personnage peut-être?

Re: [DB-AL] Collision imparfaite - mon objet traverse parfois les murs

Publié : 01 Juil 2019 17:43
par Max
Salut,

perso, pour un truc 3D vue du dessus comme ça, j'essaierais avec ce bon vieux CharacterController.
Par exemple le player:
Image

ce qui donne:
Image

et un code pour une controller simple servant de base de travail:

Code : Tout sélectionner

public class SimpleController : MonoBehaviour
{
    public float speed;

    private CharacterController m_CharacterController;
    private Vector3 moveDir;

    // Start is called before the first frame update
    void Start()
    {
        m_CharacterController = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 inputmove = transform.forward * vertical + transform.right * horizontal;

        moveDir.x = inputmove.x * speed * Time.fixedDeltaTime; ;
        moveDir.z = inputmove.z * speed * Time.fixedDeltaTime; ;

        m_CharacterController.Move(moveDir * Time.fixedDeltaTime);
    }
}

Re: [DB-AL] Collision imparfaite - mon objet traverse parfois les murs

Publié : 01 Juil 2019 19:45
par adrenachrom
Ah nice; je vais tester ça !
Je reviens pour vous tenir au courant.
Merci ^^