横扫天下会 最高指挥官

 找回密码
 注册
查看: 2179|回复: 16

最高指挥官MOD基础开发教程(法语,转载)

[复制链接]
发表于 2012-11-25 14:48 | 显示全部楼层 |阅读模式
本帖最后由 MAXUF 于 2012-11-25 22:26 编辑

最高指挥官MOD创建环境准备:
前言:
Mise en place:
Avant de se mettre à moder, on va commencer par faire le tour des outils proposés par supcom pour débugger, analyser, décrypter le code que nous lui feront lire par la suite. Afin de nous rendre la tâche encore plus aisée il serait également de bon ton de mettre en place un environnement de développement adéquat et de s'équiper de quelques logiciels bien pratiques. A partir de maintenant, j'assume que vous êtes sous Windows et que le jeu est installé.
/!\ Si vous utilisez une version ultérieure à Windows XP il vous faudra adapter les chemins d'acces en conséquence.
有用的软件:
Logiciels utile:
Voici la liste du matériel indispensable!
● Un éditeur de texte. Même si Notepad peut suffir, je conseille l'utilisation d'un éditeur à coloration syntaxique tel que Notepad++.
● Un compresseur/décompresseur de fichiers. Winrar convient parfaitement.
● Un logiciel de retouche d'image sachant gérer le format .dds tel que The gimp et son plugin.
● Un logiciel de modélisation 3D. Blender est idéal. Il doit être accompagné de ses scipts d'import/export pour le format .scm.

(!) Les scripts s'installent dans le dossier Blender\.blender\scripts
准备工作:
Préparatifs:
Allez au boulot, c'est ici que tout commence!
1. Créer un dossier "mod" dans le répertoire d'installation du jeu
  1. C:\Program Files\THQ\Gas Powered Games\Supreme Commander - Forged Alliance
复制代码
ou si vous voulez moder avec Vanilla :
  1. C:\Program Files\THQ\Gas Powered Games\Supreme Commander
复制代码
c'est dans ce dossier que tout les mods seront placés. Lorsqu'un mod y est présent, une entrée supplémentaire est créée dans le gestionnaire de mod du jeu.
2. Créer un raccourci pointant vers le répertoire d'installation du jeu. Le placer en un endroit facile et rapide d'accès (bureau, menu démarrer etc.). Etant donné le nombre de fois où nous allons nous y rendre ce raccourcis n'est pas un luxe, il évitera les prises de tête avec l'arborescence du pc.
3. Créer un dossier spécial modding sur son ordinateur. Il contiendra tout ce qui se rapportera à la création de mod. Prévoyez donc un peu de place à cet effet car il va vite prendre du volume. Cette étape peut paraître triviale mais vu le nombre faramineux de fichiers nécessaires, posséder un dossier spécial évite le fouilli et gagne du temps.
4. Copier les archives du jeu contenant les unités, textures, projectiles et effets et les coller dans votre dossier de modding.
  1. C:\Program Files\THQ\Gas Powered Games\Supreme Commander - Forged Alliance\gamedata
复制代码
Soit respectivement les archives nommées units.scd, textures.scd, projectiles.scd et effects.scd. Décompressez les ensuite avec Winrar.
5. Se rendre dans le menu options du jeu. Dans l'onglet Vidéo régler l'entrée Adaptateur principal à Fenêtré. Cette étape permet entre autre à tous les outils de débogage du jeu de s'afficher correctement.
Voilà la mise en place est terminée il ne reste plus qu'a jeter un oeil aux outils de débuggage du jeu puis il sera temps de passer aux choses sérieuses.
调试工具:
Outils de débogage:
Voici les principaux outils mis à notre disposition pour déboguer un mod :
console:

menu construction:

AIT-F9:

F9:

MAJ-F8:

La console: Permet d'accéder en ligne de commande aux fonctionnalités interne du jeu. Indispensable pour débugger.
Le menu de construction: Avec cette fenêtre on peut faire apparaitre n'importe quelle unité n'importe où sur le champ de bataille. On peut le faire pour notre faction mais aussi pour la faction ennemie ou les civiles. C'est donc un outil indispensable pour tester ses unités de long en large et en travers. Les unités choisies apparaissent aux coordonnées du curseur avant l'appel de la fenêtre.
Le débogueur: Jamais utilisé.
Le journal:Chaque événement dans le jeu est consigné dans ce journal en temps réel. Très utile pour débusquer les problèmes de script.

快速入门:
Démarrage rapide:
Au démarrage de chaque session de Supcom, le jeu affiche d'abord la pub GPG puis la cinématique d'introduction. Quand on joue ça va mais quand on mod et que l'on doit lancer le jeu de nombreuses fois pour tester ses créations, ça devient vite pénible et on se voit vite presser la touche Entrée frénétiquement pour aller plus vite.
Heureusement il existe un moyen relativement simple pour arriver directement sur le menu du jeu sans perdre de temps !
1. Affichez les fichiers cachés
2. Allez là :
  1. %USERPROFILE%\Local Settings\Application Data\Gas Powered Games\Supreme Commander Forged Alliance
复制代码
ou là pour Vanilla :
  1. %USERPROFILE%\Local Settings\Application Data\Gas Powered Games\SupremeCommander
复制代码
%USERPROFILE% est un raccourcis de Windows qui vous amène directement à votre dossier utilisateur.
3. Ouvrez le fichier Game.prefs avec votre éditeur de texte préféré puis ajoutez ce code à la fin du fichier :
  1. movie = {
  2.     nologo = true
  3. }
复制代码
4. Enregistrez puis fermez Game.prefs et admirez le travail !
Il suffira d'enlever ce code pour retrouver la cinématique d'intro. Notez que le jeu peu réorganiser le code du fichier Game.prefs donc ne soyez pas étonnés si le code que vous avez ajouté en fin de fichier a été déplacé un peu plus haut.

有用快捷键与控制台命令:
有用快捷键列表:
Liste:
Touche(s)équivalent consoleDéfinition
Ctrl-Alt-Pdbg navpathAllumer/éteindre la surimpréssion du pathfinding.
Alt-F2PopupCreateUnitMenuMenu de création d'unités. L'unité créée apparaît à la position du curseur.
Alt-TTeleportSelectedUnitsDéplace l'unité sélectionné aux coordonnées du curseur.
Alt-AAI_RunOpponantAIActiver/desactiver les IA en jeu.
Ctrl-Alt-BBlingBlingTriche économique.
Ctrl-DeleteDestroySelectedUnitsDetruit toutes unités sélectionnées sans jouer d'animation.
Ctrl-Alt-Virgulegraphics_Fidelity 0Les paramétres graphiques sont au minimum.
Ctrl-Alt-Pointdgraphics_Fidelity 2Les paramétres graphiques sont au maximum.

控制台命令:
Commandes console:
Ouvrez la console à l'aide de la touche ù en mode triche.
CommandeDéfinition
ui_DebugAltClickPermet de prendre le contrôle d'une IA. Maintenir Alt + clic gauche sur une unité.
ren_ShowSkeletonsAffiche l'armature de chaque unité.
ren_ShowBonesNamesAffiche le nom de tout les bones. S'utilise de pair avec la commande précédente.

评分

参与人数 1 +50 +1 收起 理由
FAoncemore + 50 + 1 虽然法语看不懂, 留着以后看。版主翻译下?.

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-11-25 14:48 | 显示全部楼层
本帖最后由 MAXUF 于 2012-11-25 16:33 编辑

添加入MOD管理器:
Ajouter son mod dans le gestionnaire:
Savoir comment faire reconnaître son mod par le jeu se trouve être la base de tout. Inutile de préciser que s'il n'est pas reconnu, le mod n'apparaîtra pas dans la liste et ne pourra donc pas être sélectionné.
Fort heureusement cette opération est simple à réaliser puisque tout se passe dans un seul fichier nommé mod_info.lua. Il est temps de passer à l'action, voici la marche à suivre :
1.Ouvrez votre dossier mods.
2.Créez y un nouveau fichier que vous nommerez mod_info.lua.
3.Créez une image au format dds que vous nommerez logo.dds.
Voici donc l'arborescence que vous devez avoir créée à ce point précis de la réalisation
:
L'image quant à elle, est facultative. Le fichier logo.dds n'est pas un fichier critique, s'il n'existe pas il sera simplement remplacé par un logo générique. Placé à gauche dans le gestionnaire, cette image sert d'icône pour votre mod afin de le repérer d'un seul coup d'œil ce qui est pratique quand on se retrouve à fouiller dans une liste longue comme le bras.
A présent ouvrez le fichier mod_info.lua fraichement créer et placez y ce code générique :
  1. name = "Mon super mod"
  2. uid = "A9D0912C-4BE5-11E0-AD27-D257DFD72085"
  3. version = 1
  4. copyright = "GPL v3"
  5. description = "Ceci est mon premier mod. Il ne fair rien pour le moment"
  6. author = "Votre nom"
  7. url = "adresse compléte"
  8. icon = "/mods/mon-super-mod/logo.dds"
  9. selectable = true
  10. enabled = true
  11. exclusive = false
  12. ui_only = false
  13. requires = { }
  14. requiresNames = { }
  15. conflicts = { }
  16. before = { }
  17. after = { }
复制代码
Certains paramètres de ce fichier coulent de source tandis que d'autres réclament quelques explications. Pour plus de clarté voici une description complète :
1.name : Le titre du mod tel que je veux qu'il apparaisse dans le gestionnaire
2uid : L'uid est un identifiant unique qui permet de lier une personne à un produit, en l'occurence vous et votre mod. Pour générer votre UID, rendez vous sur ce site mettant un générateur à disposition puis cliquez sur le bouton sans changer le réglage (laisser la case normal cochée). Voilà votre identifiant est prêt, il ne reste plus qu'à le copier dans votre fichier mod_info.lua.
3.version : Le numéro de version de mon mod. Utile pour s'y retrouver, il n'est pas affiché dans le gestionnaire.
4.copyright : Vos droits d'auteur.
5.description : Une description claire de votre mod. Celle-ci ne doit pas comporter d'accents ou de caractères spéciaux.
6.author : Le nom/pseudo du ou des auteurs.
7.url : Si vous avez un site internet ou un topic quelque part sur un forum dédié à votre mod. Il suffira alors de renseigner ce paramètre avec une adresse valide et complète.
8.icon : Le chemin d'accès vers le logo du mod si il existe.
9.selectable : Doit être positionné à true si vous voulez pouvoir sélectionner votre mod.
10.enabled : Doit être positionné à true si vous voulez pouvoir sélectionner votre mod.
11.exclusive : Desactivera tous les autres mods sélectionnés s'il est positionné à true, c'est pourquoi il est à false par défaut. Cela peut servir pour éviter des conflits entre mods.
12.ui_only : Détermine si le mod s'initialise seulement dans l'interface utilisateur ou non. Si ce paramètre est à true alors le mod ne sera pas présent en jeu même s'il est coché dans le gestionnaire.
13.requires : Définit tout les mods requis via leur uid afin de pouvoir activer ce mode. L'uid est à placer entre deux double quotte au sein des parenthèses, exemple :
  1. requires = {"49757DF6-4BF4-11E0-A408-876BDFD72085"}
复制代码
14.requiresNames : Définit une liste d'équivalence entre un UID et un nom plus facilement reconnaissable.
  1. requiresNames = {["7FCF49C0-4BF6-11E0-AC55-126EDFD72085"] = "Mod de fred."
  2.                  ["81D0D1B2-4BF6-11E0-94E0-136EDFD72085"] = "Mod de yoann"
  3.                  ["887781C8-4BF6-11E0-B4F5-376EDFD72085"] = "Mod très mauvais"}
复制代码
15.conflicts : Défini tous les mods avec lesquels il rentrera en conflit. Si un de ceux-ci est actif, il faudra le désactiver. Même format que requires.
16.before : Aucune information à ce sujet.
17.after : Aucune information à ce sujet.
Il faut également savoir que tous ces paramètres ne sont pas non plus nécessaires, en voici la preuve avec le mod_info.lua de mon mod Bouclier T4 :
  1. name = "Bouclier T4"
  2. version = 1
  3. copyright = "Copyright © 2010, Fred & Doc."
  4. description = "Ajoute un bouclier experimental pour les UEF et les Cybran."
  5. author = "Fred & Doc"
  6. icon = "/mods/Super Shield T4/Logo.dds"
  7. selectable = true
  8. exclusive = false
  9. ui_only = false
复制代码

Ci-dessus on peut voir que le mod Bouclier T4 que j'ai créé est reconnu et ajouté à la liste malgré quelques informations manquantes.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-25 14:49 | 显示全部楼层
本帖最后由 MAXUF 于 2012-11-25 22:11 编辑

导入单位至Blender:
Avant de voir comment créer un modèle 3D intéressons nous à l’import des unités dans blender. Pour cela je vais détailler la procédure en m’appuyant sur le char T2 UEF Pillar (UEL0202).
(!) Chaque étape est complétée par une capture d'écran, cliquez sur les éléments soulignés pour les voir.
1. Ouvrez blender puis supprimez le cube de base (touche X).
2. Dans fichier allez à import et sélectionnez le script SupCom Model (.scm)…


3. Se déplacer jusqu’au fichier à importer ici UEL0202_LOD0.scm, le sélectionner puis cliquer sur le bouton Import SCM.

4. Le script demande ensuite un fichier .sca, cliquez sur Cancel.

5. Passez en mode édition pour voir apparaître le maillage.
Le script importe donc le modèle dans blender mais vous constaterez qu’il n’apparait pas. Rassurez vous il est bien là. Ceci serait du à un bogue du script lorsque le fichier .sca est manquant au chargement.


6. Scindez la fenêtre 3D.

7. utilisez la partie gauche pour afficher l'arborescence (outliner).

8. Scindez à nouveau la fenêtre 3D et utilisez la partie droite pour afficher l’éditeur d’images(图1)..

图1:

9. Dans la vue 3D sélectionnez tout les points du maillage (touche A).

10. Sélectionnez alors tout le dépliage UV qui est apparu dans l’éditeur d’images (touche A).

11. Dans l’éditeur d’image cliquez sur image pour importer la texture UEL0202_Albedo.dds.

12. Dans l’arborescence cliquez sur UEL0202_LOD0. le maillage disparaît.

13. Passez la fenêtre 3D en mode édition. Le maillage réapparaît ainsi que son armature(图2).

图2:

14. Revenez à l’arborescence et cliquez sur la flèche UEL0202_LOD0 puis sur la flèche Mesh de manière à déplier sa parentée.

15. Cliquez sur le Mesh enfant (précédé d’un triangle) et passez la fenêtre 3D en mode Texture paint.

16. Vous découvrez l’unité texturée tel qu’elle s’affiche en jeu.

Voilà donc comment bien importer correctement une unité du jeu au sein de blender. A partir de là il est enfin possible de commencer à travailler.
融合单位:
Fusion d'unités
Il peut être intéressant, au lieu de créer une unité de toute pièce, de se servir de modèles existant afin d’en créer une autre. Ce produit issu de la fusion de plusieurs autres présente quelques avantages comme le fait qu’on ne soit pas obligé de commencer de zéro que ce soit pour le maillage, la texture où l’armature. On y verra donc un gain de temps non négligeable. En outre cela offre au produit final une meilleur crédibilité puisqu’en utilisant des portions de maillages (un canon, un fuselage etc.) et de textures on reste fidèle à l’univers du jeu et plus précisément au style, et donc à l’identité de la faction choisie.
Il faudra tout d’abord avoir une idée de l’unité désirée afin d’identifier la pièce maitresse de l’assemblage. Par exemple si je désir ajouter des chenilles à un navire UEF pour avoir un équivalent au Destroyer T2 Cybran (Class Salem), ma pièce maîtresse est le navire UEF.
Pourquoi donc ? Parce que l’unité navire UEF est plus complexe (de par son maillage, sa texture, son armature) que les chenilles prélevés d’un char.

Afin d’illustrer cette manipulation je vais reprendre l’exemple ci-dessus du bateau à chenilles :
● L’unité maitresse sera le destroyer UEF T2 Classe Valiant (UES0201).
● L’unité esclave sera le char T2 UEF Pillar (UEL0202) dont on prélévera les chenilles.
Commencez par importer l’unité maitresse et l’unité esclave dans un Blender chacun (référez vous aux étapes 1 à 16 du tutoriel précédent) et enregistrez les en .blend.


Dans le Blender contenant l’unité maitresse :
1. Dans Fichier cliquez sur Lier depuis un .blend / Append or link.


2. Sélectionnez le fichier .blend esclave et cliquez sur Object.

3. Cliquez sur Mesh.

4. Cliquez sur le bouton Load library.

5. Vous remarquerez l'apparition d'un nouveau maillage dans l'arborescence: Mesh.001.

6. cliquez sur le nouveau mesh (Mesh.001) pour le sélectionner.

7. Passez en mode objet.

8. Déplacez le maillage esclave à côté du maillage maitre (Touche G).

9. Sélectionnez le maillage esclave puis le maillage maitre.

10. Fusionnez (CTRL + J).

Le char T2 est fusionné(图3) avec le destroyer. Vous remarquerez d'ailleurs que la texture du char à été importée(图4) avec celui ci. Ne reste plus qu’a prélever les parties convoitées et les greffer au destroyer :
图3:

图4:

1. Sélectionnez les pièces voulues et copiez-les (Shift + D).

2. Supprimez les points doubles (touche W).

3. Retouchez et placez les pièces à votre guise.

4. Passez en mode Texture paint de temps à autre pour apprécier le résultat et vous assurer que tout est correct, notament que la texture n'est pas trop déformée si vous retouchez le maillage.
(!) Pensez toujours à supprimer les points doubles lorsque vous prélever des morceaux, ils alourdissent l’unité pour rien.
A ce stade le maillage est fini et bon pour être exporté (à supposer que l’armature soit finie).
Nous avions fusionné les maillages, il ne reste plus qu’a fusionner les textures:

1. Dans l’éditeur d’images, cliquez sur image et sélectionnez le script consolidate into one image.

2. Cliquez sur le bouton all set objects puis sur OK.

3. Les deux textures on été fusionnées.

4. Cliquez à nouveau sur image puis sur save as.

5. Sélectionner un endroit pour exporter la texture au format .png.

6. Convertissez la texture en .dds en utilisant de préférence une compression DXT1.
7. Renommez la texture en nom-de-l’unité_Albedo.dds.

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-25 14:49 | 显示全部楼层
本帖最后由 MAXUF 于 2012-11-25 22:09 编辑

整合一个新的单位:
Intégrer une nouvelle unitée
Nous allons voir maintenant, en trois étapes, comment ajouter une nouvelle unité dans supcom. Ici je vais donc montrer comment réaliser un modèle 3D viable et propre à être compris par le jeu, comment créer une texture et enfin comment réaliser une animation de l'unité en question. Pour la totalité de ce travail j'utilise Blender.
Maillage, armature et groupes de points
L'unité en elle même, c'est à dire le maillage 3D sans texture ni animation, est contenue dans un fichier .scm et il se nomme suivant un schéma précis à savoir : NomUnite_lod0.scm. Il est impératif de suivre cette structure pour nomer ses unités car on appel pas ce fichier directement, c'est le jeu qui s'en charge tout seul en interne. lod0 signifie Level of detail 0 soit niveau de détail initial en français car, si vous regardez bien dans le dossier de chaque unité, il existe aussi un fichier nommé NomUnite_lod1.scm (niveau de détail secondaire). C'est pour ainsi dire le même maillage sauf qu'il est simplifié dans le but d'alléger le nombre de polygone à l'écran (on appel ça un modèle Low poly). Il est utilisé dans le jeu lors du dezoom afin d'alléger la charge processeur, il est inutile d'afficher des polygone si nous ne pouvons pas les voir. Ce second fichier .scm est appelé directement dans le blueprint contrairement à son grand frère.
L'objet de cette première étape consiste en la réalisation d'un modéle compatible, quel qu'il soit et non d'apprendre à faire de l'infographie 3D. Nous allons donc nous contenter du cube que crée Blender par défaut au démarrage.

(!) Chaque étape est complétée par une capture d'écran, cliquez sur les numéros pour les voir.
1. Ouvrez Blender puis passez en mode edition.

2. scindez la vue principale.

3. utilisez la partie gauche pour afficher l'arborescence (outliner).

4. Passez en vue de face (pavé num.1) puis ajoutez une armature.

5. A ce stade vous venez d'ajouter votre premier bone. On parle d'armature lorsque plusieurs bones sont associés formant ainsi le squelette de notre unité. Chaque unités, de la plus complexe à la plus simple posséde au minimum un bone, c'est impératif car sans bone une unité ne peut tout simplement pas être créée. Cliquez sur les boutons "Afficher nom" et "Afficher axes" dans le panneau ArmatureLa notion d'armature est assez complexe en soit car il en existe de plusieurs type couvrant tout les champs d'utilisation cependant dans supcom on utilise qu'un type d'armature mais je n'en dirai pas plus pour le moment.

6. Sélectionnez le bone (les deux sphéres à chaque extrémités doivent faire partie de votre sélection) puis donnez lui le nom de votre unité dnas le champ BO: (ici : UEF001). Ce premier bone joue le rôle de "bone racine" il n'est donc l'enfant d'aucun autre bone, le champ associé reste donc vide. Enfin assurez vous que l'axe Z du bone pointe vers le bas de votre ecran en vue de dessus (pavé num.7). Si tel n'était pas le cas, sélectionnez le bone et faites lui faire une rotation grâce aux touches CTRL+R.

7. Avec le bone toujours complêtement selectionné, passez en mode pose.

8. Sélectionnez le maillage et le bone, celui-ci doit apparaître en bleu puis faites CTRL + P afin de les parenter. Une fenêtre apparaît, choisissez Armature.

9. Une seconde fenêtre apparaît, choisissez Name groups. Ceci aura pour effet de créer un groupe de point (pour le moment il est vide) portant le nom de votre Bone racine. Notez que vous auriez pu choisir l'option Don't create group puis créer le groupe manuellement depuis le panneau Liens et matériaux celà revient au même.

10. Il faut ajouter les sommets de notre objet au gruope de point précedemment créé. Pour celà sélectionnez les et rendez vous dans le panneau Liens et matériaux et cliquez sur ajouter. Les sommets sont maintenant lié au groupe. Vous pouvez cliquer sur Selection pour vérifier que l'opération d'association s'est correctement déroulé.

/!\ Chaque groupe de point doit porter le nom exact du bone avec lequel il est associé.
11. Retournez en mode Edition et sélectionnez le cube (touche A) puis utilisez la combinaison de touche CTRL+N les faces sélectionnés seront recalculées vers l'extérieur. A contrario CTRL+SHIFT+Nrecalcule les faces vers l'intérieur. Cette étape sert à indiquer au moteur du jeu s'il doit afficher une face selon que la caméra se trouve à l'intérieur ou à l'extérieur de l'objet.

12. Il ne reste plus qu'a renomer l'armature. Sélectionnez là puis dans le champ OB: du panneau Liens et matériaux nommez le en suivant le schéma d'appélation (ici UEF001_lod0 où UEF001 est le nom de l'unité).

13. Il faut également renomer le maillage. Sélectionnez le puis dans le champ OB: et ME:du panneau Liens et matériaux donnez lui le nom de l'unité (ici UEF001).

14. L'unité est enfin prête à être exportée au format .scm. Faites Fichier -> exporter -> Supreme commander 3.5 choisissez le chemin de sortie du fichier et cliquez sur Select output DIR en haut à droite pour valider.

15. Dans la fenêtre suivante cliquez sur Exporter. Si vous avez respecter toutes les étapes vous devriez obtenir un message similaire(图5).

图5:

Félicitation vous venez de creer une unité compatible avec supcom, il ne reste plus qu'a la tester et observer le résultat.
Avant d'aller plus loin sachez une chose à propos de la création de vos maillages: faites simple! En effet, un bon maillage comporte le moins de vertices possible, il faut aller à l'essentiel sans sacrifier la précision. En résumer il faut guarder un équilibre entre le niveau de détail et le nombre de vertices. Pour donner un exemple concret, il est inutile de créer toutes les têtes de vis d'une tourelle, de modéliser tout les canons d'une gatling ou bien encore de faire des canons creux tout ceci participe à alourdir inutilement vos créations
Je ne saurais que trop vous conseiller d'importer des unités dans Blender et de comparer ce que vous y voyez avec le rendu d'une partie de Supcom, vous êtes sur le point de découvrir que tout ces petits détails sont en fait réalisés grâces aux textures!

Texture
La partie précédente montre comment créer un modéle 3D apte à être intégré au jeu mais il reste encore à le munir d'une texture adapté. On a tendence à laisser cette étape de côté mais le texturage d'une unité est en grande partie responsable du resultat visuel final car le meilleur modèle 3D aura l'air d'une horreur si la texture est bâclé alors qu'une unité pas forcément trés bien modélisé pourra être ratrappé facilement si sa texture est à la hauteur.
Une texture complète se compose au minimum de 3 fichiers:
NOM DE L'UNITE_Albedo.dds
NOM DE L'UNITE_SpecTeam.dds
NOM DE L'UNITE_normalsTS.dds
Si l'unité a un maillage low poly alors il faudra au total 6 fichiers:
NOM DE L'UNITE_Albedo.dds
NOM DE L'UNITE_SpecTeam.dds
● [color=Orange]NOM DE L'UNITE_normalsTS.dds
NOM DE L'UNITE_lod1_Albedo.dds
NOM DE L'UNITE_lod1_SpecTeam.dds
NOM DE L'UNITE_lod1_normalsTS.dds
Albedo:
Ce fichier regroupe les couleurs qui recouvrirons l'unité et va définir son aspect général. Lors de l'enregitrement au format .dds on utilise la compression DXT1.
Specteam:
C'est dans ce fichier que l'on ajoute les couleurs d'équipe qu'arborent les unités, mais pas seulement car ce fichier sert aussi a donner des effets à notre texture.
● Peindre une zone en rouge dans ce fichier lui donne de la réflection.
● Peindre une zone en vert dans ce fichier ajoute un effet speculaire et brillant/luisant.
● Peindre une zone en bleu dans ce fichier ajoute un effet bloom.
● Peindre une zone en jaune (rouge + vert) ajoute de la réflection et de la brillance ce qui convient bien aux métaux.
● Peindre une zone en noir dans ce fichier cré un effet matte.
● Peindre une zone dans le canal alpha (transparence) lui ajoute la couleur d'équipe.
Lors de l'enregitrement au format .dds on utilise la compression DXT3.

normalTS (TS pour Tangent Space):
Ce fichier gére l'effet relief de la texture. Lors de l'enregitrement au format .dds on utilise la compression DXT5.
Texturer en pratique:
Dans Supcom chaque unités, projectiles etc. recours à l'UV mapping. Ce procédé conciste à déplier l'objet pour en faire une sorte de patron et, une fois ce patron acquis, il nous sera possible de texturer ledit objet. Passons maintenant à la pratique avec notre cube et voyons comment faire pour le texturer.
1. Demarrez blender et scindez la vue 3D en 2 et choisissez UV/Image Editor.

2. Passez la vue 3D en mode édition (touche TAB) et en fil de fer (touche Z) Choisissez le mode de sélection d'arêtes (touches CTRL + TAB + 2).

3. Sélectionnez les arrêtes du cube comme indiqué et faites CTRL + E puis Mark Seam pour en faire des coutures.

4. Sélectionnez tout le maillage et pressez la touche U puis choisissez Unwrap. Cette action va déplier le maillage en suivant les coutures. L'UV mapping est à présent terminé.

5. Dans la vue UV/Image Editor, cliquez sur UVs puis dans Scripts Choisissez l'option Save UV Face Layout. Ceci créra une image à partir de l'UV mapping.

6. Des options d'enregistrement sont possible, veillez à les laisser ainsi et cliquez sur OK.

7. N'oubliez pas de nomer l'image, choisissez un emplacement d'enregistrement et cliquez sur Save UV.

8. Dorénavant vous pouvez éditer l'image comme bon vous semble avec votre éditeur d'image.

9. Une fois l'édition finie, retournez dans blender puis dans le vue UV/Image Editor cliquez sur Image puis Open.

10. Sélectionnez l'image retouchée et cliquez sur Open Image.

11. La texture est importée dans blender et s'applique au maillage.

12. Vous pouvez voir le maillage directement texturé dans blender, pour celà dans la vue 3D passez en vue texturée.

13. Voici le maillage intégralement texturé.

(!) Ici le fond de la texture est blanc mais il convient de lui préférer un fond noir moins gourmand en mémoire.
A l'issue de ces étapes nous avons créé une texture qui fonctionne dans blender. Pour l'intégrer dans Supcom il suffit de l'enregistrer au format .dds sans oublier de la compresser en DXT1. Finalement renomez la texture en NOM DE L'UNITE_Albedo.dds.

Animation
Passons à l'animation. Une fois terminée celle-ci prendra la forme d'un fichier .sca. De but en blanc ça à l'air compliqué cependant une unité animée semble plus perfectionnée, plus vivante dans le jeu et on ne s'en lasse pas. On les trouve un peu partout d'ailleurs, si on fouille un peu dans les fichiers des unités on tombera sur des choses tel que:
Abuild pour les animations de construction (usines cybran).
Awalk pour la marches des unités sur pattes (perceval).
Awheels pour les roues des ingénieurs.
Afold pour plier un bras.
Aunfold pour le déplier.
Aopen par exemple pour l'ouverture de la trappe d'un lanceur stratégique.
Aupgrade ...ça coule de source.
Apump pour animer les extracteurs de masse.
Adeath pour certaine unités tel que le Monkey Lord qui s'écroule avant d'exploser.
● Etc.

C'est donc un plus indéniable. J'ai passé pas mal de temps à chercher sur internet mais en vain. Voici donc ma façon de procéder après quelques longs essais et tripatouillages.
Pour cette introduction aux animations nous allons faire simple, il s'agira d'une translation toute bête suivie d'une petite rotation.
1. Ouvrez Blender et chargez-y votre maillage (texturé ou non aucune importance). Affichez l'arborescence.


2. Sélectionnez l'armature et passez en mode édition. Mettez la vue en fil de fer pour plus de clarté.

3. Scindez la vue 3D en deux et choisissez Action Editor.

4. Votre espace de travail devrait ressembler à ceci. Redimensionnez vos fenêtres de travail si nécessaire.

5. Dans la fenêtre des boutons, cliquez sur le bouton scene ou pressez F10.

6. Dans le panneau Anim, deux boutons nous intéressent "Sta" et "End". Ils définissent respectivement la 1ere et la dernière image de l'animation. End est à 250 par défaut, abaissez le à 41 pour l'exemple.

7. Passez en mode pose. Vérifiez que vous êtes en train de travailler sur la première image dans l'Action Editor. Si tel n'étais pas le cas positionnez la ligne verte correctement ou ajustez avec les fléches.

8. Sélectionnez tout les bones (ici il n'y en a qu'un) et pressez la touche I pour insérer une clé. Choisissez LocRot.

9. A ce stade la première clé de l'animation est créée. Remarquez la présence d'une nouvelle entrée Action dans l'arborescence.

10. Positionnez vous à la 20ème image dans la vue Action Editor. Sélectionnez le bone voulu et faites lui faire une translation. Comme à l'étape 8 insérez une deuxième clé.

11. A ce stade vous avez la possibilité de jouer l'animation. Pressez ALT + A; L'animation se jouera en boucle. Cliquez droit pour la stopper.

12. A présent positionnez vous à l'avant dernière image (soit ici la n°40), faites faire une rotation à votre bone (par exemple 1/4 de tour) et insérez une nouvelle clé.

13. Voilà l'animation est finie, vérifiez là comme à l'étape 11 c'est plus prudent.

14. Etape facultative: testez l'animation avec le maillage recouvert de sa texture. Cela donne une idée plus précise du rendu final dans le jeu.

15. L'animation est intitulée par défaut Action. Sélectionnez le nom dans la vue de l'Action Editor.

16. Renommez l'animation en NOM DE L'UNITE_Amove. Ici cela donne UEF001_Amove.

17. L'animation est enfin prête à être exportée au format .scm. Faites Fichier -> exporter -> Supreme commander 3.5 choisissez le chemin de sortie du fichier et cliquez sur Select output DIR en haut à droite pour valider.

18. Le fichier à été créé. L'exportation génère aussi un fichier .scm. Il ne semble pas possible de ne générer que l'animation seule (ce qui n'est surement pas une mauvaise chose).

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-25 14:49 | 显示全部楼层
本帖最后由 MAXUF 于 2012-11-26 17:46 编辑

显示图标列表中的建设:
Afficher les icônes dans la liste de construction
Par défaut, si le jeu ne trouve pas d'icône à associer à vos unités il vous affichera cet icône :


Pour information cet icône s'appel justement default_icon.dds et elle se trouve dans l'archive textures.scd à cette adresse :
  1. textures.scd\textures\ui\common\icons\units\default_icon.dds
复制代码
Vous avez peut être remarquer, si vous avez suivi le lien de l'image ci-dessus le message inscrit dans le journal d'évenement. En effet si on ordonne la construction de l'unité la ligne suivante apparaît:
  1. INFO: Warning: Unable to find file \000/icons/units/zzz0000_icon.dds
复制代码
zzz0000 étant ici le nom de l'unité qui m'a servi d'exemple.
Ce message confirme qu'il n'a pas réussi à trouver l'image concernée dans le dossier d'icônes. Il le remplace donc automatiquement par l'icône générique default_icon.dds et s'abstient de planter (ce qui est quand même apréciable).
Etant donné qu'on ne peut pas raisonnablement envisager de desarchiver textures.dds, ajouter nos icônes puis réarchiver on va ruser. De vous à moi j'ai longtemps galérer avec ça, notemment parcequ'au départ j'ai employer une méthode qui était celle réservé à Vanilla. X)
Methode pour Forged Alliance
Donc comme je disai, on va ruser. Nous allons mettre en place un hook. Personellement je trouve ça assez lourd comme technique simplement pour afficher des icônes et je ne voit pas pourquoi les developpeurs n'ont pas tout simplement utilsé un chemin vers l'image dans le fichier blueprint de l'unitée... mais ceci est un autre débat.
Premiérement rendez-vous dans le dossier principal de votre mod. Pour l'exemple qui suit le mien s'appelera mon-super-mod. Vons devriez donc vous trouver ici :
  1. ...\mods\mon-super-mod
复制代码
Ensuite vous allez créer une ribanbelle de dossiers :
1.Créez un nouveau dossier que vous nommerez icons.
2.Ouvrez icons et créez y un nouveau dossier que vous nommerez units.
C'est dans le dossier units qui vous déposerez vos icônes au format .dds. Vous ne pouvez pas nommer vos icones comme bon vous semble, il faut respecter une certaine structure. On peut la schématiser comme ceci : nom-de-mon-unité_icon.dds. Le tout en minuscule. Pour l'exemple voici ce que ça donne avec le bouclier Tech3 Aeon qui répond au doux nom de UEB4301 :
  1. ueb4301_icon.dds
复制代码
Pour plus de clareté voici un aperçu de ce que vous devriez obtenir :

Si vous n'avez pas d'icone sous la main, je vous suggère d'aller copier/coller les icônes originale du jeu le temps de tester ce hook. Il suffit de se rendre à l'endroit ou vous avez copier et desarchiver textures.scd, vous trouverez les icones en suivant ce chemin :
  1. ...\textures\ui\common\icons\units\
复制代码
N'oubliez pas de les renomer pour qu'elles porte le nom de vos unités.
Ensuite revenez au dossier principal de votre mod car vous allez devoir créer quelques dossiers suplémentaire:
1.Créez un nouveau dossier que vous nommerez hook.
2.Ouvrez hook et créez y un nouveau dossier que vous nommerez lua.
3.Ouvrez lua et créez y un nouveau dossier que vous nommerez ui.
4.Ouvrez ui et créez y un nouveau fichier que vous nommerez uiutil.lua et un nouveau dossier que vous nommerez game.
5.Ouvrez game et créez y deux nouveau fichier que vous nommerez unitview.lua pour l'un et gamecommon.lua pour l'autre.
Si ça c'est pas barbare comme technique! Je vous rassure ça ne fait que commencer :D. Avant d'aller plus loin voici en image l'arborescence que vous devriez obtenir :


Maintenant que ce point est bien clair passons à la suite.
Ouvrez le fichier uiutil.lua et copiez y le code suivant :
  1. do
  2.    local MyUnitIdTable = {
  3.       'zzz0000',
  4.           'yyy0000',
  5.      
  6.    }
  7.         --unit icon must be in /icons/units/. Put the full path to the /icons/ folder in here - note no / on the end!
  8.    local MyIconPath = "/mods/mon-super-mod"
  9.    local oldUIFile = UIFile
  10.    function UIFile(filespec)
  11.       for i, v in MyUnitIdTable do
  12.          if string.find(filespec, v .. '_icon') then
  13.             local curfile =  MyIconPath .. filespec
  14.             if DiskGetFileInfo(curfile) then
  15.                return curfile
  16.             else
  17.                WARN('Blueprint icon for unit '.. control.Data.id ..' could not be found, check your file path and icon names!')
  18.             end
  19.          end
  20.       end
  21.       return oldUIFile(filespec)
  22.    end
  23. end       
复制代码
Ouvrez le fichier unitview.lua et copiez y le code suivant :
  1. do
  2.    local MyUnitIdTable = {
  3.       'zzz0000',
  4.           'yyy0000',
  5.    }
  6.    --unit icon must be in /icons/units/. Put the full path to the /icons/ folder in here - note no / on the end!
  7.    local MyIconPath = "/mods/mon-super-mod"
  8.    
  9.    local function IsMyUnit(bpid)
  10.       for i, v in MyUnitIdTable do
  11.          if v == bpid then
  12.             return true
  13.          end
  14.       end
  15.       return false
  16.    end
  17.    
  18.    local oldUpdateWindow = UpdateWindow
  19.    function UpdateWindow(info)
  20.       oldUpdateWindow(info)
  21.       if IsMyUnit(info.blueprintId) and DiskGetFileInfo(MyIconPath .. '/icons/units/' .. info.blueprintId.. '_icon.dds') then
  22.          controls.icon:SetTexture(MyIconPath .. '/icons/units/' .. info.blueprintId .. '_icon.dds')
  23.       end
  24.    end
  25. end
复制代码
Finalement dans ces 3 codes il faut renseigner dans un premier temps le nom de vos unité en minuscule, entre crochet et suivi d'une virgule dans la table d'unité situé en ligne 2.
  1. local MyUnitIdTable = {
  2.         'nom-de-ma-1ère-unité',
  3.         'nom-de-ma-seconde-unité',
  4.         'etc.',
  5.         }       
复制代码
Pour l'exemple mes unités se trouve en ligne 3 et 4 sous le nom de zzz0000 et yyy0000.
Dans un second temps il reste à renseigner le chemin d'acces vers le dossier d'icônes. Attention pour ceci il suffit de donner la partie pointant vers le dossier racine de votre mod sans slash final car le code se charge de compléter lui même le chemin.
On obtient donc :
  1. local MyIconPath = "/mods/mon-super-mod"
复制代码
Au lieu de :
  1. local MyIconPath = "/mods/mon-super-mod/icons/units/"
复制代码
Voilà c'est fini, il ne vous reste plus qu'a lancer Forged alliance pour tester... ou bien pour jouer tiens ! Après tant d'efforts c'est amplement mérité ;).
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-25 14:50 | 显示全部楼层
本帖最后由 MAXUF 于 2012-11-26 18:36 编辑

蓝图文件:
Les fichiers blueprint
Ces fichiers reconnaissable par leur extension en .bp servent à décrire l'unité et travaillent de pair avec les fichiers lua des unités. Ils sont donc constitué d'une longue liste de terme descriptif plus ou moins simple à comprendre. On remarquera que chaque déclaration est donnée par ordre alphabétique.
Il serait difficile (et très long) de dresser une liste complète de tout les termes utilisés dans ces fichiers. En effet tous n'utilisent qu'une partie des termes existant, il faudrait donc fouiller chaque fichier puis comparer les termes entre eux pour être certain de ne pas faire d'impaire! Cette manipulation fastidieuse serais assez inutile dans le sens où 75% des termes sont relativement compréhensible. Vous pouvez cependant trouver une liste incomplète en anglais sur le wikia dédié à supcom.

Fusionner des fichiers blueprint
Pour modifier une unité d'origne du jeu proprement, c'est à dire sans toucher au fichier blueprint de ladite unité, il faut faire appel à la fusion de fichier blueprint.
1.Ouvrez votre dossier de mod ( vous devriez vous trouver dans mod/mon_mod).
2.Créez-y un dossier nommé merge.
3.Ouvrez merge et créez-y un nouveau fichier que vous nommerez TestFusion_unit.bp pour l'exemple. Il est préférable de donner un nom intelligible, par exemple CharT2UEF_unit.bp s'il s'agit du char UEF T2.
4.Ouvrez ce fichier et remplissez-le comme suit:

TestFusion_unit.bp
  1. UnitBlueprint {
  2.    BlueprintId = 'nom_unité',
  3.    Merge = true,
  4.    
  5.    #insérer code ici
  6. }   
复制代码
4.Remplacez nom_unité par le nom de l'unité d'origine que vous voulez modifier (ex. ues0305 pour le sonar T3 UEF). Ensuite il suffira d'y insérer le code que vous voulez comme pour un fichier blueprint classique.
Par exemple si je veux modifier mon sonar T3 UEF pour augmenter sa vie de 2000 points d'origine à 5000:

SonarT3UEF_unit.bp
  1. UnitBlueprint {
  2.    BlueprintId = 'ues0305',
  3.    Merge = true,
  4.    
  5.    Defense = {
  6.    Health = 5000,
  7.    MaxHealth = 5000,
  8.    },
  9. }   
复制代码
Associer une usine à une unité
Admettons que l'on crée une usine ainsi qu'un char constructible uniquement par cette dernière, il faut bien les lier d'une manière ou d'une autre mais comment faire?
D'une part dans le blueprint du char il suffit d'ajouter une catégorie au nom approprié tel que BUILTBYMYFACTORY comme ceci:

MonChar_unit.bp
  1. Categories = {
  2.         'BUILTBYMYFACTORY',
  3. },
复制代码
D'autre part dans le blueprint de l'usine on ajoute cette même catégorie dans la partie BuildableCategory de Economy :
MonUsine_unit.bp
  1. Economy = {

  2.         BuildableCategory = {
  3.                 'BUILTBYMYFACTORY',
  4.         },
  5. },
复制代码
Voilà le char ne pourra être construit que par cette usine et toutes celles qui intégreront BUILTBYMYFACTORY dans leurs catégories.
/!\ Page en construction

LUA语言:
Le language LUA
Fusionner des fichiers LUA
Pour modifier une unité d'origne du jeu proprement, c'est à dire sans toucher au fichier LUA de ladite unité, il faut faire appel à la fusion de fichier LUA.
1.Ouvrez votre dossier de mod ( vous devriez vous trouver dans mod/mon_mod).
2.Créez-y un dossier nommé hook.
3.Ouvrez hook et créez-y un nouveau dossier que vous nommerez units.
4.Ouvrez units et créez-y un nouveau dossier que vous nommerez nom unité.
5.Ouvrez nom unité et créez-y un nouveau fichier que vous nommerez nom unité_script.lua.
6.Ouvrez ce fichier et remplissez-le comme suit:

nom unité_script.lua
  1. do
  2. local OldUnit = nom unité

  3.         nom unité = Class(OldUnit) {
  4.                 -- insérer code ici
  5.         }
  6.        
  7. TypeClass = nom unité  
  8. end
复制代码
7.Remplacez nom unité par le nom de l'unité sur laquelle vous travaillez.
/!\ Page en construction
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-25 14:50 | 显示全部楼层
本帖最后由 MAXUF 于 2012-11-26 19:41 编辑

操作武器:
Fonctionnement des armes
Introduction
Dans supcom, la quasi-totalité des unités possèdent au moins une arme sinon plusieurs. Il y en a de différentes sortes: automatique, manuel, fixe ou mobile, à projectile ou rayon etc. C'est pour cela qu'il est nécessaire de bien comprendre comment elles fonctionnent.
Base théorique
les armes sont définies dans le blueprint de l'unité dans la catégorie Weapon (vers la fin du fichier) ainsi que dans le script LUA de l'unité. Chaque arme nécessite un projectile pour fonctionner (sauf pour les armes à rayon laser).
(!) Les scripts liés aux armes se trouvent dans lua/terranweapons.lua, lua/cybranweapons.lua, lua/aeonweapons.lua et lua/seraphimweapons.lua.
Chaque unité peut posséder plus d'une seule arme. Dans ce cas la structure à adopter dans le blueprint est la suivante:
  1. Weapon = {
  2.         { attributs de l'arme n°1 },
  3.         { attributs de l'arme n°2 },
  4.         { attributs de l'arme n°3 },
  5. },
复制代码
Mécanique d'une arme
Une arme est composée de 4 parties:
Turret: la tourelle.
Rack: le support.
Barrel: le canon.
Muzzle: la bouche du canon.
Une arme peut contenir un seul ou plusieurs racks, chaque rack contient plusieurs muzzles. Si l'arme ne possède qu'un muzzle alors le rack est inutile. les racks sont contrôlés par la cadence de tir de l'arme. Les muzzles sont contrôlés par le rack ainsi que par leurs nombre de tirs consécutifs (salvo size).

(!) Les rack servent donc principalement à grouper plusieurs canons ensemble pour créer des effets plus élaborés comme des tirs séquentiels etc.
Une arme se déplie (unpack), se charge, tire, recharge et se replie (repack) dans cet ordre. Le pliage/dépliage (unpacking/packing) survient dés que l'arme verrouille une cible.
Observation pratique
Amusons nous avec une arme simple à manipuler: la pointe de défense T1 UEF (UEB2101).

Importons-la dans blender et observons son armature:

Plusieurs choses sont à noter. Tout d'abord le nom des bones composant l'armature:
UEB2101 qui est le bone racine.
Turret qui est associé à la tourelle.
Turret_Barrel qui est associé au canon.
Turret_Muzzle qui constitue le point de sortie du projectile.
Poursuivons avec la hiérarchie des bones. Ils sont liés entre eux par un segment en pointillé. On peut comprendre cette armature comme ceci:
UEB2101 est le bone racine.
Turret est le bone enfant de UEB2101.
Turret_Barrel est le bone enfant de Turret.
Turret_Muzzle est le bone enfant de Turret_Barrel.
C'est cette liaison hiérarchisée de bones qui va permettre à l'arme de se mouvoir correctement. Ainsi si je fais faire une rotation sur l'axe X à Turret alors Turret_Barrel et Turret_Muzzle suivront le mouvement car ce sont tout deux des bones enfant par rapport à Turret tandis que UEB2101, lui, restera fixe car il n'est pas enfant de Turret.
Cette structure se retrouve également dans l'outliner de blender comme le montre la capture ci-dessous:


Dernière chose importante mise en évidence par ces images: les axes X, Y et Z qui définissent l'orientation des bones. Ci-dessous, une capture supplémentaire montre que chaque bone affiche son orientation dans l'espace au moyen d'un repère XYZ individuel.

/!\ L'orientation XYZ des bones est différente de l'orientation XYZ de la vue de blender. Dans cette dernière les axes Y et Z sont intervertis.
Pour comparer voici le rendu de l'armature dans le jeu:

Rien ne change par rapport à la visualisation dans Blender si ce n'est que les axes des bones ne sont pas écrit mais repéré par un code couleur:
X est en rouge.
Y est en vert.
Z est en bleu.
Quand l'armature de l'arme bouge le maillage doit agir de même, il faut donc que les deux soient liés. Le lien entre l'armature et le maillage réside dans les groupes de point (Cf "Maillage, armature et groupes de points") et le nom qu'ils portent, ceux-ci étant scrupuleusement identique à leurs bones respectif.
Ci-dessous on pourra observer les groupes de points sélectionnés successivement




On remarque enfin que la tourelle entre en rotation sur l'axe X (on rencontre le terme pitch) tandis que le canon tourne sur l'axe Y (on rencontre le terme yaw). L'axe Z, lui, est très important car c'est sur celui-ci que se déplace les projectiles (et les rayons laser) des armes et ce sans la moindre exception!
Côté code
Continuons nos observations du côté du code. Commençons par observer ce que renferme la section Weapon du fichier blueprint de la pointe de défense T1 UEF.

UEB2101_unit.bp

  1. Weapon = {
  2.         {
  3.                 AboveWaterTargetsOnly = true,
  4.                 Audio = {
  5.                         Fire = Sound {
  6.                                 Bank = 'UELWeapon',
  7.                                 Cue = 'UEB2101_Cannon_Sgl',
  8.                                 LodCutoff = 'Weapon_LodCutoff',
  9.                         },
  10.                 },
  11.                 BallisticArc = 'RULEUBA_LowArc',
  12.                 CollideFriendly = false,
  13.                 Damage = 50,
  14.                 DamageType = 'Normal',
  15.                 DisplayName = 'Light Plasma Cannon',
  16.                 FireTargetLayerCapsTable = {
  17.                         Land = 'Land|Water|Seabed',
  18.                         Water = 'Land|Water|Seabed',
  19.                 },
  20.                 FiringTolerance = 2,
  21.                 Label = 'MainGun',
  22.                 MaxRadius = 26,
  23.                 MuzzleSalvoDelay = 0,
  24.                 MuzzleSalvoSize = 1,
  25.                 MuzzleVelocity = 35,
  26.                 ProjectileId = '/projectiles/TDFPlasma01/TDFPlasma01_proj.bp',
  27.                 ProjectileLifetimeUsesMultiplier = 1.15,
  28.                 ProjectilesPerOnFire = 1,
  29.                 RackBones = {
  30.                         {
  31.                                 MuzzleBones = {
  32.                                         'Turret_Muzzle',
  33.                                 },
  34.                                 RackBone = 'Turret_Barrel',
  35.                         },
  36.                 },
  37.                 RackFireTogether = false,
  38.                 RackRecoilDistance = 0,
  39.                 RackReloadTimeout = 10,
  40.                 RackSalvoChargeTime = 0,
  41.                 RackSalvoReloadTime = 0,
  42.                 RackSalvoSize = 1,
  43.                 RackSlavedToTurret = false,
  44.                 RangeCategory = 'UWRC_DirectFire',
  45.                 RateOfFire = 3,
  46.                 ReTargetOnMiss = true,
  47.                 TargetCheckInterval = 0.25,
  48.                 TargetPriorities = {
  49.                         'SPECIALHIGHPRI',
  50.                         'MOBILE',
  51.                         'STRUCTURE DEFENSE',
  52.                         'SPECIALLOWPRI',
  53.                         'ALLUNITS',
  54.                 },
  55.                 TargetRestrictDisallow = 'UNTARGETABLE',
  56.                 TrackingRadius = 1.15,
  57.                 TurretBoneMuzzle = 'Turret_Muzzle',
  58.                 TurretBonePitch = 'Turret_Barrel',
  59.                 TurretBoneYaw = 'Turret',
  60.                 TurretDualManipulators = false,
  61.                 TurretPitch = 0,
  62.                 TurretPitchRange = 60,
  63.                 TurretPitchSpeed = 60,
  64.                 TurretYaw = 0,
  65.                 TurretYawRange = 180,
  66.                 TurretYawSpeed = 90,
  67.                 Turreted = true,
  68.                 WeaponCategory = 'Direct Fire',
  69.                 WeaponRepackTimeout = 0,
  70.                 WeaponUnpacks = false,
  71.     },
  72. },
复制代码
Cette portion de code renferme beaucoup de choses intéressante mais commençons par la ligne 21. C'est la plus importante pour comprendre le fonctionnement du code.
  1. Label = 'MainGun',
复制代码
Concrétement cette ligne dit que l'arme s'appel MainGun et c'est ce nom qui va lier le code du blueprint de cette arme au code LUA. Ainsi le script est capable d'identifier l'arme en question dans le blueprint, sans celà l'arme ne fonctionnerait pas.
Ensuite à la ligne 26 on trouve l'argument qui désigne le projectile utilisé.
  1. ProjectileId = '/projectiles/TDFPlasma01/TDFPlasma01_proj.bp',
复制代码
Les armes à rayons laser (beam) comme le satellite UEF ou encore le monkeylord Cybran n'utilisent pas de projectiles, (normal puisque ce sont des faisceaux laser) cet argument ainsi que tout ceux liés à la gestion des projectiles (voir ligne 27 et 28) sont donc absent de leurs code respectif.
  1. MuzzleSalvoDelay = 0,        temps entre chaques tirs d'une salve.
  2. MuzzleSalvoSize = 1,        nombre de projectiles envoyé à chaque salve.
  3. MuzzleVelocity = 35,         vitesse à laquelle le projectile sort du canon.
复制代码
Avec les arguments MuzzleSalvoDelay et MuzzleSalvoSize combinés on peut, par exemple, créer un arme qui se comporte à la manière d'un fusil à pompe (plusieurs projectiles tirés en même temps) ou une arme qui tire par rafales successives.
MuzzleVelocity est utilisé de façon à être certain que le projectile "volera" suffisament loin pour atteindre sa portée maximum.
  1. RackBones = {
  2.         {
  3.                 MuzzleBones = {
  4.                         'Turret_Muzzle',
  5.                 },
  6.                 RackBone = 'Turret_Barrel',        bone utilisé pour le recul du rack.
  7.         },
  8. },
复制代码
RackBones défini quel(s) bone(s) de l'unité correspond à quel partie de l'arme dans le code.
(!) Il est difficile d'y voir clairement (et donc pour moi d'expliquer) le comportement résultant de cette partie du code. Aussi je conseil d'aller regarder et comparer l'armature de différentes armes par rapport à leurs code propre, ou de vous rendre en bas de cette page pour télécharger mon mod créé à cet effet, pour bien comprendre la relation de chacun de ces éléments.
  1. RackFireTogether = false,        tir simultané de tout les canons associé au rack?
  2. RackRecoilDistance = 0,                distance de recul du cannon quand l'arme tire.
  3. RackReloadTimeout = 10,                temps avant que le rack se remette à zéro.
  4. RackSalvoChargeTime = 0,        temps avant que le rack commence à tirer.
  5. RackSalvoReloadTime = 0,        temps mis par le racks avant son prochain cycle charge/salve.
  6. RackSalvoSize = 1,                nombre de fois que le rack va tirer avant de recharger.
  7. RackSlavedToTurret = false,        le rack est il solidaire de la tourelle?
复制代码
RackFireTogether permet de lier ou non tout les racks qui composent l'arme afin qu'il tirent à l'unisson (s'il est positionné à true) ou les uns aprés les autres (s'il est positionné à false). RackReloadTimeout est utilisé si tout les projectiles n'ont pas été tirés afin de réinitialiser l'arme.
  1. TurretBoneMuzzle = 'Turret_Muzzle',       
  2. TurretBonePitch = 'Turret_Barrel',       
  3. TurretBoneYaw = 'Turret',                       
  4. TurretDualManipulators = false,                2 "manipulateurs"? (bras de robot).
  5. TurretPitch = 0,                        angle central de rotation en X.
  6. TurretPitchRange = 60,                        angle ajouté ou soustrait à l'angle X central                                         (défini la plage de rotation).
  7. TurretPitchSpeed = 60,                        vitesse de rotation en X.
  8. TurretYaw = 0,                                angle central de rotation en Y.
  9. TurretYawRange = 180,                        angle ajouté ou soustrait à l'angle Y central                                        (défini la plage de rotation).
  10. TurretYawSpeed = 90,                        vitesse de rotation en Y.
  11. Turreted = true,                        arme équipée d'une tourelle?.
复制代码
Finissons avec la section Weapon du script LUA.
  1. local TStructureUnit = import('/lua/terranunits.lua').TStructureUnit
  2. local TDFLightPlasmaCannonWeapon = import('/lua/terranweapons.lua').TDFLightPlasmaCannonWeapon

  3. UEB2101 = Class(TStructureUnit) {
  4.     Weapons = {
  5.         MainGun = Class(TDFLightPlasmaCannonWeapon) {}
  6.     },
  7. }

  8. TypeClass = UEB2101
复制代码
On retrouve notre arme sous le nom MainGun.
  1. Weapons = {
  2.         MainGun = Class(TDFLightPlasmaCannonWeapon) {} déclaration de l'arme utilisée.
  3. },
复制代码
Bien sûr pour pouvoir déclarer correctement une arme il faut l'importer au préalable (voir ligne 2 du script UEB2101_Script.lua)
  1. local TDFLightPlasmaCannonWeapon = import('/lua/terranweapons.lua').TDFLightPlasmaCannonWeapon
复制代码
Le petit plus
En complément j'ai créé un petit mod pour bien comprendre le comportement du code. Il ajoute 8 pointes de défense T1 UEF calquées sur l'originale avec quelques différences de code ou d'armature afin de couvrir le plus de cas de figure possible.
● Canon n°1: (UEB2101a) modification de l'armature de base (3 canons).
● Canon n°2: (UEB2101b) même armature que le canon n°1.
● Canon n°3: (UEB2101c) modification de l'armature du canon n°1.
● Canon n°4: (UEB2101d) même armature que le canon n°3; RackFireTogether mis à "true".
● Canon n°5: (UEB2101e) armature de base.
● Canon n°6: (UEB2101f) armature de base; Rayon plasma UEF discontinu.
● Canon n°7: (UEB2101g) armature de base; Rayon laser Cybran continu.
● Canon n°8: (UEB2101h) armature de base; Rayon laser Aeon Continu.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-25 14:55 | 显示全部楼层
本帖最后由 MAXUF 于 2012-12-1 18:18 编辑

操作武器:
Fonctionnement des armes
Introduction
Dans supcom, la quasi-totalité des unités possèdent au moins une arme sinon plusieurs. Il y en a de différentes sortes: automatique, manuel, fixe ou mobile, à projectile ou rayon etc. C'est pour cela qu'il est nécessaire de bien comprendre comment elles fonctionnent.
Base théorique
les armes sont définies dans le blueprint de l'unité dans la catégorie Weapon (vers la fin du fichier) ainsi que dans le script LUA de l'unité. Chaque arme nécessite un projectile pour fonctionner (sauf pour les armes à rayon laser).
(!) Les scripts liés aux armes se trouvent dans lua/terranweapons.lua, lua/cybranweapons.lua, lua/aeonweapons.lua et lua/seraphimweapons.lua.
Chaque unité peut posséder plus d'une seule arme. Dans ce cas la structure à adopter dans le blueprint est la suivante:
  1. Weapon = {
  2.         { attributs de l'arme n°1 },
  3.         { attributs de l'arme n°2 },
  4.         { attributs de l'arme n°3 },
  5. },
复制代码
Mécanique d'une arme
Une arme est composée de 4 parties:
Turret: la tourelle.
Rack: le support.
Barrel: le canon.
Muzzle: la bouche du canon.
Une arme peut contenir un seul ou plusieurs racks, chaque rack contient plusieurs muzzles. Si l'arme ne possède qu'un muzzle alors le rack est inutile. les racks sont contrôlés par la cadence de tir de l'arme. Les muzzles sont contrôlés par le rack ainsi que par leurs nombre de tirs consécutifs (salvo size).
(!) Les rack servent donc principalement à grouper plusieurs canons ensemble pour créer des effets plus élaborés comme des tirs séquentiels etc.
Une arme se déplie (unpack), se charge, tire, recharge et se replie (repack) dans cet ordre. Le pliage/dépliage (unpacking/packing) survient dés que l'arme verrouille une cible.
Observation pratique
Amusons nous avec une arme simple à manipuler: la pointe de défense T1 UEF (UEB2101).


Importons-la dans blender et observons son armature:

Plusieurs choses sont à noter. Tout d'abord le nom des bones composant l'armature:
UEB2101 qui est le bone racine.
Turret qui est associé à la tourelle.
Turret_Barrel qui est associé au canon.
Turret_Muzzle qui constitue le point de sortie du projectile.
Poursuivons avec la hiérarchie des bones. Ils sont liés entre eux par un segment en pointillé. On peut comprendre cette armature comme ceci:
UEB2101 est le bone racine.
Turret est le bone enfant de UEB2101.
Turret_Barrel est le bone enfant de Turret.
Turret_Muzzle est le bone enfant de Turret_Barrel.
C'est cette liaison hiérarchisée de bones qui va permettre à l'arme de se mouvoir correctement. Ainsi si je fais faire une rotation sur l'axe X à Turret alors Turret_Barrel et Turret_Muzzle suivront le mouvement car ce sont tout deux des bones enfant par rapport à Turret tandis que UEB2101, lui, restera fixe car il n'est pas enfant de Turret.
Cette structure se retrouve également dans l'outliner de blender comme le montre la capture ci-dessous:


Dernière chose importante mise en évidence par ces images: les axes X, Y et Z qui définissent l'orientation des bones. Ci-dessous, une capture supplémentaire montre que chaque bone affiche son orientation dans l'espace au moyen d'un repère XYZ individuel.

/!\ L'orientation XYZ des bones est différente de l'orientation XYZ de la vue de blender. Dans cette dernière les axes Y et Z sont intervertis.
Pour comparer voici le rendu de l'armature dans le jeu:


Rien ne change par rapport à la visualisation dans Blender si ce n'est que les axes des bones ne sont pas écrit mais repéré par un code couleur:
X est en rouge.
Y est en vert.
Z est en bleu.
Quand l'armature de l'arme bouge le maillage doit agir de même, il faut donc que les deux soient liés. Le lien entre l'armature et le maillage réside dans les groupes de point (Cf "Maillage, armature et groupes de points") et le nom qu'ils portent, ceux-ci étant scrupuleusement identique à leurs bones respectif.
Ci-dessous on pourra observer les groupes de points sélectionnés successivement




On remarque enfin que la tourelle entre en rotation sur l'axe X (on rencontre le terme pitch) tandis que le canon tourne sur l'axe Y (on rencontre le terme yaw). L'axe Z, lui, est très important car c'est sur celui-ci que se déplace les projectiles (et les rayons laser) des armes et ce sans la moindre exception!
Côté code
Continuons nos observations du côté du code. Commençons par observer ce que renferme la section Weapon du fichier blueprint de la pointe de défense T1 UEF.

UEB2101_unit.bp
  1. Weapon = {
  2.         {
  3.                 AboveWaterTargetsOnly = true,
  4.                 Audio = {
  5.                         Fire = Sound {
  6.                                 Bank = 'UELWeapon',
  7.                                 Cue = 'UEB2101_Cannon_Sgl',
  8.                                 LodCutoff = 'Weapon_LodCutoff',
  9.                         },
  10.                 },
  11.                 BallisticArc = 'RULEUBA_LowArc',
  12.                 CollideFriendly = false,
  13.                 Damage = 50,
  14.                 DamageType = 'Normal',
  15.                 DisplayName = 'Light Plasma Cannon',
  16.                 FireTargetLayerCapsTable = {
  17.                         Land = 'Land|Water|Seabed',
  18.                         Water = 'Land|Water|Seabed',
  19.                 },
  20.                 FiringTolerance = 2,
  21.                 Label = 'MainGun',
  22.                 MaxRadius = 26,
  23.                 MuzzleSalvoDelay = 0,
  24.                 MuzzleSalvoSize = 1,
  25.                 MuzzleVelocity = 35,
  26.                 ProjectileId = '/projectiles/TDFPlasma01/TDFPlasma01_proj.bp',
  27.                 ProjectileLifetimeUsesMultiplier = 1.15,
  28.                 ProjectilesPerOnFire = 1,
  29.                 RackBones = {
  30.                         {
  31.                                 MuzzleBones = {
  32.                                         'Turret_Muzzle',
  33.                                 },
  34.                                 RackBone = 'Turret_Barrel',
  35.                         },
  36.                 },
  37.                 RackFireTogether = false,
  38.                 RackRecoilDistance = 0,
  39.                 RackReloadTimeout = 10,
  40.                 RackSalvoChargeTime = 0,
  41.                 RackSalvoReloadTime = 0,
  42.                 RackSalvoSize = 1,
  43.                 RackSlavedToTurret = false,
  44.                 RangeCategory = 'UWRC_DirectFire',
  45.                 RateOfFire = 3,
  46.                 ReTargetOnMiss = true,
  47.                 TargetCheckInterval = 0.25,
  48.                 TargetPriorities = {
  49.                         'SPECIALHIGHPRI',
  50.                         'MOBILE',
  51.                         'STRUCTURE DEFENSE',
  52.                         'SPECIALLOWPRI',
  53.                         'ALLUNITS',
  54.                 },
  55.                 TargetRestrictDisallow = 'UNTARGETABLE',
  56.                 TrackingRadius = 1.15,
  57.                 TurretBoneMuzzle = 'Turret_Muzzle',
  58.                 TurretBonePitch = 'Turret_Barrel',
  59.                 TurretBoneYaw = 'Turret',
  60.                 TurretDualManipulators = false,
  61.                 TurretPitch = 0,
  62.                 TurretPitchRange = 60,
  63.                 TurretPitchSpeed = 60,
  64.                 TurretYaw = 0,
  65.                 TurretYawRange = 180,
  66.                 TurretYawSpeed = 90,
  67.                 Turreted = true,
  68.                 WeaponCategory = 'Direct Fire',
  69.                 WeaponRepackTimeout = 0,
  70.                 WeaponUnpacks = false,
  71.     },
  72. },
复制代码
Cette portion de code renferme beaucoup de choses intéressante mais commençons par la ligne 21. C'est la plus importante pour comprendre le fonctionnement du code.
  1. Label = 'MainGun',
复制代码
Concrétement cette ligne dit que l'arme s'appel MainGun et c'est ce nom qui va lier le code du blueprint de cette arme au code LUA. Ainsi le script est capable d'identifier l'arme en question dans le blueprint, sans celà l'arme ne fonctionnerait pas.
Ensuite à la ligne 26 on trouve l'argument qui désigne le projectile utilisé.
  1. ProjectileId = '/projectiles/TDFPlasma01/TDFPlasma01_proj.bp',
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-11-26 08:14 | 显示全部楼层
本帖最后由 wangyaoalan 于 2012-11-26 08:18 编辑

好东西呀!!!!!要是能把开发用的软件提供直接下载地址,并给予一定的中文或哪怕英文翻译,就是神帖啦,楼主,你整个法语的帖子,这不是坑爹吗!!!{:7_356:} 我连2%都看不懂,学的那点法语早还给老师了,如今只能看图说话。。。{:7_335:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-26 10:37 | 显示全部楼层
wangyaoalan 发表于 2012-11-26 08:14
好东西呀!!!!!要是能把开发用的软件提供直接下载地址,并给予一定的中文或哪怕英文翻译,就是神帖啦, ...

谷歌在线翻译(法语译中文):
http://translate.google.com.hk/t ... read-21066-1-1.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|横扫天下会 最高指挥官 ( 沪ICP备11033600号-1 )

GMT+8, 2020-4-4 12:37 , Processed in 0.031148 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表