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