Unity permet d’utiliser (quasiment) toutes les fonctionnalités de C#, il est donc possible d’utiliser les évènements C# directement dans vos scripts Unity. L’interêt de la programation événementielle n’est plus à démontrer et Unity l’utilise déjà largement dans tous ses monobehaviour (OnClick, OnMouseDown…). La syntaxe est relativement inhabituelle mais permet une grande souplesse dans la déclaration et l’utilisation des évènements.
Unity permet d’utiliser (quasiment) toutes les fonctionnalités de C#, il est donc possible d’utiliser les évènements C# directement dans vos scripts Unity. L’interêt de la programation événementielle n’est plus à démontrer et Unity l’utilise déjà largement dans tous ses monobehaviour (OnClick, OnMouseDown…). La syntaxe est relativement inhabituelle mais permet une grande souplesse dans la déclaration et l’utilisation des évènements.
Prenons un exemple simple pour comprendre le fonctionnement. On souhaite faire bouger un cube quand on change la valeur d’un GUISlider. Par souci de simplicité, toutes les lignes de codes seront considérées comme dans une même classe, il est cependant courant d’avoir le lancement et la réception d’évènement dans des scripts séparés. L’implémentation reste néanmoins similaire.
Prenons un exemple simple pour comprendre le fonctionnement. On souhaite faire bouger un cube quand on change la valeur d’un GUISlider. Par souci de simplicité, toutes les lignes de codes seront considérées comme dans une même classe, il est cependant courant d’avoir le lancement et la réception d’évènement dans des scripts séparés. L’implémentation reste néanmoins similaire.
Déclaration et lancement
Voici la partie qui déclare l’évènement :
La première étape consiste à déclarer un delegate qui s’occupera d’appeler les méthodes liés à l’évènement. On remarquera ici que l’évènement prend un float en paramètre, il faudra donc que toutes les méthodes qui le réceptionnent aient également un float en paramètre. (attention le delegate se place avant la ligne “public class … ” ! )
public delegate void SliderChangedHandler(float val);
Puis l’évènement en lui même :
public event SliderChangedHandler SliderChanged;
On peut ensuite lancer l’évènement quand on le souhaite. Pour faciliter l’appel à l’évènement on peut écrire une méthode qui s’occupe de ces appels. Le test présent avant le lancement permet de regarder si au moins une méthode est “inscrite” à cet évènement, sinon il ne sert à rien de le lancer.
public void fireSliderChanged(float val){ if(SliderChanged != null ){ SliderChanged(val); } }
Exemple d’appel de l’évènement dans la méthode OnGUI :
void OnGUI(){ float oldSliderValue = sliderValue; sliderValue = GUI.HorizontalSlider(new Rect(Screen.width*0.1F, Screen.height*0.1F, Screen.width*0.2F, Screen.height*0.05F),sliderValue,0,10); if(sliderValue!=oldSliderValue){ fireSliderChanged(sliderValue); } }
Réception et gestion
Pour réceptionner notre évènement on va avoir besoin d’une méthode pour réagir à son lancement. Cette méthode prend les mêmes arguments que notre delegate déclaré plus haut. Ici on met à la jour la position d’un cube.
void updateCubePos(float val){ //exemple de gestion de l'évènement Vector3 pos = GameObject.Find("Cube").transform.position; pos.x = val; GameObject.Find("Cube").transform.position = pos; }
On “inscrit” ensuite cette méthode à notre évènement avec la syntaxe += :
SliderChanged += new SliderChangedHandler(updateCubePos);
On a donc maintenant un cube qui bouge dès que notre slider est modifié !
Il est très facile d’inscrire d’autres scripts à ce même évènement en utilisant la même syntaxe. On peut ainsi imaginer bouger plusieurs cubes, la caméra ou mettre à jour la vie du joueur… Le tout sans avoir besoin de changer notre slider.
Code complet
using UnityEngine; using System.Collections; public delegate void SliderChangedHandler(float val); public class testEvent : MonoBehaviour { public event SliderChangedHandler SliderChanged; float sliderValue = 0F; public void Start(){ SliderChanged += new SliderChangedHandler(updateCubePos); } public void fireSliderChanged(float val){ if(SliderChanged != null ){ SliderChanged(val); } } void OnGUI(){ float oldSliderValue = sliderValue; sliderValue = GUI.HorizontalSlider(new Rect(Screen.width*0.1F, Screen.height*0.1F, Screen.width*0.2F, Screen.height*0.05F),sliderValue,0,10); if(sliderValue!=oldSliderValue){ fireSliderChanged(sliderValue); } } void updateCubePos(float val){ //exemple de gestion de l'évènement Vector3 pos = GameObject.Find("Cube").transform.position; pos.x = val; GameObject.Find("Cube").transform.position = pos; } }
ARTICLE SIMILAIRE: Plugin Unity3D : NGUI – review et conseils
VOUS CHERCHEZ UN PARTENAIRE POUR RÉALISER UN JEU VIDÉO ? VOUS AVEZ UN PROJET D’APPLICATION LUDIQUE ? CONTACTEZ-NOUS!
Déclaration et lancement
Voici la partie qui déclare l’évènement :
La première étape consiste à déclarer un delegate qui s’occupera d’appeler les méthodes liés à l’évènement. On remarquera ici que l’évènement prend un float en paramètre, il faudra donc que toutes les méthodes qui le réceptionnent aient également un float en paramètre. (attention le delegate se place avant la ligne “public class … ” ! )
public delegate void SliderChangedHandler(float val);
Puis l’évènement en lui même :
public event SliderChangedHandler SliderChanged;
On peut ensuite lancer l’évènement quand on le souhaite. Pour faciliter l’appel à l’évènement on peut écrire une méthode qui s’occupe de ces appels. Le test présent avant le lancement permet de regarder si au moins une méthode est “inscrite” à cet évènement, sinon il ne sert à rien de le lancer.
public void fireSliderChanged(float val){ if(SliderChanged != null ){ SliderChanged(val); } }
Exemple d’appel de l’évènement dans la méthode OnGUI :
void OnGUI(){ float oldSliderValue = sliderValue; sliderValue = GUI.HorizontalSlider(new Rect(Screen.width*0.1F, Screen.height*0.1F, Screen.width*0.2F, Screen.height*0.05F),sliderValue,0,10); if(sliderValue!=oldSliderValue){ fireSliderChanged(sliderValue); } }
Réception et gestion
Pour réceptionner notre évènement on va avoir besoin d’une méthode pour réagir à son lancement. Cette méthode prend les mêmes arguments que notre delegate déclaré plus haut. Ici on met à la jour la position d’un cube.
void updateCubePos(float val){ //exemple de gestion de l'évènement Vector3 pos = GameObject.Find("Cube").transform.position; pos.x = val; GameObject.Find("Cube").transform.position = pos; }
On “inscrit” ensuite cette méthode à notre évènement avec la syntaxe += :
SliderChanged += new SliderChangedHandler(updateCubePos);
On a donc maintenant un cube qui bouge dès que notre slider est modifié !
Il est très facile d’inscrire d’autres scripts à ce même évènement en utilisant la même syntaxe. On peut ainsi imaginer bouger plusieurs cubes, la caméra ou mettre à jour la vie du joueur… Le tout sans avoir besoin de changer notre slider.
Code complet
using UnityEngine; using System.Collections; public delegate void SliderChangedHandler(float val); public class testEvent : MonoBehaviour { public event SliderChangedHandler SliderChanged; float sliderValue = 0F; public void Start(){ SliderChanged += new SliderChangedHandler(updateCubePos); } public void fireSliderChanged(float val){ if(SliderChanged != null ){ SliderChanged(val); } } void OnGUI(){ float oldSliderValue = sliderValue; sliderValue = GUI.HorizontalSlider(new Rect(Screen.width*0.1F, Screen.height*0.1F, Screen.width*0.2F, Screen.height*0.05F),sliderValue,0,10); if(sliderValue!=oldSliderValue){ fireSliderChanged(sliderValue); } } void updateCubePos(float val){ //exemple de gestion de l'évènement Vector3 pos = GameObject.Find("Cube").transform.position; pos.x = val; GameObject.Find("Cube").transform.position = pos; } }
Une réponse