[DB-AL] Mouvement à la pokémon

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
Hostam
Messages : 3
Inscription : 04 Mai 2020 19:43

[DB-AL] Mouvement à la pokémon

Message par Hostam » 04 Mai 2020 20:57

[DB-AL]

Bonjour, je suis nouveau sur le forum et j'ai commencé Unity il y a 2 mois. J'ai fait un déplacement par grille comme dans Pokémon et j'aimerai avoir vos avis, notamment pour le système de collision qui fonctionne avec un Raycast. Voilà, merci à ceux qui prendront le temps :) .

Code : Tout sélectionner

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    //==Variables==//
    private int moveSpeed = 4;
    Vector3 targetPosition;
    private Animator playerAnim;

    void Start()
    {
        playerAnim = GetComponent<Animator>(); // Référence à l'Animator du joeur.
        targetPosition = transform.position; // Place la cible à la position du joueur.
    }

    private void Update()
    {
        //==Inputs==//
        if (transform.position == targetPosition)
        {
            if (Input.GetKey(KeyCode.Q)) // Gauche.
            {
                UpdateLook(new Vector2(-1, 0));
                if (CanMove(Vector2.left))
                {
                    targetPosition += Vector3.left;
                }
            }

            else if (Input.GetKey(KeyCode.D)) // Droite.
            {
                UpdateLook(new Vector2(1, 0));
                if (CanMove(Vector2.right))
                {
                    targetPosition += Vector3.right;
                }
            }

            else if (Input.GetKey(KeyCode.Z)) // Haut.
            {
                UpdateLook(new Vector2(0, 1));
                if (CanMove(Vector2.up))
                {
                    targetPosition += Vector3.up;
                }
            }

            else if (Input.GetKey(KeyCode.S)) // Bas.
            {
                UpdateLook(new Vector2(0, -1));
                if (CanMove(Vector2.down))
                {
                    targetPosition += Vector3.down;
                }
            }

            if (transform.position == targetPosition) // Si aucune touche pressée.
            {
                playerAnim.SetBool("isMoving", false);
            }
            else // Si le joueur ne bouge pas.
            {
                playerAnim.SetBool("isMoving", true); 
            }
        }
    }

    private void FixedUpdate()
    {
        //==Mouvement==//
        if (playerAnim.GetBool("isMoving")) // Si le joueur doit bouger.
        {
            transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.fixedDeltaTime); // Déplace le joueur.
        }
    }

    private void UpdateLook(Vector2 lookDirection) // Règle la direction du regard.
    {
        playerAnim.SetFloat("moveX", lookDirection.x);
        playerAnim.SetFloat("moveY", lookDirection.y);
    }

    private bool CanMove(Vector2 moveDirection) // Détecte si il y a un obstacle dans la direction demandée par le joueur.
    {
        Debug.DrawRay(transform.position + Vector3.down / 2, moveDirection, Color.red); // Pour voir le Raycast.

        if (Physics2D.Raycast(transform.position + Vector3.down / 2, moveDirection, 1f).collider == null) // Si le Raycast ne touche pas un obstacle.
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Répondre

Revenir vers « (C#) CSharp »