Optimiser un script

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Optimiser un script

Message par cortoh » 30 Juin 2015 22:37

Bonjour,
J'ai réalisé un script à la sauvage pour obtenir un résultat qui fonctionne assurement, le script est prévu pour six pions , alors ça fonctionne parfaitement sans aucun problème, cela dit je souhaiterais maintenant le compacter car j'imagine que ce genre de script présent dans la fonction Update n'est pas très recommandé.
Un exemple ou une orientation sur la façon de proçéder serait la bienvenue.

Mon script:

Code : Tout sélectionner

function Update ()
	{
		switch (cubeProvi)
        {
        
        case 0:
        
        Destroy(instAnce_1);
        Destroy(instAnce_2);
        Destroy(instAnce_3);
        Destroy(instAnce_4);
        Destroy(instAnce_5);
        Destroy(instAnce_6);
        
		cube_1.GetComponent.<BoxCollider>().enabled = true;
		cube_2.GetComponent.<BoxCollider>().enabled = true;
		cube_3.GetComponent.<BoxCollider>().enabled = true;
		cube_4.GetComponent.<BoxCollider>().enabled = true;
		cube_5.GetComponent.<BoxCollider>().enabled = true;
		cube_6.GetComponent.<BoxCollider>().enabled = true;
		
        break;
        
        case 1:
        
        Destroy(instAnce_1);
        Destroy(instAnce_2);
        Destroy(instAnce_3);
        Destroy(instAnce_4);
        Destroy(instAnce_5);
        Destroy(instAnce_6);
        
        
		cube_1.GetComponent.<BoxCollider>().enabled = true;
		cube_2.GetComponent.<BoxCollider>().enabled = false;
		cube_3.GetComponent.<BoxCollider>().enabled = false;
		cube_4.GetComponent.<BoxCollider>().enabled = false;
		cube_5.GetComponent.<BoxCollider>().enabled = false;
		cube_6.GetComponent.<BoxCollider>().enabled = false;
		
		instAnce_2 = Instantiate(cubeProvi_2, cube_2.transform.position, transform.rotation);
		instAnce_3 = Instantiate(cubeProvi_3, cube_3.transform.position, transform.rotation);
		instAnce_4 = Instantiate(cubeProvi_4, cube_4.transform.position, transform.rotation);
		instAnce_5 = Instantiate(cubeProvi_5, cube_5.transform.position, transform.rotation);
		instAnce_6 = Instantiate(cubeProvi_6, cube_6.transform.position, transform.rotation);
		
        break;
        
        case 2:
        
        Destroy(instAnce_1);
        Destroy(instAnce_2);
        Destroy(instAnce_3);
        Destroy(instAnce_4);
        Destroy(instAnce_5);
        Destroy(instAnce_6);
        
		cube_1.GetComponent.<BoxCollider>().enabled = false;
		cube_2.GetComponent.<BoxCollider>().enabled = true;
		cube_3.GetComponent.<BoxCollider>().enabled = false;
		cube_4.GetComponent.<BoxCollider>().enabled = false;
		cube_5.GetComponent.<BoxCollider>().enabled = false;
		cube_6.GetComponent.<BoxCollider>().enabled = false;
		
		instAnce_1 = Instantiate(cubeProvi_1, cube_1.transform.position, transform.rotation);
		instAnce_3 = Instantiate(cubeProvi_3, cube_3.transform.position, transform.rotation);
		instAnce_4 = Instantiate(cubeProvi_4, cube_4.transform.position, transform.rotation);
		instAnce_5 = Instantiate(cubeProvi_5, cube_5.transform.position, transform.rotation);
		instAnce_6 = Instantiate(cubeProvi_6, cube_6.transform.position, transform.rotation);
		
        break;
        
        case 3:
        
        Destroy(instAnce_1);
        Destroy(instAnce_2);
        Destroy(instAnce_3);
        Destroy(instAnce_4);
        Destroy(instAnce_5);
        Destroy(instAnce_6);
        
		cube_1.GetComponent.<BoxCollider>().enabled = false;
		cube_2.GetComponent.<BoxCollider>().enabled = false;
		cube_3.GetComponent.<BoxCollider>().enabled = true;
		cube_4.GetComponent.<BoxCollider>().enabled = false;
		cube_5.GetComponent.<BoxCollider>().enabled = false;
		cube_6.GetComponent.<BoxCollider>().enabled = false;
		
		instAnce_1 = Instantiate(cubeProvi_1, cube_1.transform.position, transform.rotation);
		instAnce_2 = Instantiate(cubeProvi_2, cube_2.transform.position, transform.rotation);
		instAnce_4 = Instantiate(cubeProvi_4, cube_4.transform.position, transform.rotation);
		instAnce_5 = Instantiate(cubeProvi_5, cube_5.transform.position, transform.rotation);
		instAnce_6 = Instantiate(cubeProvi_6, cube_6.transform.position, transform.rotation);
		
        break;

        // etc ... jusqu'à case 6:

sotec
Messages : 542
Inscription : 21 Sep 2012 10:11

Re: Optimiser un script

Message par sotec » 01 Juil 2015 08:48

ben une simple boucle for( int i = 0; i < nbElement; i++ ) devrait bien réduire ton code ^^ après en optimisation, il n'y a pas vraiment d'algo dans ton code, juste des affectations, donc pas franchement optimisable .

Edit : je ne sais pas si faire des instanciations / destruction de gameobject en un update est bien souhaitable :/ , mais je ne connais pas l'objectif ^^
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: Optimiser un script

Message par E3DStef » 01 Juil 2015 10:16

+1 sotec

Une boucle FOR suffit à réduire ton code
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Optimiser un script

Message par cortoh » 03 Juil 2015 05:59

Ok merci, je vais regarder ce que ça donne.
Merci à vous.

Avatar de l’utilisateur
Orkad
Messages : 24
Inscription : 03 Avr 2015 19:31

Re: Optimiser un script

Message par Orkad » 07 Juil 2015 18:27

Je pense que tu devrais te pencher sur les "List" ou "Array". Je ne sais pas comment tu fais pour instancier tes cubes mais tu devrais garder leur références dans un de tes scripts pour pouvoir utiliser un foreach dessus ce qui améliorerait ton code, et te permettrais de mettre un nombre de cubes variable en fonction de tes besoins.

J'espère t'avoir aidé, n'hésite pas a demander plus de précision sur un des points énoncés.

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Optimiser un script

Message par cortoh » 08 Juil 2015 21:17

Salut, désolé car pas eu beaucoup de temps en ce moment, alors je ne comprend pas comment avec une boucle désactiver le "Boxcollider" des 6 objets d'un "Array" sauf l'objet numéro 4 ?

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Optimiser un script

Message par artemisart » 08 Juil 2015 22:09

Un truc du genre :

Code : Tout sélectionner

function ActivateOnly (index : int) {
    for (i = 0; i < 6; i++) {
        colliders[i].enabled = i == index;
    }
}
ou

Code : Tout sélectionner

function ActivateOnly (index : int) {
    for (i = 0; i < 6; i++) {
        cubes[i].GetComponent.<BoxCollider>().enabled = i == index;
    }
}

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Optimiser un script

Message par cortoh » 09 Juil 2015 19:51

Salut,
Niveau code ça me dépasse, mis à part la boucle je ne le comprend pas, l'ajout de commentaire serait les bienvenues si c'est possible car je suis très curieux de savoir comment ça fonctionne.

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Optimiser un script

Message par artemisart » 10 Juil 2015 00:54

Toutes les comparaisons et tests sont en fait des expressions qui s'évaluent à un bool (ça "renvoit" un bool).
Donc ici l'expr "i == index" va s'évaluer à true si i = index, false sinon.
Et du coup les colliders seront désactivés ([...].enabled = false) sauf pour le collider n°[index] (où [...].enabled = true).
C'est très pratique de l'utiliser de cette façon même si ça m'a l'air assez peu répandu (peut-être à cause des tutos qui se foirent trop souvent sur cette partie ?).

D'une manière générale, les if (condition), for (init; condition; afterthought), while (condition) sont pas exacts (justement on les présente souvent comme ça dans les tutos), on devrait plutôt dire : if ([bool]), for (init; [bool]; afterthought), while([bool]) où [bool] est une expression s'évaluant à un bool (ex: accès à une variable, comparaison, (in)égalité, etc).

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Optimiser un script

Message par cortoh » 12 Juil 2015 07:14

Vraiment merci pour les explications, je vais mettre ça en pratique.

Verrouillé

Revenir vers « (Js) Javascript »