3D Book

Nos ressources => Tutoriels divers => Discussion démarrée par: Stéph le Le 23 décembre 2009 à 17:17:39 pm

Titre: [Unity3D] Pour bien débuter, créons un objet bouton On / Off
Posté par: Stéph le Le 23 décembre 2009 à 17:17:39 pm
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 :mrgreen: )

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 :poucehaut:

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.
Titre: Re : [Unity3D] Pour bien débuter, créons un objet bouton On / Off
Posté par: Kathleenz le Le 27 juin 2018 à 10:13:58 am
Where do all of these materials come from? Can they be explained so that I can bring them to the foreground?