[RESOLU] [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

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
Syp
Messages : 8
Inscription : 25 Nov 2018 14:54

[RESOLU] [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Syp » 25 Nov 2018 15:10

Bonjour, je travaille actuellement sur la réalisation d'un jeu en 2D à but pédagogique.
Je débute sur Unity et j'essaie de me familiariser avec le changement de scène et la création de niveaux. Je connais la commande SceneManager.LoadScene qui permet de passer d'une scène à une autre, et je sais comment passer d'une scène à une autre en appuyant sur une touche prédéfinie. En revanche je souhaiterais pouvoir ne permettre aux joueurs de passer à la scène suivante seulement si il est proche d'un objet. Par exemple je voudrais que lorsqu'il est proche d'un drapeau et qu'il appuie sur espace cela lance un niveau.
J'ai donc essayé de travailler avec un box collider et un on trigger pour que lorsque le joueur entre dans la zone et appuie sur espace cela passe à la scène suivante. Mais j'ai un peu du mal à écrire le script étant donné que j'ai encore un peu de mal avec le C#. Voilà donc l'algorithme que j'ai écris :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeScenOnclickSpace : MonoBehaviour {
	
	public void Update () 
	{
		if (Input.GetKeyDown (KeyCode.Space)&&Collider.gameObject.tag=="Player")
		{
			SceneManager.LoadScene("Niveau1");
		}
		
	}
}
Pouvez vous me dire ce qu'il faut que je modifie dans ce script pour qu'il soit fonctionnel? J'ai notamment du mal avec le gameObject.tag que je ne sais pas vraiment utilisé, j'imagine que le problème vient principalement de là.

Merci d'avance, Syp.
Dernière édition par Syp le 01 Déc 2018 20:41, édité 1 fois.

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par EmileF » 25 Nov 2018 19:11

Salut,

Pour faire ce que tu veux, je placerai un Empty avec un composant Trigger, devant le drapeau. Et je l'équiperai du script
suivant

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeScenOnclickSpace : MonoBehaviour {
    
    private void OnTriggerStay(Collider other)
    {
        if (other.tag == "Player" && Input.GetKeyDown(KeyCode.Space))
        {
            SceneManager.LoadScene("Niveau1");
        }
    }
}

Je n'ai pas testé, mais je pense que ça doit marcher.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Syp
Messages : 8
Inscription : 25 Nov 2018 14:54

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Syp » 25 Nov 2018 19:50

Bonjour,

Tout d'abord merci beaucoup de votre aide. Néanmoins j'ai un peu de mal à faire fonctionner le script.
Lorsque je crée un empty faut il que je lui associe un box collider et que je le mette en on trigger puis que je lui associe le script ou est ce que ma méthode n'est pas la bonne?
J'ai essayé en lui ajoutant un boxcollider on trigger mais lorsque je fais rentrer mon Player dans la zone et que j'appuie sur espace il ne se passe rien :triste1:

Autre question, j'ai voulu essayé de changer de touche pour l'activation de mon trigger, si je veux par exemple l'associer à la lettre P, la commande Input.GetKeyDown(KeyCode.P) fonctionne-t-elle bien ?

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

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Max » 25 Nov 2018 20:08

Bonsoir,
Syp a écrit :
25 Nov 2018 19:50
Lorsque je crée un empty faut il que je lui associe un box collider et que je le mette en on trigger puis que je lui associe le script ou est ce que ma méthode n'est pas la bonne?
A priori normalement cela devrait fonctionner (avec un script comme celui fournis plus haut par emile121153).
Tu n'as pas d'erreurs affichées ?
Un truc qui doit ressembler un peu à ça:
Image

Ceci dit, attention car comme le précise bien la doc, ton player doit posséder un RigidBody pour qu'il y ai détection par le Trigger.
Syp a écrit :
25 Nov 2018 19:50
Autre question, j'ai voulu essayé de changer de touche pour l'activation de mon trigger, si je veux par exemple l'associer à la lettre P, la commande Input.GetKeyDown(KeyCode.P) fonctionne-t-elle bien ?
Oui bien sûr. Le soucis ne vient pas de là... ;)

Petit conseil, tu sembles n'avoir quasiment aucune base, prend le temps de te faire le tuto du Learn (il y a une partie complète dédiée à la physique), tu y verras bien plus clair après .
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


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

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Max » 26 Nov 2018 08:58

dan44180 a écrit :
26 Nov 2018 08:17
ne faut il pas utilise en plus la bibliotheque
using UnityEngine.SceneManagement;
Oui en effet (et qui n'apparais pas dans les scripts listés dans les messages précédents). Ceci dit Syp ne spécifie pas si il a des erreurs dans la console, donc difficile de dire si c'est lié (il est juste dit j'ai un peu de mal à faire fonctionner le script).
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

Syp
Messages : 8
Inscription : 25 Nov 2018 14:54

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Syp » 28 Nov 2018 10:11

Encore merci de votre aide, j'ai bien ajouté la ligne "UnityEngine.SceneManagement", donc il semblerait que le problème ne viennent pas de là. En plus de ça j'ai déjà un script qui me permet de passer d'une scène à la suivante en cliquant sur le bouton de la souris et il fonctionne bien. Donc je pense que le problème vient du trigger, j'ai l'impression que mon personnage n'est pas détecté lorsqu'il rentre dans ma zone de détection. Voici le code mis à jour :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

	
public class ChangeScenOnclickSpace : MonoBehaviour {
    
    private void OnTriggerStay(Collider other)
    {
        if (other.tag == "Player" && Input.GetKeyDown(KeyCode.P))
        {
            SceneManager.LoadScene("Niveau 1");
        }
    }
}
J'ai ajouté le Debug.Log pour essayer de voir si mon personnage est détecté, si j'ai bien compris le principe de la fonction debug.Log je devrais avoir un message dans ma console qui m'indique que mon personnage est détecté, c'est bien ça? En tout cas je n'ai aucun message qui s'affiche. Pourtant mon personnage traverse bien la zone puisque lorsque j'enlève le on trigger de mon Box Collider il y a bien une collision entre mon box collider et mon personnage.
Je précise aussi que mon personnage possède bien un rigibody et qu'il est tag sur "player" donc le problème ne vient pas de là ( j'utilise le personnage robotboy du standard asset de Unity donc il possédait déjà un rigibody).
Je n'arrive donc pas à savoir d'où vient le problème :triste1:
Je précise aussi que je n'ai aucun message d'erreur qui s'affiche, donc pas d'erreur de script en théorie, c'est simplement que lorsque j'entre dans la zone et que j'appuie sur P il ne se passe rien.

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Sebela » 28 Nov 2018 10:29

Hello !

Quelques questions :
- à quel gameObject ton script ChangeScenOnclickSpace est-il rattaché ?
- Ton perso possède un rigidbody, mais possède-t-il un collider ? Le collider du perso est-il en mode "trigger" ? (si oui, décocher le trigger)
- Il s'agit bien de colliders 3D ?

Pour le Debug.Log, tu peux le mettre de cette façon :

Code : Tout sélectionner

private void OnTriggerStay(Collider other)
    {
    	Debug.Log(other);
        if (other.tag == "Player" && Input.GetKeyDown(KeyCode.P))
        {
            SceneManager.LoadScene("Niveau 1");
        }
    }
Comme ça, tu verras déjà si le trigger est bien enclenché si lorsque tu es dans la zone tu obtiens un message dans ta console.

Syp
Messages : 8
Inscription : 25 Nov 2018 14:54

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Syp » 28 Nov 2018 10:43

Quelques questions :
"- à quel gameObject ton script ChangeScenOnclickSpace est-il rattaché ?" Il est rattaché à l'empty, qui possède donc un box collider et un on trigger.
"- Ton perso possède un rigidbody, mais possède-t-il un collider ?" Le collider du perso est-il en mode "trigger" ? (si oui, décocher le trigger) Le personnage possède effectivement un collider, un circle collider 2D pour la tête et un box collider 2D pour le corps ( encore une fois je n'ai pas eu à m'en préoccupé jusque là puisque je me suis contenté de récupérer le personnage du standard assets de Unity.
"- Il s'agit bien de colliders 3D ?" Et ce sont donc des collider 2D puisque je travail sur un jeu en 2D, ça pose problème?

J'ai également ajouté le debug.log comme vous me l'avez indiqué et je n'ai toujours pas de message dans la console, donc mon perso n'est effectivement pas détecté...

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

Re: [DB-AL] Changement de scène sur appuie d'une touche et dans une zone prédéfinie

Message par Max » 28 Nov 2018 10:52

Salut,
Syp a écrit :
28 Nov 2018 10:43
Et ce sont donc des collider 2D puisque je travail sur un jeu en 2D, ça pose problème?
Arf, effectivement tu le spécifiais dans ton premier message, et c'est un peu passé à la trappe...
Donc il faut que tu passes par des fonctions de l'API concernant la physique 2D, dans ton cas par exemple OnTriggerStay2D.
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 « (C#) CSharp »