D.O.M

a marqué ce sujet comme résolu.

Présentation de l'auteur

Bonjour à tous. Je suis Froll, lillois d'adoption, 28 ans et informaticien c# de métier. J'utilise le même pseudo sur les forums donc globalement si vous avez déjà croisé ce pseudo, il y'a de forte chance que ce fut moi. Je viens aujourd'hui pour vous présenter mon projet sur lequel je travaille depuis à peu près 8 mois :D.O.M

Présentation du projet

D.O.M est un jeu de simulation spatial / gestion se déroulant dans un espace ouvert de style SteamPunk. Le jeu est fortement inspiré de 2 jeux:

  • sid meier's pirates : pour l'univers et l'époque

  • Freelancer : pour le gameplay

Le joueur prend le contrôle d'un bateau de l'espace et doit trouver sa place dans un univers où il peut commercer, s'engager pour des nations, devenir pirate et attaquer des stations. Le joueur pourra prendre possession de bases spatiales enemies et ainsi créér son propre empire.

Origine du projet

L'envie de faie ce jeu vient principalement de deux points:

  • Déjà l'envie de faire un projet personnel, de le mener à bien de bout en bout, et le finir pour une fois. Comme beaucoup je suppose, j'ai commencé beaucoup de projets, très peu ont atteint un stade final. Faire une présentation sur ce forum est également une forme de motivation à amener ce projet à terme, car inconsciemment on s'engage à apporter des nouvelles recemment et présenter l'avancé de son travail.

  • Le fait d'avoir été souvent frustré par des jeux à la troisième personne qui proposent énormément de gameplay, et qui pourrait être bien meilleur avec un peu de gestion, mais finalement la gestion n'est jamais vraiment envisagé. Dernièrement c'est gta 5 qui m'a un peu déçu avec cela.

Technologie

Le projet est développé sous Unity 5.0 et Blender 2.75. Je suis seul pour la création graphisme et la programmation. Mon but est de toucher à tout afin de ne pas me trouver d'escuse en cas d'échec, et apprendre un peu tous les jours. 

Avancement

Actuellement du coté graphisme, d'un niveau fini j'ai:

  • deux bateaux : l'Interceptor et le S.O.S

  • des tourelles

  • deux type de moteurs

  • une skybox pour l'immersion du joueur

  • une dizaine de texture pour un D.A cohérent

Au niveau programmation j'ai:

  • le gameplay pour le contrôle du vaisseau, qui peut être contrôlé au clavier ou à la souris

  • des tourelles au control automatic ou manuel

  • un control de la caméra qui peut être automatic ou manuel

  • une IA (très basique pour l'instant, c'est surtout pour tester le gameplay en combat)

  • une gestion des dégats sur les bateaux

Tout est de moi, des mesh, en passant par la programmation et les textures. Je ne voulais pas faire intervenir quoique ce soit d'exterieur, notemment pour le graphisme, afin de garder une certaine cohésion même si c'est loin d'être du graphisme pro.

Quelques images des 2 bateaux:

avant du S.O.S

arrière du S.O.S

avant de l'interceptor

arrière de l'interceptor

En savoir plus

2 vidéos : la première pour montrer le gameplay de navigation du bateau, la seconde pour montrer la gestion des dégats et le gameplay d'attaque pour les combats.

(Je m'excuse d'avance de la piètre qualité des vidéos, je n'ai pas encore trouvé un moyen pour faire des captures de haute qualité)

Le mot de la fin:

Le site web du projet : D.O.M

Voilà, vous avez sous les yeux tout mon travail de ces 8 derniers mois. J'avance à un rythme assez lent , ne bossant que le week end, du coup l'avancement sera assez tranquille ^^ Ha oui, D.O.M c'est juste 3 lettres au hasard qui ne veulent rien dire, C'est juste un nom de projet provisoire.

Merci d'avoir pris le temps de me lire, tout commentaire est le bienvenu! :)

+13 -0

Bonjour, petit point sur l'avancé de ce week end. Je n'ai plus touché au code, j'ai vraiment voulu avancer sur les assets de station spatiale, voici donc l'état actuel:

Accueil de la station spatiale

Voilà, c'est l'état ou je me suis arrêté pour l'instant car je suis enfin un peu satisfait ( pas énorme, mais j'ai pas honte de la montrer au moins).

Ceci sera l'Accueil de la station, station qui sera composée au minimum de trois parties (accueil, port, marché), donc il y'a encore énormément de travail. Voilà plusieurs mois que je planche là dessus, entre croquis et modélisations ratées, j'ai eu beaucoup de mal à créér quelque chose dont le résultat me convienne, et dont le contenu est modulable. D'ailleurs il serait intéressant peut être que je montre un jour tous les croquis et modélisations que j'ai fait pour au final les jeter à la poubelle, afin de montrer combien ce processus à été compliqué.

Rien que pour le rocher je pense avoir recommencé au moins 5 ou 6 fois sa modélisation, et autant d'essais sur sa texture, avant de m'arrêter à ce résultat.

Je parle de contenu modulable car j'aimerais beaucoup que le joueur puisse améliorer sa station en lui faisant passer des niveaux ( je pense à 3 niveaux pour l'instant), et que ces différents niveaux soient identifiables visuellement (avec une accueil plus grande, composée de plus d'assets). Il reste pas mal de choses qui ne me conviennent pas, que j'avais mal pensé au préalable (faute d'être incapable de faire de bon croquis), mais bon là je crois qu'il est temps de s'arrêter sur une version, sinon je ne passerais jamais à autre chose.

Donc voilà, là c'est juste visuel, il n'y a aucun script derrière, aucun gameplay possible, c'est juste pour montrer un peu la direction artistique de la chose.

+5 -0

Très joli projet, qui je l'espère aboutira à du concret (démo jouable pour commencer ?)

Par contre, es vaisseaux et bâtiments spatiaux sont en bois ? C'est un peu bizarre la texture pour des vaisseaux dans l'espace… Si c'est du bois je ne pense pas que ça soit plausible, mais bon j'y connais pas grand chose en vrai…

Tu souhaites avancer tout seul, ou des personnes qui apprécient peuvent te rejoindre ? (pour ma part je n'y connais rien, je dis cela pour d'autres…)

Par contre, es vaisseaux et bâtiments spatiaux sont en bois ? C'est un peu bizarre la texture pour des vaisseaux dans l'espace… Si c'est du bois je ne pense pas que ça soit plausible, mais bon j'y connais pas grand chose en vrai…

Je crois que c'est un peu le style Steampunk qu'il veut donner :)

Ah ok, je ne connais pas vraiment le style steampunk, et de ce que j'ai pu voir, ce n'était pas tout à fait comme ça… Mais ça reste chouette de sortir des sentiers battus !!

Sam Oz

Non, c'est vrai, ce n'est pas tout à fait ça. Le style Steampunk emprunte beaucoup à la révolution industrielle ,aux machines à vapeur et à l'époque victorienne. Ce n'est pas tout à fait ce que je fais, mais c'est ce qui s'en rapproche le plus.

+0 -0

Tu souhaites avancer tout seul, ou des personnes qui apprécient peuvent te rejoindre ? (pour ma part je n'y connais rien, je dis cela pour d'autres…)

Bonjour,

Pardonne moi je n'avais pas bien vu ton message. Je souhaite avancer tout seul comme tu dis, et ce pour plusieurs raisons. La principale étant que je prends beaucoup de plaisir à toucher à tous les domaines, mais je pense aussi que je suis un peu effrayé à l'idée de devoir diriger une équipe (plus de une personne, j'appel ça une équipe :) ), et je préfère donc m'éviter ce stress pour l'instant.

Aujourd'hui j'ai continué la production d'asset pour la station spatiale, j'ai donc travaillé sur le "Port" spatial. Mais j'ai un peu de mal, ce que je fais ne me satisfait pas tout à fait, je n'arrive pas à être aussi satisfait de mon travail, comme je l'avais été avec l'accueil par exemple. Je me dit du coup que ça pourrait être intéressant d'avoir un avis exterieur. J'ai créé deux versions, qui se ressemblent globalement mais diffèrent dans les détails et dans la suite que pourrait prendre la conception. J'aimerais avoir vos avis la dessus.

Port spatial - Version numéro 1

Port spatial - version numéro 2

Voilà un peu mon dilemme d'aujourd'hui. Mine de rien ce sont deux conceptions différentes, et en fonction de ce que je choisis cela aura des répercussions sur la suite. Du coup j'aimerais bien savoir ce que vous en pensez, si vous préférez la première version, la deuxième, un mixte des deux, ou bien aucune des deux et qu'il faut que je retourne travailler :)

Voilà voilà.

+2 -0

C'est sympa, bon honnêtement visuellement ça mériterait d'être plus travaillé (surtout du steampunk into the space !!!!) mais je pense que tu en à tout à fait conscience !

Petit conseil pour t'aider, cherche des réf. sur Art station, Deviant Art, Flickr ou d'autre site d'image et sélectionne des morceaux pour en faire des assets/props ;) . Voila maintenant j'attends la suite :D .

je prefere la 2eme perso ;)

sinon, c'est un super projet, j'adore !

Merci pour ton avis!

C'est sympa, bon honnêtement visuellement ça mériterait d'être plus travaillé (surtout du steampunk into the space !!!!) mais je pense que tu en à tout à fait conscience !

Merci pour ton commentaire. Je pense que quand on dit à un graphiste "fais moi du steampunk dans l'espace", il doit sauter de joie et faire des trucs de fous, et mes rendus doivent un peu decevoir de ce point de vue. Je fais dans la limite de mes moyens, mes graphismes ne sont pas tout à fait à la hauteur de ce que j'imaginais, mais j'ai atteint un niveau qui me conviens, même si c'est pas tip top.

Mais ta remarque correspond tout à fait à ce que moi même je pense de mes graphismes!

Concernant mon travail, j'ai finalement opté pour la seconde version du port spatial. Après une nuit de sommeil et un peu de recul sur mon travail, le choix m'a soudain paru évident.

J'ai donc pu avancer sur la 3ème et dernière étape de ma station spatiale : le marché spatial!

le marché spatial

Voilà, ceci représente une bonne avancé et maintenant je vais pouvoir me concentrer sur autre chose. Il va falloir intégrer tout ce graphisme dans Unity, créér les prefabs, créér les groupes de prefab, et créér le script de gestion de niveau de la station. Je rappelle que chaque partie de la station (accueil, port, marché) doit pouvoir évoluer en 3 niveaux, et que chaque niveau est différent graphiquement du niveau précédent. C'est donc là dessus que je vais travailler maintenant.

voilà pour cette semaine :)

+1 -0

Bonjour,

Quelques nouvelles pour parler du travail de ces 2 dernières semaines:

  • refonte des prefabs

  • creation d'un parser xml pour le placement des assets dans le monde (que les stations spatiales pour l'instant)

  • mise en place du script d'évolution des stations spatiales en 3 niveaux

  • mise en place d'un titre pour les stations (j'hésite à créér ma propre font, mais ça me semble beaucoup de travail pour juste ça)

  • mise en place d'un champ de force pour les stations (script + texture)

  • création d'un script pour le LOD

  • création d'un niveau 1 de LOD pour chacun des assets

Essentiellement du travail sur le LOD, et je n'en suis pas satisfait (je perçois quelques clignotements parfois, c'est assez gênant). Unity a son propre composant LOG Group mais je ne l'ai pas trouvé très pratique (il faut indiquer un gameobject enfant pour chaque niveau de LOD, je ne vois pas bien comment faire fonctionner cela avec les animations et les scripts déjà présents, notemment pour les stations qui sont évolutives). C'est dommage car il propose des transitions linéaires entre les niveaux de LOD, et se charge également de la disparition de l'élément avec un fade.

Y'a encore du travail à faire donc, j'ai fait quelques tests de performance et c'est moins intéressant que ce que je m'attendais. Sur une scène assez compacte, avec des bateaux alignés, le rendement est nul (même nombre de fps que le LOD soit activé ou non), par contre sur une scène plus aérée, avec des distances plus grandes entre les assets, les performances sont encourageantes. C'est logique, plus la distance sera élevée, plus le LOD pourra être efficace, maintenant il faut trouver le bon paramétrage pour éviter un clipping trop visible (actuellement c'est pas terrible).

Désolé, j'ai rien de graphique à montrer cette semaine :)

+1 -0

Voici des images pour montrer l'évolution des éléments de station spatiale:

L'accueil

Le port

Le marché

Actuellement je cherche à créér des assets graphiques afin de varier le décor et de faciliter la navigation du joueur. en effet les stations étant graphiquement les mêmes en dehors de leur niveau d'évolution, j'ai besoin de repères visuels afin que le joueur sache facilement où il est et où se diriger (en dehors d'une minimap). Pour cela je me suis mis en tête de créér de petites lunes facilement identifiables (je pense en créér 5 ou 6). Mais pour l'instant mes premiers jets ne sont pas satisfaisants, et je n'ai donc rien à montrer là dessus. Je fais beaucoup d'essai différent mais rien ne m'a encore satisfait.

Ça a l'air sympathique tout ça. Félicitations :).

Ikyushii

Merci :)

Mes vignettes sont un peut petite ; est globalement l'éclairage est très sombre. mettre en place quelques rim light serait pas du luxe, on perd la station dans le noir étoilé sinon.

stilobique

Ce n'est pas bête, et j'avoue que je n'y avais pas pensé (j'avais un peu repoussé ce problème de "trop sombre" à plus tard). Je ferais des tests en modifiant l'emissive color du matérial pour voir comment ça rend.

Petite image pour montrer les dimensions entre les assets:

un interceptor amarré à une station

On peut donc voir une station de niveau presque 3 (accueil niveau 3, port niveau 3 et marché niveau 2) avec un interceptor amarré au dock. Et dans le fond on voit un essai de lune.

Je viens de passer les 3 dernières semaines à faire plusieurs assets de lune sans être parvenu à un résultat satisfaisant, j'ai donc décidé de garder 2 lunes qui sont pas trop mal, je remets à plus tard pour le reste (rappel, j'aimerais avoir 6 lunes au total). Je ne peux pas me permettre de passer plus de temps là dessus sans risquer une baisse de motivation sur le projet général, je vais donc m'atteler à une autre tâche à partir de maintenant.

Cette semaine j'ai travaillé sur un bras mécanique afin qu'un vaisseau puisse s'amarrer à une station. Je n'ai fait que l'asset et son animation, il me reste à implémenter le pilote automatique afin que le bateau se dirige vers le bras et active l'animation.

Comme le but de ce projet est complètement pédagogique pour moi, et que j'ai rencontré quelques difficultés à faire ce bras d'amarrage, je me suis crée un tuto-mémo afin de garder une trace de la réalisation de tout ça:

Informations préléminaires

Blender: la version utilisée dans ce tutoriel est la 2.75a

Unity : la version utilisée dans ce tutoriel est le 5.0

Introduction

Je vais détailler comment créer une animation d'un bras retractable très simple sous blender, et comment l'importer sous unity. L'animation consiste à déplier le bras en un temps d'une seconde, et à le replier dans un second temps d'une seconde.

Première partie: création de l'animation sous Blender

Le mesh

Ce sera un emboitement de trois meshs, et l'animation se fera par une translation de deux des trois meshs. Ici, j'utilise un mesh dont la fonctionnalité in-game est de gérer l'amarrage d'un vaisseau à une station spatiale :

bras pour amarrage

Le mesh le plus petit doit être l'enfant du mesh du milieu, qui doit lui même être le fils du mesh le plus grand. Pour simplifier le travail, j'ai décidé de les nommer:

  • StationDockSystem : le mesh le plus grand, celui qui contient les deux autres

  • StationDockSystemPart1 : le mesh du milieu, qui est enfant de StationDockSystem

  • StationDockSystemPart2 : le mesh le plus petit, qui est enfant de StationDockSystemPart1

Dans la fenêtre représentant la hierarchie de la scène (outliner en anglais), on doit donc avoir une hierarchie de ce style:

imageHierarchie

Insertion des Keyframes

Une keyframe est une clé qui gardera en mémoire un ou plusieurs attributs du mesh séléctionné (location, rotation ou taille) à un temps T de la timeline. Insérer deux keyframes à des temps différents, qui ont verrouillé la position d'un mesh, permet de gérer le déplacement de cet objet entre les deux keyframe.

Avant de commencer à créer les keyframe, il faut veiller à ce que les trois meshs soient dans une position initiale, pour notre exemple il doivent être imbriqués les uns dans les autres.

image position initiale

Il faut faire attention à ce que les trois mesh soient à leurs positions, rotations et tailles initiales. Pour celà, vérifier que les meshs sont au centre de la scène, séléctionner un par un les mesh, faire Ctrl+a et sélectionner les options position, rotation et taille. Cela permet d'appliquer les transformations aux meshs. Si celà à modifier le mesh global, corriger et recommencer l'opération. C'est très important car sinon l'animation ne sera pas bonne, cela peut avoir des conséquences très embêtantes.

Ensuite sur la fenêtre de la Timeline, positionner la Timeline à la keyframe 0, sélectionner le mesh du milieu ( StationDockSystemPart1) et appuyer sur la touche i > location. Répéter l'opération en sélectionnant cette fois le plus petit des mesh.

Puis passer à la keyframe 24 sur la Timeline. Appuyer sur la touche 1 du pad de votre clavier afin de placer la caméra dans le bon angle pour bien voir les modifications, et séléctionner le mesh le plus petit. Appliquer lui un déplacement de la longueur souhaitées sur l'axe X (correspondant aux mouvements de ce mesh dans l'animation), et ajouter une nouvelle keyframe (i > location).

insertion KeyFrame

Mettre la valeur de keyframe à 48 maintenant, et repositionner le mesh le plus petit à 0,0,0. Insérer une nouvelle keyframe.

Répéter cette opération avec le mesh du milieu.

On doit maintenant avoir une Timeline ressemblant à l'image ci-dessous, pour le mesh du milieu et le mesh le plus petit:

TimeLine

Dans la fenêtre DopeSheet, renommer les actions en ActionAmarrage1 pour le mesh du milieu, et ActionAmarrage2 pour le mesh le plus petit. C'est important pour bien les récupérer plus tard dans Unity. On peut voir que les actions ne sont que sur les positions des meshs (pas de modification de taille ou de rotation).

DopeSheet

Si tout a bien été fait, à la frame 24 le mesh doit ressembler à celà:

image position Intermediaire

Maintenant cliquer sur play, et on doit voir l'animation.

animation blender

Les transitions entre les clefs sont initialement configurées pour que la transition soit de mode interpolation de bézier, c'est ça qui donne cet effet très smoothy, et celà convient parfaitement dans cette animation.

Importation dans Unity

Blender et Unity ne sont pas les meilleurs amis du monde, notemment pour ce qui concerne les axes. Pour Blender, l'axe de la profondeur c'est Y, alors que sous unity c'est Z. Et rien que celà, ça rend les choses un peu difficiles.

La solution que j'ai trouvé n'engage que moi. Voilà ce que je fais:

  • Séléctionner le mesh parent et placer sa rotation à -90, 180, 0. Faire Ctrl+a pour appliquer cette rotation.

rotation pour exportation

  • Séléctionner les trois meshs et cliquer sur File > export > fbx.

  • Dans la fenêtre d'export, séléctionner "selected object", pour exporter que les objets séléctionnés

  • Désélectionner "Apply Unit"

  • Séléctionner "Armature", "Mesh", "Other"

paramètrage fenêtre exportation

  • Exporter

Gestion de l'animation sous Unity

Placer le fbx dans le dossier Asset du projet.

Ensuite, dans Unity, séléctionner l'objet dans le dossier projet et regarder la fenêtre de l'inspector. Dans l'onglet "Rig", placer "Animation type" à "Legacy", et "Generation" à "Store in Root".

fenêtre rigging

Dans l'onglet "Animation", on doit voir plus d'animations que celles que l'on a créée. En fait il s'agit de plusieurs fois la même animation, découpée de différentes manières. Tester les toutes et garder les deux qui correspondent à celles que l'on a créée, et renommer-les.

fenêtre configuration animation

Ensuite dans la fenêtre "Project", créer un nouveau script "DockController" et placer le code suivant:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
using UnityEngine;
using System.Collections;

public class DockController : MonoBehaviour {
#region ENUM

  /// <summary>
  /// état de l'objet
  /// </summary>
  public enum ETAT_DOCK{
      INITIALE = 0,
      AMARRAGE = 1,
      AMARRE = 2,
      DESAMARRAGE = 3,
  }
  
  #endregion
  
  #region PRIVATE ATTRIBUTS
  /// <summary>
  /// Animation de l'obet
  /// </summary>
  private Animation _anim;

  /// <summary>
  /// etat de l'objet
  /// </summary>
  private ETAT_DOCK _etat;
  
  #endregion

  #region PUBLIC ATTRIBUTS

  /// <summary>
  /// etat de l'objet
  /// </summary>
  public ETAT_DOCK Etat {
      get {
          return _etat;
      }
      set {
          Log.AfficherMessage("DockControl -- "+this.gameObject.name+" change etat: "+value, Log.TypeMessage.INFO);
          _etat = value;
      }
  }

  #endregion
  
  #region PRIVATE ATTRIBUTS MODIFIABLE

  #endregion
  
  #region FRAMEWORK METHODS
  // Use this for initialization
  public void Start () {

      this.Initialisation();
  }
  
  // Update is called once per frame
  public void Update () {
      
      switch(this._etat){
          case ETAT_DOCK.INITIALE : break;
          case ETAT_DOCK.AMARRAGE : this.Amarrage(); break;
          case ETAT_DOCK.AMARRE : break;
          case ETAT_DOCK.DESAMARRAGE : this.Desamarrage(); break;
          default : break;
      }

      if(Input.GetKeyDown("u")){
          this.DeclencherAmarrage();
      }
      if(Input.GetKeyDown("i")){
          this.DeclencherDesmarrage();
      }
  }
  
  // Update is called once per frame
  void FixedUpdate () {

  }
  
  #endregion
  
  #region PUBLIC METHODS

  /// <summary>
  /// Declancher l'action d'amarrage
  /// </summary>
  public void DeclencherAmarrage(){
      this.Etat = ETAT_DOCK.AMARRAGE;
  }

  /// <summary>
  /// Declancher l'action de desamarrage
  /// </summary>
  public void DeclencherDesmarrage(){
      this.Etat = ETAT_DOCK.DESAMARRAGE;
  }

  /// <summary>
  /// Initialisation des animations
  /// </summary>
  public void Initialisation(){
      this._anim = this.GetComponent<Animation>();
      this.Etat = ETAT_DOCK.INITIALE;
      if(this._anim != null && this._anim["ActionAmarrage1"] != null){
          this._anim["ActionAmarrage1"].wrapMode = WrapMode.Once;
          this._anim["ActionAmarrage1"].speed = 1;
          this._anim["ActionAmarrage1"].layer = 1;
      }
      if(this._anim != null && this._anim["ActionAmarrage2"] != null){
          this._anim["ActionAmarrage2"].wrapMode = WrapMode.Once;
          this._anim["ActionAmarrage2"].speed = 1;
          this._anim["ActionAmarrage2"].layer = 2;
      }
  }

  
  #endregion
  
  #region PRIVATE METHODS

  /// <summary>
  /// Action amarrage
  /// </summary>
  private void Amarrage(){
      if (this._anim != null && this._anim.IsPlaying("ActionAmarrage1") == false && this._anim.IsPlaying("ActionAmarrage2") == false){
          this.PlayAnimation();
      }
      if(this._anim != null && this._anim["ActionAmarrage1"].normalizedTime  >=  0.48f){
          this.PauseAnimation();
          this.Etat = ETAT_DOCK.AMARRE;
      }
  }
  
  /// <summary>
  /// Action desamarrage
  /// </summary>
  private void Desamarrage(){
      if (this._anim != null && this.animationEstStoppee() == true){
          this.RestartAnimation();
      }
      if(this._anim != null && this._anim["ActionAmarrage1"].normalizedTime  >=  0.98f){
          this.StopperAnimation();
          this.Initialisation();
      }
  }

  /// <summary>
  /// Pause les animations
  /// </summary>
  private void PauseAnimation(){
      this._anim["ActionAmarrage1"].speed = 0;
      this._anim["ActionAmarrage2"].speed = 0;
  }

  /// <summary>
  /// Stoppe les animations
  /// </summary>
  private void StopperAnimation(){
      this._anim.Stop("ActionAmarrage1");
      this._anim.Stop("ActionAmarrage2");
  }

  /// <summary>
  /// redémarre les animations apres une pause
  /// </summary>
  private void RestartAnimation(){
      this._anim["ActionAmarrage1"].speed = 1;
      this._anim["ActionAmarrage2"].speed = 1;
  }

  /// <summary>
  /// Joue les animations
  /// </summary>
  private void PlayAnimation(){
      this._anim.Play("ActionAmarrage1");
      this._anim.Play("ActionAmarrage2");
  }
  
  /// <summary>
  /// indique si les animations sont stoppées
  /// </summary>
  /// <returns><c>true</c>, if stoppe was animationested, <c>false</c> otherwise.</returns>
  private bool animationEstStoppee(){
      return this._anim["ActionAmarrage1"].speed == 0 &&  this._anim["ActionAmarrage2"].speed == 0;
  }


  #endregion
}

Créer un prefab à partir de l'objet, et ajouter le script DockController sur le prefab. Placer le prefab dans la scène.

La principale difficulté dans ce code consiste à faire fonctionner les animations en même temps. Par défaut, deux animations sur un même objet ne peuvent se jouer en même temps, la dernière à être appelée s'éxècutera seule. Pour remédier à celà, il faut préciser un layer différent aux deux animations:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
/// Initialisation des animations
  /// </summary>
  public void Initialisation(){
      this._anim = this.GetComponent<Animation>();
      this.Etat = ETAT_DOCK.INITIALE;
      if(this._anim != null && this._anim["ActionAmarrage1"] != null){
          this._anim["ActionAmarrage1"].wrapMode = WrapMode.Once;
          this._anim["ActionAmarrage1"].speed = 1;
          this._anim["ActionAmarrage1"].layer = 1;
      }
      if(this._anim != null && this._anim["ActionAmarrage2"] != null){
          this._anim["ActionAmarrage2"].wrapMode = WrapMode.Once;
          this._anim["ActionAmarrage2"].speed = 1;
          this._anim["ActionAmarrage2"].layer = 2;
      }
  }

Lancer le jeu et appuyer sur la touche "u" : l'animation d'amarrage doit se lancer, le bras mécanique s'active. Appuyer sur "i" et l'animation se poursuit, avec cette fois le bras qui se rétracte.

Et voilà, une petite animation toute simple pour amarrer un vaisseau à une station.

le bras d'amarrage de la station

Voilà pour le mémo. D'ailleurs vous aurez remarqué que je crée deux animations pour le bras d'amarrage, car j'ai deux blocs qui se déplacent. Si quelqu'un sait comment faire cela en une seule animation, je suis preneur :).

+1 -0

[…]

Voilà pour le mémo. D'ailleurs vous aurez remarqué que je crée deux animations pour le bras d'amarrage, car j'ai deux blocs qui se déplacent. Si quelqu'un sait comment faire cela en une seule animation, je suis preneur :).

froll

Tu peut pas faire juste 1 animation de mouvements avec 2 keyframe puis utilisé un Inverse ?

Je pense que je me suis mal exprimé.

Les 2 animations, ce ne sont pas "dépliage du bras" et "repliage du bras". Les 2 animations sont en fait 1 pour chacun des meshs qui translate:

  • une pour le mesh du milieu

  • une pour le mesh le plus petit

C'est d'ailleurs pratiquement la même animation pour mes deux meshs. Quelques soient mes manipulations, à chaque fois Blender m'ajoutait 2 actions dans la DopeSheet, là où moi j'aurais voulu n'en avoir qu'une seule, afin que le code soit plus simple sous Unity après.

+0 -0

Bonjour,

J'ai décidé d'ouvrir un site web pour centraliser l'avancé de mon travail. Le site web de concerne pas uniquement D.O.M, j'avais envie d'un endroit où je pouvais partager toutes les connaissances que m'a apporté ce projet, et où je pourrais également présenter de futurs projets. Du coup pour l'instant c'est du 100% D.O.M, mais si l'envie me prend de créer un post sur autre chose, rien ne m'en empêche.

Donc voilà, maintenant, en plus de ce sujet,je dispose d'un autre endroit où je peux partager mon travail : D.O.M

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte