SceneManager : Passer par un Collider

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
zarkoffe
Messages : 6
Inscription : 01 Oct 2018 16:15

SceneManager : Passer par un Collider

Message par zarkoffe » 01 Oct 2018 16:24

Bonjour,

Quand je clique sur mon bouton, je change de scène (scène 0 ici).
Image
Le script appelé:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
 
public class LevelLoader : MonoBehaviour {
 
    public GameObject loadingScreen;
    public Slider slider;
 
 
    public void LoadLevel(int sceneIndex)
    {
        StartCoroutine(LoadAsync(sceneIndex));
    }
    IEnumerator LoadAsync(int sceneIndex)
    {
            AsyncOperation operation = SceneManager.LoadSceneAsync(sceneIndex);
 
            loadingScreen.SetActive(true);
 
            while (!operation.isDone)
            {
                float progress = Mathf.Clamp01(operation.progress / 0.9f);
 
                slider.value = progress;
 
                yield return null;
            }
        }
    }
Tout cela fonctionne. A la place d'un bouton, je voudrai déclencher ce script dès lors que mon personnage rentrera dans une certaine zone (pour le faire aller sur la scène suivante en faite).

Je voudrai donc ajouter ceci à mon script, mais je n'y parviens pas très bien :

Code : Tout sélectionner

void OnTriggerEnter (Collider other) {
    if(other.transform.gameObject.tag == "Player")
    {
        other.transform.position = respawnPositions;
    }
}
De plus, comme vous le voyer plus haut, le bouton indique la scene 0 sur le OnClick. Cela ne fait pas partie du script... et si je passe par une zone qui détectera mon personnage,je n'aurai donc plus de "OnClick", et donc plus d'indication qu'il faut aller sur la scene 0.

Si quelqu'un pouvait m'aider... merci d'avance!

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: SceneManager : Passer par un Collider

Message par Liven » 02 Oct 2018 11:39

Il te suffit faire une liaison dans le script où est ton OnTriggerEnter vers le script avec ton LoadLevel.

Code : Tout sélectionner

    [SerializeField] private NomDuScriptsquiContientLoadLevel  nomDuScriptsquiContientLoadLevel  ; 
    // et faire glisser l'objet en contenant ce script dans l'inspector
    
    void OnTriggerEnter (Collider other) {
    if(other.transform.gameObject.tag == "Player")
    {
        other.transform.position = respawnPositions;
        nomDuScriptsquiContientLoadLevel.LoadLevel(0); // tu peu remplace 0 par une variable int de ton choix
    }
    }

zarkoffe
Messages : 6
Inscription : 01 Oct 2018 16:15

Re: SceneManager : Passer par un Collider

Message par zarkoffe » 03 Oct 2018 02:07

Salut Liven, merci pour ta réponse!
Il y a 2/3 choses que je ne saisie pas:
- Avant tout, on est d'accord que je n'ai pas à toucher d'un poil le script LevelLoader, non?
- Je dois donc créer un nouveau script OnTriggerEnter, donc une nouvelle classe. Et ensuite appeler LevelLoader.

Code : Tout sélectionner

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

public class OnTriggerEnter : MonoBehaviour {

	[SerializeField] private LoadLevel LoadLevel  ;
	// et faire glisser l'objet en contenant ce script dans l'inspector

	void OnTriggerEnter (Collider other) {
	if(other.transform.gameObject.tag == "Player")
	{
			other.transform.position = respawnPositions;
			LoadLevel.LoadLevel(0); // tu peu remplace 0 par une variable int de ton choix
	}
	}
merci d'avance, excuse je débute encore un peu ;-)

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: SceneManager : Passer par un Collider

Message par Liven » 03 Oct 2018 11:43

zarkoffe a écrit :
03 Oct 2018 02:07
Salut Liven, merci pour ta réponse!
Il y a 2/3 choses que je ne saisie pas:
- Avant tout, on est d'accord que je n'ai pas à toucher d'un poil le script LevelLoader, non?
- Je dois donc créer un nouveau script OnTriggerEnter, donc une nouvelle classe. Et ensuite appeler LevelLoader.

Code : Tout sélectionner

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

public class OnTriggerEnter : MonoBehaviour {

	[SerializeField] private LoadLevel LoadLevel  ;
	// et faire glisser l'objet en contenant ce script dans l'inspector

	void OnTriggerEnter (Collider other) {
	if(other.transform.gameObject.tag == "Player")
	{
			other.transform.position = respawnPositions;
			LoadLevel.LoadLevel(0); // tu peu remplace 0 par une variable int de ton choix
	}
	}
merci d'avance, excuse je débute encore un peu ;-)

Si ton script LevelLoader fonctionne bien, il n'y a pas besoin de le modifier, il faut juste l'appeler.

Il faut bien créer une classe contenir ta fonction trigger. Par contre il ne faut PAS nommer ta classe comme ta fonction. Ta fonction se nomera de tout manière OnTriggerEnter car c'est une fonction interne à unity, tu doit utiliser ce nom par contre il faut que tu change le nom de ta classe en la nomant TriggerManagement par exemple.

Ensuite, je remarque que ta variable LoadLevel se nome exactement comme son type hors c'est une très mauvaise idée car on ne fait plus la distinction entre ce qui est type et ce qui est variable ce qui augure un beau basar pour la suite.

En plus c'est pas la fonction LoadLevel que tu doit mettre en variable mais la classe qui le contient (LevelLoader )

Souvent pour pallier à ce problème on commence le nom de la variable par une minuscule.

Ton code corrigé donne ça :

Code : Tout sélectionner

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

public class TriggerManagement : MonoBehaviour { // nom de classe modifé

	[SerializeField] private LevelLoader levelLoader ; 
	// liaison avec de la classe (levelLoader) plutot que la fonction (LoadLevel)  + minuscule sur la variable
	// et faire glisser l'objet en contenant ce script dans l'inspector

	void OnTriggerEnter (Collider other) {
	if(other.transform.gameObject.tag == "Player")
	{
			other.transform.position = respawnPositions; // ça je m'en occupe pas, c'est ta popote
			levelLoader.LoadLevel(0); 
			// minuscule sur la variable + appel de la fonction (LoadLevel) présente dans la classe (levelLoader)
	}
	}

zarkoffe
Messages : 6
Inscription : 01 Oct 2018 16:15

Re: SceneManager : Passer par un Collider

Message par zarkoffe » 03 Oct 2018 14:36

D'accord merci pour tes précisions, je comprends mieux comment tout cela tourne.
En effet cela me fait bien changer de scène comme il faut.
Petit soucis : j'ai l'impression que le script LevelLoader.cs n'est pas pris en compte ici, car je n'ai pas d'écran de chargement : je passe directement à la scène, sans transition.
Dans le OneTriggerEnter, je ne fais que changer de scène.
Comment déclencher le script LevelLoader lorsqu'il y a collision (lançant alors la barre de chargement), puis enfin changer de scène lorsque le loading screen a finit?
Si tu as une idée... merci! :)

PS : j'ai viré

Code : Tout sélectionner

			other.transform.position = respawnPositions;
qui n'avait plus rien à faire ici.

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: SceneManager : Passer par un Collider

Message par Liven » 03 Oct 2018 16:28

Normalement le Ontrigger déclenche exactement la même chose que le click sur le bouton : ça lance la fonction LoadLevel dans ton script LevelLoader et cette fonction LoadLevel lance la couroutine LoadAsync.

Je ne vois pas comment il y aurait une différence, après je suis pas un spécialiste des couroutine, il faudrait que tu débug avec des point d’arrêt pour voir comment ton script s’exécute et comparer son exécution lorsque tu click et lorsque tu trigger.

zarkoffe
Messages : 6
Inscription : 01 Oct 2018 16:15

Re: SceneManager : Passer par un Collider

Message par zarkoffe » 03 Oct 2018 17:39

Autant pour moi, cela venait simplement du fait que j'avais cacher le panel qui contenait ma barre de chargement.
Merci encore! Sujet résolu

Verrouillé

Revenir vers « Scripting »