Bouton et appel de fonction

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
jmhoubre
Messages : 273
Inscription : 05 Oct 2019 22:05

Bouton et appel de fonction

Message par jmhoubre » 25 Sep 2020 19:22

Bonjour,

un truc qui m'agace depuis une heure environ, passée sur la doc, le forum et Unity answers.

Dans une UI, un bouton peut appeler une fonction, grâce à la section OnClick (), si cette fonction est dans le bon script (attaché à l'objet placé dans le champ inférieur de gauche) et public. Si la fonction a un paramètre, il est possible d'indiquer la valeur dans le champ qui apparait alors. Ok, ça marche bien.
Ma fonction utilise un enum, et elle n'apparait plus dans la liste de fonctions accessibles. Je ne pense pas que cela vienne du code, mais sait-on jamais :

Code : Tout sélectionner

public class DifficultyButton : MonoBehaviour {
	public enum Level { easy, medium, hard };
	public Level currentDifficulty = Level.easy;

	public void SetLevel (Level _level) {
		
		switch (_level) {
			case Level.easy:
				currentDifficulty = Level.easy;
				minefield.CreateMinefield (10, 10, 5);
				break;
			case Level.medium:
				currentDifficulty = Level.medium;
				minefield.CreateMinefield (16, 16, 32);
				break;
			case Level.hard:
				currentDifficulty = Level.hard;
				minefield.CreateMinefield (32, 32, 64);
				break;
			default:
				break;
		}
	}
}
La configuration du bouton (ResetGame () est une autre fonction publique du même script).
Image

Je contourne la difficulté en mettant des cast (int) sur l'enum, et la fonction est accessible dans la boite déroulante, mais fournit un int, pas très lisible, au lieu d'un enum plus agréable à utiliser.

Une idée qui règle ce souci ?

Avatar de l’utilisateur
jmhoubre
Messages : 273
Inscription : 05 Oct 2019 22:05

Re: Bouton et appel de fonction

Message par jmhoubre » 25 Sep 2020 20:57

Une recherche différente sur Unity Answers m'a donné un résultat équivalent à mes casts : on peut affecter la méthode dans le champ du bouton, mais le paramètre accessible reste un int. Il faut détailler la déclaration de l'enum, et caster dans la fonction. Non seulement, l'enum n'est toujours pas accessible dans le champ de OnClick, mais en plus il faut caster pratiquement chaque fois qu'on l'utilise. Cette solution est une mauvaise pratique je pense.
Pourquoi les fonctions utilisables dans les boutons d'Unity ne peuvent-elles pas avoir des paramètres de type enum ?

Code : Tout sélectionner

public class DifficultyButton : MonoBehaviour {

	[SerializeField] private Minefield minefield;

	public enum Level { easy = 0, medium = 1, hard = 2};
	public Level currentDifficulty = Level.easy;

	private void Start () {
		print (currentDifficulty);
		ResetGame ();
	}

	public void SetLevel (int _level) {
		
		switch ((Level) _level) {
			case Level.easy:
				currentDifficulty = Level.easy;
				minefield.CreateMinefield (10, 10, 5);
				break;
			case Level.medium:
				currentDifficulty = Level.medium;
				minefield.CreateMinefield (16, 16, 32);
				break;
			case Level.hard:
				currentDifficulty = Level.hard;
				minefield.CreateMinefield (32, 32, 64);
				break;
			default:
				break;
		}
	}

	public void ResetGame () {
		SetLevel ((int) currentDifficulty);
	}
}

Avatar de l’utilisateur
jmhoubre
Messages : 273
Inscription : 05 Oct 2019 22:05

Re: Bouton et appel de fonction

Message par jmhoubre » 25 Sep 2020 22:29

Peut-être une solution sur StackOverflow, dernière réponse. Je verrai cela demain.

Répondre

Revenir vers « Scripting »