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

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 01 Juil 2019 15:46

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);

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

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

Message par E3DStef » 01 Juil 2019 16:05

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
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 01 Juil 2019 16:40

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?

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 01 Juil 2019 17:43

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);
    }
}
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 01 Juil 2019 19:45

Ah nice; je vais tester ça !
Je reviens pour vous tenir au courant.
Merci ^^

Répondre

Revenir vers « (C#) CSharp »