Partage
  • Partager sur Facebook
  • Partager sur Twitter

Déplacements XY 2D - Unity

Sujet résolu
    18 janvier 2021 à 21:02:16

    Bonjour à tous, je viens de commencer un jeu 2D sur Unity, et je me retrouve confronté à plusieurs problèmes.

    Premièrement, lorsque mon personnage saute et attéri sur un mûr (côté d'une tile), il reste collé à celle ci si je ne lâche pas la touche directionnelle gauche/droite.

    Deuxièmement, ma map comporte des pentes faites de tiles représentants des triangles, et lorsque mon personnage grimpe une pente sa vitesse augmente considérablement et on dirait qu'il pourrait presque s'envoler.

    Voici mon code : 

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Character_Controller : MonoBehaviour
    {
        public float maxSpeed = 2; //vitesse max du perso
        public float jumpForce = 1000;
        public Transform groundCheck; // vérifie si le perso touche le sol 
        public LayerMask groundMask; // Définition du sol via un Layer (calque)
        public bool isGrounded = false;
        Rigidbody2D rb; // stock le rb du personnage
        SpriteRenderer sr;
    
        void Start()
        {
            rb = GetComponent<Rigidbody2D>(); // on récupère le rb du personnage 
            sr = GetComponent<SpriteRenderer>(); // on récupère le sr du personnage 
        }
    
        void FixedUpdate() //version améliorée de la fonction Update lorsqu'on bosse sur la physique
        {
            float hor = Input.GetAxis("Horizontal"); // -1/1 soit gauche/droite
            rb.velocity = new Vector2(hor * maxSpeed, rb.velocity.y); // déplacement horizontal
            Flip(hor); // regarder dans la bonne direction
            //test si on est au sol -> fonction préfabriquée par unity pour voir si un transform est sur un layer
            isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.15f, groundMask);
            if (Input.GetButton("Jump") && isGrounded)
                rb.AddForce(Vector3.up * jumpForce);
        }
    
        void Flip (float h) // fonction permettant de tourner le personnage en fonction de sa direction
        {
            if (h < 0)
                sr.flipX = true;
            if (h > 0)
                sr.flipX = false;
        }
    }
    

    Voilà aussi un screen pour vous montrer la map : 

    Ce mouvement est obtenu juste en appuyant sur la touche 'D' au lancement du jeu.

    Quelques infos en vrac : 

    • La map (cubes solides) possède le tag 'Ground'.
    • le ground-check est correctement positionné au pied de mon personnage
    • mon personnage possède une capsule collider 2D

    Voilà, merci d'avance pour votre aide.

    Cordialement,

    Niiack

    • Partager sur Facebook
    • Partager sur Twitter
    « L'ordre mon cul, la liberté m'habite ! »
      13 février 2021 à 23:54:23

      Salut Niiack!

      As-tu trouvé la solution à ton problème?

      • Partager sur Facebook
      • Partager sur Twitter
        14 février 2021 à 11:34:16

        FixedUpdate n'est pas une version améliorée d'Update, c'est une fonction qui demande plus de rigueur au niveau délais d'exécution.

        Il faut éviter de mélanger les actions sur la vitesse et les actions sur la simulation physique (AddForce).

        Il faut penser à faire des actions proportionnel au deltaTime entre chaque appel de FixzdUpdate.

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

        Déplacements XY 2D - Unity

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown