J'ai souvent vu des débutants en scripts, et notamment sur Unity3D cherchant à déclencher des actions, donc voila quelques explications pour étudier un script très simple, pour mieux comprendre le systeme.
Je m'adresse ici surtout aux infographistes qui n'aiment pas trop programmer, en espérant qui vous y verrez un peu plus claire.
( PS : Hello Xander
) Donc, pour faire facilement un petit switch d'état comme le cas d'un interrupteur, l'idéal est d'utiliser une variable de type booléen qui peu avoir que deux états "0 / 1" dis aussi "true / false"
Avec une simple instruction de base, il est facile de renverser l'état d'un booléen, et donc de faire un switch
Voilà le raisonnement en français avec un "interrupteur" booléen à 2 états, allumé ( 1 : true ) ou éteint ( 0 : false )
si ( "interrupteur"est allumé "1" ) alors "interrupteur" sera éteint "0"
sinon "interrupteur" devient allumé "1"
Ce qui donne dans un code classique de type JavaScript ceci
var interrupteur : boolean;
if(interrupteur) interrupteur = false;
else interrupteur = true;
En fait, nous pourrions toutes aussi bien écrire
if( interrupteur == true ) ou bien
if(interrupteur != true ) pour dire différent de vrais. Mais écrire
if(interrupteur) et
if(!interrupteur) est bien plus cours, les programmeurs sont fainéants, est aiment faire des raccourcis. C'est pareil pour
x = x + 1 ou
x = x - 1 qui donne
x++ et
--x, vous risquez de trouver souvent se type de simplification qui peuvent la 1re fois vous perdre quand vous débuté.
Maintenant nous allons voir comment on déclenche une action on / off avec un objet dans Unity3D.
Chaque script Unity est une nouvelle classe objet qui hérite d'une classe de bases avec déjà pleins méthodes (fonctions) standardisées propres aux moteurs d'Unity, et qui dérive lui-même de la plateforme Mono, version Open Source de Microsoft .Net
Donc dans notre script nous avons déjà pas mal de fonctions cachées ( les méthodes des classes héritées ) pour communiquer avec le moteur, et pour notre exemple ici, on va s'intéresser particulièrement à la méthode
Start() qui s'exécute qu'une fois au démarrage du script, un peu comme un constructeur, et qui permet d'initialiser les données. Ensuite la méthode
Update() qui est exécuter en permanence entre chaque frame, et ce qui est important de savoir ici, et que si le moteur 3D affiche 60 images par seconde, le script dans Update sera exécuter aussi 60 fois par seconde. Puis nous aurons besoin aussi de la méthode
OnMouseDown() qui s'exécute qu'à chaque fois qu'on clique avec la souris sur l'objet concerner par le script. Après il y a encore beaucoup d'autres fonctions dont nous n’aurons pas besoin ici et que je vous conseille de voir dans la doc.
Bon aller, on commence notre script, on va déjà déclarer les deux attributs ( très vulgairement, c'est des variables globale interne à la classe objet ) qu'on à besoin dans le script.
On déclare en attribut une variable public
_cible pour l'objet externe qu'on voudra commander, notre script étant placé lui sur un autre objet servant de bouton. Note, il n'y à en général pas besoin de déclarer l'objet sur lequel le script se trouve.
Donc
var _cible : GameObject;Comme
_cible est un attribut publique modifiable de l'extérieure, elle sera automatiquement placée en t'en que menu des propriétés du script dans l'interface d'Unity, et c'est de la qu'on pourra placer en drag and drop dans la liste des objets, l'objet cible avec lequel on veux interagir.
Comme citer toute à l'heure, nous avons aussi besoins d'un booléen pour gérer le switch, et nous allons le déclarer à la suite avec le mot clés
private, car nous voulons ici que cet attribut soit géré par le script sans que l'utilisateur puisse intervenir ( sinon elle apparaitrait dans le menu aussi )
Donc
private var _interrupteur : booléen;Maintenant nous allons avec la fonction
Start() initialisée
_interrupteur à
false, car nous voulions être sur qu'au démarrage du script, l'interrupteur est bien éteint ( à moins que vous vouliez le contraire ? )
function Start () {
_interrupteur = false;
}
Ensuite, nous allons faire le switch d'état comme expliqué au début, et que nous placerons dans
OnMouseDown(). Comme cela, à chaque clic sur l'objet, nous inverserons l'état de l'attribut privé
_interrupteur fonction OnMouseDown() {
if(_interrupteur) _interrupteur = false;
else _interrupteur = true;
}
Ce qui nous donne un script de bouton parfaitement opérationnel, mais qui ne fait encore rien, puisque nous n'y avons défini aucune action.
var _cible : GameObject;
private var _interrupteur: boolean;
function Start () {
_interrupteur= false;
}
function OnMouseDown() {
if(_interrupteur) _interrupteur = false;
else _interrupteur = true;
}
Maintenant pour les tests, nous allons créer une animation très simple par le script sur notre objet cible.
Un simple
_cible.transform.Rotate(Vector3.up*100.0); fera ici très bien notre affaire.
Ce qui fera tourner notre objet sur l'axe Y à chaque frame, multiplier par la vitesse indiquée. Et je dis bien à chaque frame comme marche cette fameuse boucle Update, mais vous n'y voyez pas un problème ?
Bah si ! si votre scène tourne sur des machines plus lentes ou plus rapides, avec donc, plus ou moins de frames par seconde (FPS), votre objet tournera plus on moins vite selon les machines, ce qui peu être catastrophique. Pour y remédier, nous allons tous simplement déplacer notre objet, non plus par une valeur constante, mais par une valeur variable dépendant du temps écoulé entre chaque frame. Ce qui nous donne
_cible.transform.Rotate(Vector3.up*(100.0*Time.deltaTime)); maintenant il tournera à la même vitesse chez tout le monde, ouf !
Enfin, si nous plaçons ceci dans notre script, notre objet cible tournera en permanence, mais nous voulons que ceci marche, ou pas, en fonction de l'état de notre interrupteur.
En général, on utilise souvent ceci
if(_interrupteur) { exécution de tout le script } mais on peu faire encore plus simple ici, un simple
if(!_interrupteur) return; nous fera sortir de la boucle si la variable est
false, le caractère (
!) voulant dire différent, donc si valeur différente de vrais, alors quitter en ne renvoyant rien.
Et voila le résultat final, plus qu'à le placer sur votre objet servant d'interrupteur

var _cible : GameObject;
private var _interrupteur: boolean;
function Start () {
_interrupteur= false;
}
function Update () {
if(!_interrupteur) return;
_cible.transform.Rotate(Vector3.up*(100.0*Time.deltaTime));
}
function OnMouseDown() {
if(_interrupteur) _interrupteur = false;
else _interrupteur = true;
}
Note : J'écris _variable au lieu de variable, c'est juste pour me rappelais que cette variable est un attribut de la classe, et pas une simple variable dans la fonction. Ce n'est qu'une façon personnelle de se repérer comme une autre, mais chacun a sa façon d'organiser son code.