Page 1 sur 1

Bouton et appel de fonction

Publié : 25 Sep 2020 19:22
par jmhoubre
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 ?

Re: Bouton et appel de fonction

Publié : 25 Sep 2020 20:57
par jmhoubre
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);
	}
}

Re: Bouton et appel de fonction

Publié : 25 Sep 2020 22:29
par jmhoubre
Peut-être une solution sur StackOverflow, dernière réponse. Je verrai cela demain.