J'ai créé une simple map de test consistant en
un peu de BSP, une skylight, un playerstart, un skydome et une
DirectionalLight.
Je vais seulement utiliser des éléments de base
de l'éditeur qui se trouvent dans les packages officiels.
Je vais seulement utiliser des movers/Interpactors (cela revient
au même) qui sont généralement animés
avec Matinee. Si vous avez besoin d'apprendre à utiliser
Matinee, je vous recommande le Tutorial
de Hourences comme point de départ..
J'ai ajouté un static de vitre trouvé dans le
package HU_Deck et dans le sous répertoire SM/Meshes
(S_HU_Deck_SM_Fwindow_Glass). Pour arriver à "casser"
des vitres, il existe plusieurs solutions. Je vais seulement
expliquer la manière la plus simple pour l'instant. Il
existe d'autres méthodes plus réalistes, mais
ce gain en réalisme et en qualité visuelle ne
contrebalance pas vraiment le coût très élevé
en terme de performances. Si vous avez absolument besoin d'utiliser
une de ces méthodes plus réalistes alors je vous
conseillerais de le faire de façon limitée et
dans des lieux isolés.
*Note : En utilisant le tutorial sur les Destructions,
vous devriez pouvoir faire ceci tout seul en utilisant les informations
fournies dans ce tutorial. En fait, je vous conseille même
d'essayer de le faire de cette manière. Cependant, du
fait du grand nombre de demandes pour ce système en particulier,
je me suis senti un peu obligé d'en faire un tutorial
spécifique.
Vitres Destructibles: Quand le joueur ou des
bots, tirent dans la vitre, cela va entraîner sa destruction.
J'ai créé un système simple.
Utilisons notre "recette de cuisine" que j'ai présenté
dans l'Introduction
de cette série de tutoriaux:
1) Que souhaitons nous faire ?
Des vitres destructibles.
2) Ingrédients :
1 interpactor (vitre)
2 emitters (éclats de verre)
1 action Destroy
1 action Toggle
1 event Take Damage
1 action PlaySound
3) Mélangeons le tout : j'ai placé mon interpactor/vitre,
et j'ai créé un encadrement en BSP autours. Puis
j'ai placé les deux emitters au milieu de la vitre, un
peu espacés l'un de l'autre pour donner l'impression
que les éclats viennent de la vitre complète.
J'ai désactivé AuotActivate dans les propriétés
des emitters.
|
|
Du côté de Kismet, je vais créer l'event
Take Damage à partir de l'interpactor vitre (vérifiez
que sa collision est réglée sur bBlockAll). Je
vais donc détruire l'interpactor et déclencher
les emitters. Je n'oublie pas de mettre à 0 le MaxTriggerCount
de l'event Take Damage, je règle également son
DamageTreshold à 50 et je décoche le bPlayerOnly.
Je vais ensuite ajouter un PlaySound pour le son de la vitre
cassée lorsque le système est déclenché.
|
|
4) Testez dans le jeu, cela fonctionne bien pour moi.
5) Ajustez votre système. D'abord, n'oubliez pas les
problèmes de collision de vos movers et leur éclairage.
Ensuite, pensez aux problèmes potentiels. Honnêtement,
je ne vois trop de problèmes avec ce système.
Mais si nous voulions que la vitre réapparaisse après
un certain temps ? Comment peut-on la ressusciter ? La réponse
est qu'on ne peut pas. Alors au lieu de la détruire et
d'essayer de la ressusciter, nous pouvons plutôt donner
l'illusion qu'elle a été détruite et donc
pouvoir la faire réapparaître quand on veut. Retournons
donc à l'étape 2 et ajoutons d'autres ingrédients
à notre recette:
2) Ingrédients supplémentaires :
1 Toggle
2 Toggle Hidden
2 Change Collision
1 Delay
3) Mélangeons le tout. Lorsque l'event Take Damage se
déclenche, il se désactivera de lui-même
par l'intermédiaire d'un Toggle. Au même moment,
nous allons supprimer la collision de la vitre avec un Change
Collision (dans lequel j'ai décoché Block Actors
et Collide Actors). Toujours au même moment, nous allons
rendre l'interpactor vitre invisible avec le Toggle Hidden et
déclencher les emitters. Ensuite, nous allons ajouter
le Delay que l'on règle à 60 secondes. Si vous
le vouliez, vous pourriez faire un retard aléatoire en
connectant un Random Float sur le Target du Delay. Après
le Delay, nous allons rendre l'interpactor de nouveau visible
et lui rendre sa collision (cochez Block Actors et Collide Actors
dans les propriétés du Change Collision) et également
réactiver l'event Take Damage par l'intermédiaire
du Toggle.
|
|
4) Testons le. Lancer le jeu et testez le, cela marche bien
pour moi.
5) Ajustez votre système. D'abord, n'oubliez pas les
problèmes de collision de vos movers et leur éclairage.
Ensuite, pensez aux problèmes potentiels. Honnêtement,
je ne vois trop de problèmes avec ce système.
6) Ajustements pour les modes solo/multi-joueur. Comme vous
l'avez peut-être lu dans la section Mode
Solo/Co-op/Multi-joueur, il y a beaucoup de considérations
à prendre en compte quelque soit le mode choisit. Ce
système tel qu'il est là devrait être OK,
et pour le mode solo, et pour le mode multi-joueur. Mais vous
aurez quand même à vous poser quelques questions.
Que se passe t-il si un ou plusieurs joueurs se trouvent dans
la zone de la fenêtre quand celle-ci est détruite
ou lorsqu'elle réapparaît ? En fait, j'en sais
rien, vous aurez donc à le trouver par vous-même.
Vous cherchez à avoir quelque chose de plus réaliste?
Ce qui suit est sûrement possible, mais encore une fois,
je ne vous le conseille pas pour des raisons de performances.
Au lieu de suivre la méthode simple ci-dessus, et seulement
si vous savez modéliser, il est possible de créer
une vitre pré-brisée et importer les morceaux
un par uns. Ensuite vous pouvez changer tous ces morceaux en
Kactors et assembler pour reconstituer une vitre complète.
Vous pouvez ensuite les configurer pour qu'ils répondent
à des events Take Damage, leur assigner un glass physical
material, et permettre qu'on puisse leur tirer dessus individuellement.
Problèmes potentiels de cette méthode :
- pas d'emitter de vitre cassée. Vous auriez à
connecter beaucoup de ces morceaux (si ce n'est tous) à
des Toggles pour activer des emitters "individuels"
et la superposition de tous ces enchaînements (tirs, morceaux
de vitre détruits, déclenchements d'emitters)
pourrait créer des anomalies et rendre le tout pas si
réaliste que ça.
- Si vous mettez beaucoup de morceaux, il se peux vous vous
retrouviez avec la situation où vous aurez des morceaux
situés au centre de votre vitre, et qui n'auraient pas
reçu de dégâts, se retrouvant à flotter
de façon très peu réaliste alors que tous
les autres morceaux autour auraient été détruits.
Pour palier à ce problème, vous pouvez connecter
des events Take Damage à chaque morceau et tous les régler
sur RB_RadialImpulse, ce qui va propager les dégâts
aux alentours.
SI vous voulez tout de même garder des morceaux sur la
périphérie de votre fenêtre mais en gardant
un système simple comme expliqué plus haut, vous
aurez besoin de deux meshes, un pour la vitre entière
et un second pour la vitre cassée. Vous pouvez facilement
cacher la version cassée et la rendre visible lors de
la destruction.
|