J'effectue quelques tests, et j'essaye actuellement de faire un wall jump à mon personnage.
Malheureusement il donne plutôt l'impression de se téléporter que de sauter du mur.
Voici le code;
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveTest : MonoBehaviour
{
//Liste des variables
#region Variables
public Rigidbody2D rb;
//Definit la vitesse de deplacement du personnage
public float moveSpeed;
private Vector3 velocity = Vector3.zero;
public Animator animator;
public SpriteRenderer spriteRenderer;
//Definit si le personnage est au sol
public bool isJumping;
//Gestion de collision du sol
public bool isGrounded;
public Transform groundCheckLeft;
public Transform groundCheckRight;
//Gestion de collision mur gauche
public bool isOnLeftWall;
public Transform wallLeftCheckUp;
public Transform wallLeftCheckDown;
//Gestion de collision mur droit
public bool isOnRightWall;
public Transform wallRightCheckUp;
public Transform wallRightCheckDown;
//Appel des methodes
private bool executeJump;
private bool executeWallJump;
private float movementPlayer;
//Definit quel mur est touché
private string wallSideArgument;
#endregion
//Lu uniquement au demarrage du script
#region Start
void Start()
{
executeJump = false;
}
#endregion
//Lu a interval regulier
#region FixedUpdate
void FixedUpdate()
{
Move(movementPlayer);
isGrounded = Physics2D.OverlapArea(groundCheckLeft.position, groundCheckRight.position); //Verifie la collision avec le sol
isOnLeftWall = Physics2D.OverlapArea(wallLeftCheckUp.position, wallLeftCheckDown.position); //Verifie la collision avec un mur à gauche
isOnRightWall = Physics2D.OverlapArea(wallRightCheckUp.position, wallRightCheckDown.position);//Verifie la collifion avec un mur à droite
//Appel les methodes
if (executeJump) {
Jump();
}
if (executeWallJump)
{
WallJump(wallSideArgument);
}
}
#endregion
//Lecture à chaque frame
#region update
void Update()
{
if (Input.GetKeyDown("space") && isGrounded)
{
executeJump = true;
}
if (Input.GetKeyDown("space") && isGrounded == false && isOnLeftWall)
{
wallSideArgument = "left";
executeWallJump = true;
}
if (Input.GetKeyDown("space") && isGrounded == false && isOnRightWall)
{
wallSideArgument = "right";
executeWallJump = true;
}
movementPlayer = Input.GetAxis("Horizontal") * moveSpeed * Time.fixedDeltaTime;
animator.SetBool("isGrounded", isGrounded);
}
#endregion
//Cette methode permet de deplacer le personnage
#region Move
private void Move(float _movementplayer) {
rb.velocity = new Vector2(_movementplayer, rb.velocity.y);
float charactervelocity = Mathf.Abs(rb.velocity.x);
Flip(rb.velocity.x);
animator.SetFloat("Speed", charactervelocity);
}
#endregion
//Cette methode permet d'effectuer un simple saut
#region Jump
private void Jump() {
Vector3 jump = new Vector3(0, 10, 0);
rb.AddForce(jump, ForceMode2D.Impulse);
executeJump = false;
}
#endregion
//Cette methode permet d'effectuer des wall jump
#region WallJump
private void WallJump(string _wallSide)
{
switch (_wallSide)
{
case "left":
//Initialise la velocité a 0 pour ne pas perturber le saut
rb.velocity = new Vector2(0, 0);
//Defini la direction du wallJump
Vector3 leftWallJump = new Vector3( 30 , 7 , 0);
//Applique le saut sur le personnage
rb.AddForce(leftWallJump, ForceMode2D.Impulse);
//Termine la sequence de saut
executeWallJump = false;
break;
}
}
#endregion
// Cette methode permet de tourner le personnage selon sa direction
#region Flip
void Flip(float _velocity)
{
if (_velocity > 0.1f)
{
spriteRenderer.flipX = false;
}
else if (_velocity < -0.1f)
{
spriteRenderer.flipX = true;
}
}
#endregion
}