- Unity : Tutos officiels : Menu principal : http://unity3d.com/learn/tutorials/modules
- Unity : Tutos officiels : Scripting : http://unity3d.com/learn/tutorials/modules/beginner/scripting
- 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 :
- Couper tous les sons quand on arrive dans une zone : semble ne se faire qu’en script (cf exemple de code):
- 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.
- Les propriétés d’un objet apparaissent dans l’onglet Inspector
- 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.
- Public : variable ou fonction accessible d’un autre script.
- 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 : ClasseInterne = New ClasseApplelée();
- uniquement des fonctions déclarées publiques :
- 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
- transform.Translate(new Vector3(x,y,z));
- [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);
- permet de diriger en permanence le z d’un objet vers un autre.
- [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.
- Classes
- 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;