Tirer de gauche à droite Unity 2D

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
FuZeuR
Messages : 11
Inscription : 02 Avr 2021 21:54

Tirer de gauche à droite Unity 2D

Message par FuZeuR » 03 Avr 2021 15:09

Bonjour/Bonsoir à tous,

J'ai un problème que je n'arrive pas à résoudre même grâce aux tutos sur YouTube, enfaîte je suis en train de développer un jeux platformer en 2d dans le style d'un mario bros classique, le principe avec mon personnage principale est qu'il puisse tirer à droite et à gauche, malheureusement même si je copie à l'exacte le code des tutos mon personnage ne tire que vers la droite, je sais que le problème vien du fait que je bloque la direction vers la droite avec une ligne de code mais je ne sais pas comment le remplacer pour qu'il puisse tirer à gauche comme à droite, de plus je suis nouveau sur ce forum alors je ne sais pas si je peux juste directement vous montrer mes scripts avec un copie/colle mais je suis aussi débutant dans la programmation du C#, même si ça ne m'empêche pas de me débrouiller et de comprendre ce que fait tel ou tel chose.

J'attend avec impatience vos aides parce que j'en ai vraiment marre de me casser la tête et de créer 10 000 script différent pour essayer de tirer à gauche. :triste1:

PS : je suis très actif et si mon problème est résolu je n'hésiterez pas à le partager ça pourrez sauvez quelques dev débutant comme moi :-D
Dernière édition par FuZeuR le 03 Avr 2021 16:50, édité 1 fois.

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

Re: Tirer de gauche à droite Unity 2D

Message par Max » 03 Avr 2021 15:15

Bonjour
FuZeuR a écrit :
03 Avr 2021 15:09
je ne sais pas si je peux juste directement vous montrer mes scripts avec un copie/colle
oui poste ton script (entre les bonnes balises) c'est le moyen le plus sûr de comprendre ce qui ne va pas et de t'aider éventuellement ;)
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

FuZeuR
Messages : 11
Inscription : 02 Avr 2021 21:54

Re: Tirer de gauche à droite Unity 2D

Message par FuZeuR » 03 Avr 2021 15:41

Ok alors du coup voilà les scripts qui permettent à mon personnage de tirer :

Script qui permet à la balles de se déplacer :

Code : Tout sélectionner

using UnityEngine;

public class MoveBulletScript : MonoBehaviour
{
    public Vector2 speed = new Vector2(10, 10);

    public Vector2 direction = new Vector2(-1, 0);

    private Vector2 movement;

    void Update()
    {
        movement = new Vector2(
      speed.x * direction.x,
      speed.y * direction.y);
    }
    void FixedUpdate()
    {
        GetComponent<Rigidbody2D>().velocity = movement;
    }
}

Script qui permet à la balle de faire des dégâts et détruire l'ennemi :

Code : Tout sélectionner

using UnityEngine;

public class ShotScript : MonoBehaviour
{
    public int damage = 100;
    public bool isEnemyShot = false;
    void Start()
    {
        Destroy(gameObject, 20);
    }
}

Script qui permet de tirer le prefab de la balle :

Code : Tout sélectionner

using UnityEngine;
public class WeaponScript : MonoBehaviour
{
    public Transform PlayerShotPrefab;
    public float shootingRate = 0.25f;
    private float shootCooldown;

    void Start()
    {
        shootCooldown = 0f;
    }

    void Update()
    {
        if (shootCooldown > 0)
        {
            shootCooldown -= Time.deltaTime;
        }
    }

    public void Attack(bool isEnemy)
    {
        if (CanAttack)
        {
            shootCooldown = shootingRate;

            var shotTransform = Instantiate(PlayerShotPrefab) as Transform;

            shotTransform.position = transform.position;

            ShotScript PlayerShot = shotTransform.gameObject.GetComponent<ShotScript>();
            if (PlayerShot != null)
            {
                PlayerShot.isEnemyShot = isEnemy;
            }
            MoveBulletScript Move = shotTransform.gameObject.GetComponent<MoveBulletScript>();
            if (Move != null)
            {
                Move.direction = this.transform.right;
            }
        }
    }
    public bool CanAttack
    {
        get
        {
            return shootCooldown <= 0f;
        }
    }
}
Dernière édition par FuZeuR le 03 Avr 2021 17:21, édité 1 fois.

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

Re: Tirer de gauche à droite Unity 2D

Message par Max » 03 Avr 2021 16:31

Re,

ben en parcourant rapidement ton code, au moment où tu instancies ton projectile, tu fais soit

Move.direction = this.transform.right;
ou
Move.direction = this.transform.left;
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

FuZeuR
Messages : 11
Inscription : 02 Avr 2021 21:54

Re: Tirer de gauche à droite Unity 2D

Message par FuZeuR » 03 Avr 2021 16:36

Max a écrit :
03 Avr 2021 16:31
Re,

ben en parcourant rapidement ton code, au moment où tu instancies ton projectile, tu fais soit

Move.direction = this.transform.right;
ou
Move.direction = this.transform.left;
le problème justement en fessant sa, ça me dit :
"Erreur CS1061 'Transform' ne contient pas de définition pour 'left' et aucune méthode d'extension accessible 'left' acceptant un premier argument de type 'Transform' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?) Assembly-CSharp"
Dans mon WeaponScript.

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

Re: Tirer de gauche à droite Unity 2D

Message par Max » 03 Avr 2021 16:43

oui excuse moi, j'ai répondu un peu vite, et effectivement Move.direction = this.transform.left; n'est pas possible.
Donc il faut juste le remplacer par Move.direction = -this.transform.right;.
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

FuZeuR
Messages : 11
Inscription : 02 Avr 2021 21:54

Re: Tirer de gauche à droite Unity 2D

Message par FuZeuR » 03 Avr 2021 16:48

Max a écrit :
03 Avr 2021 16:43
oui excuse moi, j'ai répondu un peu vite, et effectivement Move.direction = this.transform.left; n'est pas possible.
Donc il faut juste le remplacer par Move.direction = -this.transform.right;.
ça marche sauf que justement je souhaite que le personnage attaque à gauche et à droite selon la direction qu'il prend or avec Move.direction = -this.transform.right; ça tire que à gauche même si je rajoute Move.direction = this.transform.right; avec.

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

Re: Tirer de gauche à droite Unity 2D

Message par Max » 03 Avr 2021 17:10

Comment est géré ton personnage et son changement de direction ?
Souvent, le transform ne change pas, seul l'orientation du sprite change, avec par exemple une routine de Flip (qui se contente de changer le scaleX de 1 à -1 par exemple).
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

FuZeuR
Messages : 11
Inscription : 02 Avr 2021 21:54

Re: Tirer de gauche à droite Unity 2D

Message par FuZeuR » 03 Avr 2021 17:19

Max a écrit :
03 Avr 2021 17:10
Comment est géré ton personnage et son changement de direction ?
Souvent, le transform ne change pas, seul l'orientation du sprite change, avec par exemple une routine de Flip (qui se contente de changer le scaleX de 1 à -1 par exemple).

Code : Tout sélectionner

using UnityEngine;public class Move : MonoBehaviour
{
public float moveSpeed; 
public float jumpForce;
private bool isJumping;
    private bool isGrounded;
    public Transform groundCheck;
    public float groundCheckRadius;
    public LayerMask collisionLayers;
    public Rigidbody2D rb;
    private Vector3 velocity = Vector3.zero;
    private float horizontalMovement;
    public Animator animator;
    public SpriteRenderer spriteRenderer;
    public CapsuleCollider2D playerCollider;
    public static Move instance;
    public void Update()
    {
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, collisionLayers);
        animator.SetBool("collisionLayers", isGrounded);

        horizontalMovement = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;

        if (isGrounded && Input.GetButtonDown("Jump"))
        {
            animator.SetBool("Jump", true);
            isJumping = true;
        }

        MovePlayer(horizontalMovement);

        void MovePlayer(float _horizontalMovement)
        {
            Vector3 targetVelocity = new Vector2(_horizontalMovement, rb.velocity.y);
            rb.velocity = Vector3.SmoothDamp(rb.velocity, targetVelocity, ref velocity, .05f);

            if (isJumping == true)
            {
                rb.AddForce(new Vector2(0f, jumpForce));
                isJumping = false;

            }
        }

        Flip(rb.velocity.x);
        float characterVelocity = Mathf.Abs(rb.velocity.x);
        animator.SetFloat("Speed", rb.velocity.x);
    
        void Flip(float _velocity)
        {
            if (_velocity > 0.1f)
            {
                spriteRenderer.flipX = false;

            }
            else if (_velocity < -0.1f)
            {
                spriteRenderer.flipX = true;
            }

        }
        bool PlayerShot = Input.GetButtonDown("Fire1");
        PlayerShot |= Input.GetButtonDown("Fire2");

        if (PlayerShot)
        {
            WeaponScript weapon = GetComponent<WeaponScript>();
            if (weapon != null)
            {
                weapon.Attack(false);
            }
        }
    }

    private void Awake()
    {
        if (instance != null)
        {
            Debug.LogWarning("Il y a plus d'une instance de Move dans la scène");
            return;
        }
        instance = this;
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(groundCheck.position, groundCheckRadius);
    }
}
voilà comment est géré le déplacement de mon personnage et effectivement j'utilise Flip pour faire retourner son sprite mais ça ne marche pas pour la balle.

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

Re: Tirer de gauche à droite Unity 2D

Message par Max » 03 Avr 2021 17:53

la donnée spriteRenderer.flipX te donne l'orientation (gauche/droite) de ton Player, ce qui te permet d'en déduire la direction à initialiser pour le projectile.
Par contre, essais d'organiser ton code, de l'aérer, et évite les définitions de méthodes au sein d'autre méthode. Niveau lisibilité (même pour toi pour la suite et quand il faut déboguer) c'est pas terrible ;)
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

Répondre

Revenir vers « Scripting »