(-)Création 3D

Guide de l’utilisateur de Unity Débutant

 

  • Installations (Gratuits) :
    • 123D Catch : Autodesk => Photos 2D (.jpg & .tiff) => Objet 3D => export .obj avec Texture. [Ne fonctionne pas => désinstallé ]
    • Google Earth => Photos Street View
    • GIMP => Pour remettre d’aplomb les photos de Google Earth / Streat view dont la perspective est déformée : Outil => Transformation => Perspective.
    • SweetHome 3D : Plan 3D => export .obj
    • PhotoStitch => transforme plusieurs photos contiguës en panoramique
    • Audacity => toutes manipulation, transformation, effets, conversion … sur fichiers sons.

 

  • Pour les tests pendant le développement désactiver 3D
  • Vidéos création de terrain : http://www.youtube.com/watch?v=GBtrC3a0xBA
    • Import des Assets (Standards[Charac Controler] & Asset Store[Terrains] & Skybox)
    • Création du terrain (attention pas de menu Terrains) => les paramètres (taille) : sélectionner le terrain dans la Hiérarchie, dans l’inspecteur de l’Objet terrain,  au bout de la barre outil, un engrenage (Paramètres)
    • Outils d’ altitude, planéification.
    • Ajout de Lumière
    • Ajout de « Character Contrôleur » à OVR Camera controller
    • Ajour de ciel : FirstPersControl=> MainCam=>
      • Component=> Rendering => Skybox
      • Ajouter un ciel dans « custom skybox » (chercher Sky dans Assets)
      • Dans le cas de l’Oculus les attacher à Cam Droite & Cam Gauche
    • Ajout a objet « Camera » => Component => Camera contrôle => Mouse-Look.
    • Ajout de textures terrain
    • Ajout de plantes : Arbres, buissons, herbe (cool, ça bouge avec le vent : réglage ds terrain),
  • Vidéo effet d’Eaux : http://www.youtube.com/watch?v=kPQJTml1eJs
    • Import Asset [Water (Basic)]
    • Animation d’objet
  • Vidéo effet d’Eaux (Version Pro) : http://www.youtube.com/watch?v=ky7khEvPTSA
    • (Windows) Project => Asset => (Click D) => Create => Material=> Nommer Water.
    • (Menu) Assets=> Import Package => Water Pro; Flare
    • (Inspect) Material : Water => Shader => FX => Water
    • (Menu) GameObject => Create Other => Plane
    • (Win) Project => Asset => Standard => Water Pro => Sources => Scripts => Water
    • Attacher Material « Water » à Plane.
    • Attacher Script « Water » à Plane.
    • Directionnel Light => Flare => 50 mm Zoom
    • (Inspect) Plane => Water =>
      • Fresnel =>Select : « Water Fresnel »
      • NormalMap => Select : « SmallWave »
      • Reflectiv Color Cube => « Ocean Gradient » (???)
      • Simple Water Horizon Color => « Water Fallback »
  • Video : Audio, Effets Sonores : http://www.youtube.com/watch?v=GLpjppAsW40
  • Video : Audio, Effets Sonores (Official tuto) : http://www.youtube.com/watch?v=1BMJFgK68IU 
    • Sur les caméras => Component => Audio Listener (position de celui qui écoute)
    • Sur un objet => (Menu) Component => Audio => Audio Source
      • Sur objet son : cercles bleus délimite la zone d’audition.
      • Volume Rolloff => diminution son selon distance
      • Pan Rolloff => Diminution effet stéréo avec distance
      • Spread Rolloff => diminution angle 3D en Multi-channel (Suround)
    • Source sons : Bip, laser etc … http://www.bfxr.net/
    • Source de sons : http://www.universal-soundbank.com
      • Capter avec Audacity.
    • 100 mètres en distance max de perception, fonction Log, vérifier dernier point (le plus loin) à 0 !
  • Audio, Effets Sonores : Game Object => Create Other => Reverb Zone.
    • 2 zones Objet : Min dist / Max Dis (transition entre Début et Max effet)
    • Attention : [Free] pas de sauvegarde des réglages « User »
    • Attention : L’effet « traverse les murs ».
  • Audio, Effet sonore : Zone de Silence :
  • Animation :
    • Menu => Window => Animation
    • Sélectionner un item (FPSControler ou MainCamera)
    • Poser une Keyframes => sectionner en cliquant => Positionner la caméra
    • Unity interpole la position entre 2 keyframes en translation (X,Y,Z) et en rotation (X,Y,Z). Les courbes d’interpolation dans l’onglet inférieur (Curves)
    • Samples : défini la vitesse d’exécution => petit = lent
  • Import SweetHome3D :
    • Dans SweetHome3D => Menu  Vue 3D => Export au format .OBJ
    • Sauvegarder dans l’arborescence Unity/Assets/
    • Le composant apparait dans les Assets.
  • Scripting : tuto officiel :
  • La programmation en C# est proche de VBA : « Objet.propriété.sous-propriété… = valeur » en écriture (inverse en lecture) :
  • GameObject.renderer.material.color = Color.red;
  • Référence : classe / propriétés …
    • Les propriétés d’un objet apparaissent dans l’onglet Inspector
      • transform => position => x : transform.position.x
    • Marquer obligatoirement fin de ligne par [;] … comme en PHP.
  • Condition :
    • if(condition){instructions si vrai;}; idem else if; else
  • Loop :
    • while(condition){code}do{code}while(condition); (ne pas oublier le point-virgule)
    • for(type Variable = valeur initial; Variable = valeur fin; Variable incrément){code};
      • for(int i = 0; i < numEnemies; i++) { Debug.Log(« Creating enemy number:  » + i);}
      • Attention les séparateur sont [;]
    • foreach : comme en php pour des array
      • foreach(type NomVar in NomArray){code}
  • Incréement :
    • Variable ++;Variable –;
  • le nom du fichier doit correspondre au nom indiqué dans le fichier à class => Si la Class est :  « Public Class MyClass : MonoBehavior » alors le fichier doit être nommé MyClass.cs (pour un script en C#)
  • Le script, si il est dans le dossier du projet, est trouvé dans l’inspector de l’objet => AddComponent => Soit Search par son nom, soit Scripts (liste).
  • Fonction :
    • Type retourné : int (entier) ; void(=rien); bool (oui/nom); vector3 (position x,y,z);Color;
    • Nom fonction
    • Variables (parameters) entre () avec  type de chaque paramètre
      • float Multiplier(float valeur1)
    • début / fin fonction {}
    • ajout d’une variable : type + nom variable
    • Valeur renvoyé = return (+ nom de la variable de résultat)
    • fonctions réservées :
      • void start() {} : fonction chargée lorsque le script est ajouté à l’objet
      • void update(){} :
  • Debugage : insérer dans le code : debug.log (NomVariable); le résultat apparait dans la fenêtre console, click sur l’icone [!] pour voir les messages.
  • Commentaires : comme php
    • 1 ligne : //
    • multiple : début /* et fin */
  • Les nombres : en virgule flottante = float doivent être suivis de la lettre f
    • float toto = 50f;
  • array :
    • déclaration : type[] NomArray = new type[nb éléments];
  • Scope des variables et des fonctions :
    • Public : variable ou fonction accessible d’un autre script.
      • Seul les variables publiques sont visibles dans l’inspector
      • L’inspector peut les modifier. ces modif sont conservée même après l’arrêt du script.
      • Pour les réinitialiser au lancement du script : indiquer les valeur dans la fonction : void start{};
    • Private : (par defaut) accessible uniquement dans la classe
    • Locales (Variables) :  accessible uniquement dans la fonction où elle sont initialisées.
  • Appel de fonctions externes [Scope & Access]:
    • uniquement des fonctions déclarées publiques :
      • NomDeLaClasse.NomFonction (Variables);
    • Déclaration en en-tête de classe : Private ClasseInterne ClasseAppelée;
    • Récupération dans le corps d’une fonction de ClasseInterne:
      • initialisation : ClasseInterne = New ClasseApplelée();
        • ClasseInterne.FonctionOuValeurdeClasseAppelée (du type défini dans ClasseAppelée)
  • Initialisation [Awake & Start] :
    • Awake(); initialisation même si le composant n’est pas activés dans l’Inspector (pour initialiser des scripts qui lui font référence et qui eux sont activés).
    • Start(); initialisation si le composant est activé dans l’Inspector.
    • update(); tourne à chaque frame.
    • fixedupdate(); tourne à intervalle de temps fixe.
  • Calcul Vectoriel [Vector Math]
  • [GetComponent]
    • permet de lire/écrire la valeur des variables d’un autre composant (objet, script, etc…)
    • Déclaration : Public/Private NomObjetAppelé NomObjetLocal;
    • récupération :  NomObjetLocal = GetComponent<NomObjetApplelé>();
    • Si NomObjetAppelé à un paramétre de nom Param, alors on le récupère avec :
      • NomObjetLocal.Param
  • Activer Composant :
    • MyVar (du même type que celui renvoyé par le composant)= GetComponent<NomComposant>();
    • MyVar.enabled = true ou false; // une fois
    • MyVar.enabled = !MyVar.enabled; // fait un switch true<=>False
    • Rappel : les scripts sont eux-même des composants … on peut donc les désactiver.
    • Dans une hiérarchie d’objets Parents & Enfants, désactiver le Parent fait disparaitre l’Enfant … mais celui-ci reste cependant « Actif »
      • on peu savoir si un composant est désactivé spécifiquement ou parce que sa hiérarchie est désactivé.
    • Désactiver un Objet : NomObjet.SetActive(false);
  • [Translate & Rotate] & [deltatime] :
    • transform.Translate(new Vector3(x,y,z));
      • a chaque frame l’objet est déplacé de x,y,z unité.
      • Mais comme chaque frame prend plus ou moins de temps à être rendue, la vitesse peu paraitre variable, deltatime donne l’inverse du temps en seconde de création de la frame.
      • multiplier par « time.deltatime » permet de passer en vitesse en m/s constante.
      • Tuto donne une script complet sur la gestion du mouvement de la vitesse et de la rotation.
      • Applicable aux corps solides => pas aux effets
  • [Look At] :
    • permet de diriger en permanence le z d’un objet vers un autre.
      • Caméra qui suit un objet par exemple.
      • transform.LookAt(target);
  • [Lerp] :
    • Linear Interpolate : TypeVarFromTo.lerp(From;To;Time);
    • TypeVarFromTo : Vector3 (vecteur position) ; Mathf (float);Color;
  • [Destroy]
    • supprime une hiérarchie, un Objet, un composant.
    • destroy(Objet/composant, délais en secondes);
  • [GetButton & GetKey]
    • recevoir les valeurs passées par l’utilisateur : classe input
    • Les touches sont prè-nommer : keycode.space; up; down; A;B….
    • On peux appeler à la place des touches, des fonctions dites Button, qui réfèrent des actions : « jump », « run » … et modifier les touches correspondantes Menu=>Edit=> ProjectSetting=> Input
    • Etats Booléens (True/False) : GetKeyDown (enfonce/1frame); GetKey (maintien);GetKeyUp (relache/1frame) (idem avec GetButton)
    • Différences ? GetKey interroge une touche précise; GetButton interroge la touche programmée pour l’action.
  • [GetAxis]
    • recevoir les valeurs passées par l’utilisateur : classe input
    • retourn un Float compris entre -1 et 1 avec une valeur de repos à 0
    • Sensitivity détermine la vitesse à laquelle la valeur atteint -1 ou 1
    • Gravity détermine la vitesse à laquelle la valeur revient à 0
    • Dead : la sensibilité au neutre du joystick
  • [OnMouseDown]
    • idem OnClic VBA : Void OnMouseDown();{code};
    • Script d’exemple intéressant avec Rigidbody + action + gravité : une porte est éjectée au clic et rebondie.
  • [Data Type] idem ByVal & ByRef de VBA
    • Il faut indiqué à la création le type de variable : en Value comme en Reference.
    • Value
      • int; float;double;bool;char;
      • structs : vector3;Quaternion
    • Reference
      • Classes
        • transform
        • gameobject
      • Si l’on récupère en local la valeur des variables (Value) d’un objet, changer cette valeur local ne modifie pas l’objet appelé.
      • Si l’on récupère l’adresse (Reference) de l’objet et que l’on en fait une variable, alors changer la variable local change l’objet distant.
  • Programation : Une fonction => 1 programme à part : ne pas tout mettre dans le même => important de bine concevoir ce blocs de fonctions => ils seront souvent réutilisés.
  • [Class & Constructor]
    • Class = catégorie (ex : position, contrôle, munitions, ….)
    • les éléments sont définis par un Constructor (ces propriétés et le type de valeurs qui les définissent)
    • Un même élément peut être définis de manière différente (nb d’arguments & leur type). A l’usage les valeurs qui sont passées (type et nombre d’arguments) permette de savoir quel format utiliser.
  • [instantiate]
    • faire générer par code des objets complets (prefabs)
    • Déclaration de l’objet en Public/Private RigidBody NomObjet;
    • Déclaration de son instance en RigidBody NomInstance;
    • NomInstance = Instantiate(NomObjet ,(attention Virgule), position, rotation) as RigidBody;