[C#] Outil pour faire des Murs

Cette section est destinée aux scripts partagés par la communauté. Chaque post est destiné à un script. Suivez bien les recommandations.
Avatar de l’utilisateur
yoyoyaya
Messages : 1656
Inscription : 30 Mai 2011 13:14
Localisation : PAAAAARTOUUUU
Contact :

[C#] Outil pour faire des Murs

Message par yoyoyaya » 13 Oct 2013 15:44

-NOM DU SCRIPT : Walls Tool

-AUTEUR : L'ivrogne du village (votre serviteur)

-DESCRIPTION : Ben à faire des murs ma caille (ou à instancier en lignes, à la façon de briques forment un mur, des objets).

-LE GÉNIE EN PLEINE ACTION :
Pour un de mes "mini projets de délestage cérébral", j'ai besoin de faire des murs (composés de blocs) à la pelle. Le truc, c'est que je n'avais pas envie de me péter le derrière à tout placer à la main (je suis maso mais pas à ce point). J'ai donc pondu un script mais ce con tournait quand le jeu était lancé et moi, je le voulais dans l'Editor. J'ai donc utilisé mon ami gogole et j'ai trouvé comment faire.
Mais pris dans la ferveur d'avoir réussit à faire quelque chose, j'ai continué dans ma lancée et j'ai voulut pondre une fenêtre dédiée. J'aurais due ne pas m'emballer, cette envie de fenêtre m'a pris un temps fou (ben oui, je n'avais jamais fait de "tool" avant). J'ai pensé à vendre le tout pour 1 million de gros $$$ mais noble (et stupide) comme je suis, je me suis dit que le "tool" aussi débile soit-il pourrait servir à une des pauvres âmes (putain de kévins mégalos) qui bouffent les ressources de ce forum sans dire merci (ouais, c'est bien à toi que je parle jeune boutonneux). Je suis un grand seigneur, je sais. Mais que voulez vous, c'est dans ma nature (lol).
Bref, le tool fait son taf dans l'editeur, assurez vous seulement que le point central du mesh qui servira de brique soit au centre de cette dernière, sinon il faudra penser à implanter une option de décalage dans le code (chose que j'ai la flemme de faire).
Le code est loin d'être propre et optimisé, je suis un manche et puis c'est tout.

-UTILISATION : Creer un script C# et y coller le contenu présent dans la balise script (sisi, c'est vrai)
Aller ensuite dans Window (comme pour File/Edit etc sauf que là, tu l'aura remarqué, c'est Window) et cliquer sur "Walls Tool".
Une fenêtre s'ouvrira et c'est là qu'il faudra renseigner les champs demandés (comme pour les impôts jeune/pas jeune anarchiste).

En gros, dans "Brick" (brique), ben tu case le prefab/GameObject à instancier pour créer le zoli mur tant souhaité dans tes plus beaux rêves.

Si la taille de ta brique est différente de zero (on sait jamais), "Brick Horizontal/Vertical Size" vont prendre la valeur de la taille de la brique assigné. Tu peu après, si ça ne te plait pas (jamais contents les gens), modifier à la main les valeurs pour coller à tes souhaits.

Si tu coche "Horizontal Offset", tes brique se décaleront une ligne sur deux de la moitié de leur taille horizontal vers la gauche pour te faire un zoli mur un brin plus réaliste que l'amas de colonnes verticales que tu aurait eu sans cocher la cacase.

Ensuite, vue que je suis généreux, je te laisse le choix. Tu peux soit créer ton mur avec un nombre défini de briques ou alors, tu peux le créer sur les longueur et hauteur minimales entrées.

Par défaut, les briques seront placés dans un parent. Tu peux en créer un ou alors leur en assigner un déjà existant dans la scène. Si tu coche "Use Parent Pos./Rot." et que ton parent déjà existent est à une position X et une rotation Y dans la scène, ton mur sera à la position du parent. Dans le cas contraire, si tu décoche, le parent et donc le mur seront positionnés et tournés en fonction des valeurs entrées dans "Parent World Position/Rotation".
Si tu choisis "Create Parent" (choix audacieux mon ami), tu peux choisir le nom qu'aura le parent.
Par contre, si c'est "Use Parent" qui est coché, il ne te faudra pas glisser le parent de la partie Hierarchy vers l'encart de destination mais simplement le sélectionner (cliquer dessus dans Hierarchy) et il apparaitra comme par magie dans le-dit encart.

Tu peux aussi sélectionner la position du parent par rapport au mur ("Parent Pivot is Bottom - "). Si tu met sur "Center", le parent sera centré horizontalement sur le mur. Si c'est sur "Left", il sera à gauche du mur (à la limite gauche de la première brique du mur). Si c'est sur "Right", ben c'est comme pour "Left" sauf que ce sera sur la droite.

"Create Wall" te pondra ton mur, "Reset Values" réinitiera les valeurs de la fenêtre à leurs valeurs d'origine.

Si par malchance, tu te retrouve avec des messages "! blabla bla", c'est que t'as fait une connerie et c'est pas de chances (hahaha, bien fait pour toi). Pour y remédier, utiliser ton neurone pour lire et comprendre le message est de mise.

-SCRIPT :

Code : Tout sélectionner

//Licence CC by NC (http://creativecommons.org/licenses/by-nc/2.0/)
//yoyoyaya-iamyoyoyaya pour http://www.unity3d-france.com
//http://www.iamyoyoyaya.tk
//iamyoyoyaya@gmail.com
//Details : http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?f=24&t=6982

using UnityEditor;
using UnityEngine;

public class WallsTool : EditorWindow{

    private enum choosePosition { Left, Center, Right }
    private choosePosition parentPivot = choosePosition.Center;
    private bool useQuantity = true;
    private bool useDistance = false;
    private bool useOffset = true;
    private int horizontalQuantity = 1;
    private int verticalQuantity = 1;
    private float horizontalSize = 1;
    private float verticalSize = 1;
    private float horizontalDistance;
    private float verticalDistance;
    private Vector3 centerPosition;
    private Vector3 centerRotation;
    private GameObject brick;
    private Object lastBrick;
    private GameObject parent;
    private bool createParent = true;
    private string parentName = "GameObject";
    private bool useParent = false;
    private bool useParentPosition = true;

    private bool brickAlert = false;
    private bool useParentAlert = false;
    private bool horizontalDistanceAlert = false;
    private bool verticalDistanceAlert = false;
    private bool horizontalSizeAlert = false;
    private bool verticalSizeAlert = false;
    private bool wallCreated = false;

    private bool createWallOffset = false;
    private GameObject createWallParent;
    private GameObject originalWallParent;
    private Vector3 originalWallParentPosition;
    private Vector3 originalWallParentRotation;


    [MenuItem("Window/Walls Tool")]

    public static void ShowWindow(){
        EditorWindow.GetWindow(typeof(WallsTool));
    }


    void OnGUI(){

        GUILayout.Label("Base Brick", EditorStyles.boldLabel);
        brick = (GameObject)EditorGUILayout.ObjectField(brick, typeof(GameObject));
        if(lastBrick != brick){
            lastBrick = brick;
            if(brick.transform.lossyScale != Vector3.zero){
                horizontalSize = brick.transform.lossyScale.x;
                verticalSize = brick.transform.lossyScale.y;
            }
        }

        horizontalSize = EditorGUILayout.FloatField("Brick Horizontal Size", horizontalSize);
        horizontalSize = Mathf.Max(0, horizontalSize);
        verticalSize = EditorGUILayout.FloatField("Brick Vertical Size", verticalSize);
        verticalSize = Mathf.Max(0, verticalSize);

        useOffset = EditorGUILayout.Toggle("Horizontal Offset", useOffset);

        EditorGUILayout.Space();

        useQuantity = EditorGUILayout.BeginToggleGroup("Create Wall by Bricks Quantity", useQuantity);
            useDistance = !useQuantity;
        EditorGUILayout.EndToggleGroup();
        if(useQuantity){
            horizontalQuantity = EditorGUILayout.IntField("Horizontal Quantity", horizontalQuantity);
            horizontalQuantity = Mathf.Max(1, horizontalQuantity);
            verticalQuantity = EditorGUILayout.IntField("Vertical Quantity", verticalQuantity);
            verticalQuantity = Mathf.Max(1, verticalQuantity);
        }

        useDistance = EditorGUILayout.BeginToggleGroup("Create Wall by Total Distance", useDistance);
            useQuantity = !useDistance;
        EditorGUILayout.EndToggleGroup();
        if(useDistance){
            horizontalDistance = EditorGUILayout.FloatField("Horizontal Distance", horizontalDistance);
            horizontalDistance = Mathf.Max(0, horizontalDistance);
            verticalDistance = EditorGUILayout.FloatField("Vertical Distance", verticalDistance);
            verticalDistance = Mathf.Max(0, verticalDistance);
        }

        EditorGUILayout.Space();

        useParent = EditorGUILayout.BeginToggleGroup("Use Parent", useParent);
            createParent = !useParent;
        EditorGUILayout.EndToggleGroup();
        if(useParent){
            parent = (Selection.activeTransform != null) ? Selection.activeTransform.gameObject : null;
            parent = (GameObject)EditorGUILayout.ObjectField(parent, typeof(GameObject), true);
            if(parent){
                useParentPosition = EditorGUILayout.Toggle("Use Parent Pos./Rot.", useParentPosition);
                if(!useParentPosition){
                    centerPosition = EditorGUILayout.Vector3Field("Parent World Position", centerPosition);
                    centerRotation = EditorGUILayout.Vector3Field("Parent World Rotation", centerRotation);
                }
            }
        }

        createParent = EditorGUILayout.BeginToggleGroup("Create Parent", createParent);
            useParent = !createParent;
        EditorGUILayout.EndToggleGroup();
        if(createParent){
            parentName = EditorGUILayout.TextField("Parent Name: ", parentName);
            parentName = (parentName == "") ? "GameObject" : parentName;
            centerPosition = EditorGUILayout.Vector3Field("Parent World Position", centerPosition);
            centerRotation = EditorGUILayout.Vector3Field("Parent World Rotation", centerRotation);
        }

        parentPivot = (choosePosition)EditorGUILayout.EnumPopup("Parent Pivot is Bottom - ", parentPivot);

        EditorGUILayout.Space();

        EditorGUILayout.Space();

        if(GUILayout.Button("Create Wall")){
            wallCreated = false;
            brickAlert = (!brick) ? true : false;
            useParentAlert = (useParent && !parent) ? true : false;
            horizontalDistanceAlert = (useDistance && horizontalDistance == 0) ? true : false;
            verticalDistanceAlert = (useDistance && verticalDistance == 0) ? true : false;
            horizontalSizeAlert = (horizontalSize == 0) ? true : false;
            verticalSizeAlert = (verticalSize == 0) ? true : false;

            if(!brickAlert && !useParentAlert && !horizontalDistanceAlert && !verticalDistanceAlert && !horizontalSizeAlert && !verticalSizeAlert){
                CreateWall();
            }
        }
        if(GUILayout.Button("Reset Values")){
            brick = null;
            lastBrick = null;
            horizontalQuantity = 1;
            verticalQuantity = 1;
            horizontalDistance = 0;
            verticalDistance = 0;
            horizontalSize = 1;
            verticalSize = 1;
            useQuantity = true;
            useDistance = false;
            useOffset = true;
            createParent = true;
            useParent = false;
            useParentPosition = true;
            parentName = "GameObject";
            parent = null;
            centerPosition = Vector3.zero;
            centerRotation = Vector3.zero;
            parentPivot = choosePosition.Center;
            brickAlert = false;
            useParentAlert = false;
            horizontalDistanceAlert = false;
            verticalDistanceAlert = false;
            horizontalSizeAlert = false;
            verticalSizeAlert = false;
            wallCreated = false;
            createWallOffset = false;
            createWallParent = null;
            originalWallParent = null;
            originalWallParentPosition = Vector3.zero;
            originalWallParentRotation = Vector3.zero;

        }

        if(brickAlert){
            GUILayout.Label("! You need to select a brick", EditorStyles.boldLabel);
        }
        if(useParentAlert){
            GUILayout.Label("! The parent is not assigned\n-Please select a GameObject in the Hierarchy", EditorStyles.boldLabel);
        }
        if(horizontalDistanceAlert){
            GUILayout.Label("! The horizontal distance must be greater than 0", EditorStyles.boldLabel);
        }
        if(verticalDistanceAlert){
            GUILayout.Label("! The vertical distance must be greater than 0", EditorStyles.boldLabel);
        }
        if(horizontalSizeAlert){
            GUILayout.Label("! The horizontal size must be greater than 0", EditorStyles.boldLabel);
        }
        if(verticalSizeAlert){
            GUILayout.Label("! The vertical size must be greater than 0", EditorStyles.boldLabel);
        }
        if(wallCreated){
            GUILayout.Label("Wall Created", EditorStyles.boldLabel);
        }
    }


    void CreateWall(){

        if(useParent){
            originalWallParent = parent as GameObject;
            originalWallParentPosition = originalWallParent.transform.position;
            originalWallParentRotation = originalWallParent.transform.eulerAngles;

            createWallParent = originalWallParent;
            createWallParent.transform.position = Vector3.zero;
            createWallParent.transform.eulerAngles = Vector3.zero;
        }
        else{
            createWallParent = new GameObject(parentName) as GameObject;
        }

        if(useQuantity){
        
            if(parentPivot == choosePosition.Left){
                createWallParent.transform.position = new Vector3(-horizontalSize * 0.5f, 0, 0);
            }
            else if(parentPivot == choosePosition.Center){
                createWallParent.transform.position = new Vector3(-horizontalSize * 0.5f + ((horizontalSize * horizontalQuantity) * 0.5f), 0, 0);
            }
            else if(parentPivot == choosePosition.Right){
                createWallParent.transform.position = new Vector3(-horizontalSize * 0.5f + (horizontalSize * horizontalQuantity), 0, 0);
            }

            for(int i = 0; i < verticalQuantity; i++){
                createWallOffset = (useOffset && i != 0) ? !createWallOffset : false;
                for(int j = 0; j < horizontalQuantity + ((createWallOffset) ? 1 : 0); j++){
                    GameObject brickTemp = Instantiate(brick, Vector3.zero, Quaternion.identity) as GameObject;
                    brickTemp.name = brick.name;
                    brickTemp.transform.parent = createWallParent.transform;
                    brickTemp.transform.position = new Vector3((horizontalSize * j) - ((createWallOffset) ? horizontalSize * 0.5f : 0), (verticalSize * 0.5f) + (verticalSize * i), 0);
                }
            }
        }
        else if(useDistance){
        
            if(parentPivot == choosePosition.Left){
                createWallParent.transform.position = new Vector3(-horizontalSize * 0.5f, 0, 0);
            }
            else if(parentPivot == choosePosition.Center){
                createWallParent.transform.position = new Vector3((-horizontalSize * 0.5f) + ((Mathf.Ceil(horizontalDistance / horizontalSize) * 0.5f) * horizontalSize), 0, 0);
            }
            else if(parentPivot == choosePosition.Right){
                createWallParent.transform.position = new Vector3((-horizontalSize * 0.5f) + (Mathf.Ceil(horizontalDistance / horizontalSize) * horizontalSize), 0, 0);
            }

            for(int i = 0; i * verticalSize < verticalDistance; i++){
                createWallOffset = (useOffset && i != 0) ? !createWallOffset : false;
                for(int j = 0; j * horizontalSize - ((createWallOffset) ? horizontalSize * 0.5f : 0) < horizontalDistance; j++){
                    GameObject brickTemp = Instantiate(brick, Vector3.zero, Quaternion.identity) as GameObject;
                    brickTemp.name = brick.name;
                    brickTemp.transform.parent = createWallParent.transform;
                    brickTemp.transform.position = new Vector3((horizontalSize * j) - ((createWallOffset) ? horizontalSize * 0.5f : 0), (verticalSize * 0.5f) + (verticalSize * i), 0);
                }
            }
        }

        if(useParent && useParentPosition){
            createWallParent.transform.position = originalWallParentPosition;
            createWallParent.transform.eulerAngles = originalWallParentRotation;
        }
        else{
            createWallParent.transform.position = centerPosition;
            createWallParent.transform.eulerAngles = centerRotation;
        }

        wallCreated = true;
    }
}
EDIT : Mon anglais est vraiment pourri. Si j'ai fait des erreurs, faites le moi savoir (ou pas)
EDIT 2 : Si ça tente certains de modifier/nettoyer/optimiser le code, n'hésitez pas à poster. C'est qu'il se faisait très tard (ou plutôt, tôt vue l'heure) quand je l'ai pondu ^^.
Dernière édition par yoyoyaya le 13 Oct 2013 17:42, édité 1 fois.
ImageImage

Avatar de l’utilisateur
mel68
Messages : 827
Inscription : 04 Fév 2012 14:57

Re: [C#] Outil pour faire des Murs

Message par mel68 » 13 Oct 2013 17:23

Merci :D
Bonjour bonjour, je tien juste a vous avertir promptement que ce message ne sert totalement a rien

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: [C#] Outil pour faire des Murs

Message par cayou66 » 13 Oct 2013 17:44

ça mérite une petite vidéo tout ça :)

Good job !

Avatar de l’utilisateur
Franck
Bricoleur
Bricoleur
Messages : 2884
Inscription : 08 Jan 2011 18:43
Localisation : Tours

Re: [C#] Outil pour faire des Murs

Message par Franck » 13 Oct 2013 18:00

Merci Yoyo.
Dés fois j'bug, dés fois j'bug pas.

Avatar de l’utilisateur
yoyoyaya
Messages : 1656
Inscription : 30 Mai 2011 13:14
Localisation : PAAAAARTOUUUU
Contact :

Re: [C#] Outil pour faire des Murs

Message par yoyoyaya » 13 Oct 2013 21:39

cayou66 a écrit :ça mérite une petite vidéo tout ça :)
Une video ? Pour faire des murs ? Sérieux ? :lol:
ImageImage


Avatar de l’utilisateur
yoyoyaya
Messages : 1656
Inscription : 30 Mai 2011 13:14
Localisation : PAAAAARTOUUUU
Contact :

Re: [C#] Outil pour faire des Murs

Message par yoyoyaya » 04 Nov 2013 18:40

Et bien te voilà servit cayou :lol:

Cela dit, c'est vrai que ça serait peut-être plus simple à "comprendre" en deux minutes avec une video. Vais voir si j'ai le courage un de ces quatre.
ImageImage

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: [C#] Outil pour faire des Murs

Message par cayou66 » 04 Nov 2013 18:44

En effet, ça m'avance :)

Avatar de l’utilisateur
db22
Messages : 742
Inscription : 31 Mars 2011 12:07

Re: [C#] Outil pour faire des Murs

Message par db22 » 17 Nov 2013 09:31

ouep une petite vidéo ça serait pas mal :mrgreen:
Bienvenue !

Répondre

Revenir vers « Scripts »