Bloquer les déplacement

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
Larryon
Messages : 6
Inscription : 23 Sep 2014 13:00

Bloquer les déplacement

Message par Larryon » 21 Fév 2015 18:19

Bonjour, je suis nouveau et je suis en train de faire un jeu de plateforme 2D

Mon perso peut se déplacer horizontalement grâce a ces lignes :

Code : Tout sélectionner

public Vector2 speed = new Vector2(15, 15);
private Vector2 movement;

void Update(){
        float inputX = Input.GetAxis ("Horizontal");
        movement = new Vector2 (speed.x * inputX, 0);
}
Le saut est remplacé par une inversion de la gravité grâce a la touche adéquate.
J'ai mit un booléen pour vérifier si l'antigrav est activé, et un autre booléen pour vérifier si le perso est au sol.

Mon problème est le suivant, si le personnage n'est pas au sol et si l'antigrav est activé, il faut que le perso ne puisse pas bouger.
Ex :

Code : Tout sélectionner

if(antiGrav == true && toucheLeSol == false)
{
      ?????????????????????
}
Hors je n'arrive pas a désactiver les contrôle du personnage.

Sauriez-vous m'aider ?
Y a t-il une manière détournée d'arriver a ce résultats ?

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Bloquer les déplacement

Message par artemisart » 21 Fév 2015 18:56

Dans ta condition tu désactive l'effet de "movement" (ou alors tu entoure le code qui applique actuellement "movement" d'une condition antiGrav == false || toucheLeSol).

Larryon
Messages : 6
Inscription : 23 Sep 2014 13:00

Re: Bloquer les déplacement

Message par Larryon » 21 Fév 2015 19:10

J'ai déjà essayé de l'englober movement dans une condition, et mon personnage test s'est mis a faire des trucs bizarre.

Par contre je ne sais pas comment on désactive l'effet de movement.


Larryon
Messages : 6
Inscription : 23 Sep 2014 13:00

Re: Bloquer les déplacement

Message par Larryon » 21 Fév 2015 19:37

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PlayerMovement : MonoBehaviour {

	public Vector2 speed = new Vector2(15, 15);
	private Vector2 movement;

	// variable de l'anti-gravité
	private bool antiGrav = false;

	// valeur de l'anti-gravité
	public float gravite = -11.2f;

	// variables qui vérifient si on touche le sol
	public Transform checkSol;
	private bool toucheLeSol = false;
	public float rayonSol = 0.3f;
	public LayerMask Sol;

	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {

		// Récupération de l'axe vertical
		float inputX = Input.GetAxis ("Horizontal");

		movement = new Vector2 (speed.x * inputX, 0);

		// Si on appuie sur la touche espace
		// l'anti-gravité du personnage est activée
		if (Input.GetKeyDown (KeyCode.Space)) {
			antiGrav = !antiGrav;
		} 
		// On défini ce qui ce passe 
		if(antiGrav == true)
		{
			rigidbody2D.gravityScale = -gravite * 3;
		}
		if(antiGrav == false)
		{
			rigidbody2D.gravityScale = gravite;
		}
		if(antiGrav == true && toucheLeSol == false)
		{
			Input.enabled = false;
		}
	}

	void FixedUpdate()
	{
		rigidbody2D.velocity = movement;

		toucheLeSol = Physics2D.OverlapCircle (checkSol.position, rayonSol, Sol);
	}
}

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Bloquer les déplacement

Message par artemisart » 23 Fév 2015 17:46

Tu entoure juste "rigidbody2D.velocity = movement" par la condition.

Larryon
Messages : 6
Inscription : 23 Sep 2014 13:00

Re: Bloquer les déplacement

Message par Larryon » 23 Fév 2015 22:36

oui, comme ça, ça fonctionne. Mais il faut une condition par cas (du coup mettre tous ça dans un case, ça sera surement plus lisible) et checker le plafond aussi :

Code : Tout sélectionner

public Transform checkSol;
private bool toucheLeSol = false;
public float rayonSol = 0.3f;
public LayerMask Sol;

public Transform checkPlafond;
private bool touchePlafond = false;
public float rayonPlafond = 0.3f;


void FixedUpdate()
    {
        // Si l'anti-gravité est active ET qu'on touche le plafond, on peut se diriger
	if(antiGrav == true && touchePlafond == true)
	{
        	rigidbody2D.velocity = movement;
	}

        // Si l'anti-gravité est inactive ET qu'on touche le sol, on peut se diriger
	if(antiGrav == false && toucheLeSol == true)
	{
        	rigidbody2D.velocity = movement;
	}

        // Si l'anti-gravité est inactive ET qu'on ne touche pas le plafond, on peut se diriger
	if(antiGrav == false && touchePlafond == false)
	{
        	rigidbody2D.velocity = movement;
	}
 
        toucheLeSol = Physics2D.OverlapCircle (checkSol.position, rayonSol, Sol);
	touchePlafond = Physics2D.OverlapCircle (checkPlafond.position, rayonPlafond, Sol);
    }
Merci pour le coup de main ^^.

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Bloquer les déplacement

Message par artemisart » 24 Fév 2015 01:46

Ce qui donne

Code : Tout sélectionner

if ((antiGrav && touchePlafond) || (!antiGrav && (toucheLeSol || !touchePlafond)))
	rigidbody2D.velocity = movement;
Maintenant si on considère que toucheLeSol implique !touchePlafond, c'est identique à :

Code : Tout sélectionner

if ((antiGrav && touchePlafond) || (!antiGrav && !touchePlafond))
	rigidbody2D.velocity = movement;
Qui se simplifie en

Code : Tout sélectionner

if (antiGrav == touchePlafond)
	rigidbody2D.velocity = movement;
Voilà voilà !


PS : pas très consistant tes noms de variable :D
Et tu peux mettre toucheLeSol et touchePlafond en local et les Physics2D.OverlapCircle avant les conditions (plus propre à mon gout).

Répondre

Revenir vers « (C#) CSharp »