Eteindre/allumer les lumières
Introduction
Comme vous le savez certainement, le défaut majeur des lumières d'UT2003/2004/Unreal 2, c'est que les lumières sont désormais fixes. Ce n'est pas fait uniquement pour vous compliquer la vie : dans un jeu comme Quake 3, Unreal 1 ou autre Half-Life, le nombre relativement limité de polygone permet au prix de quelques ressources système, de calculer a chaque instant l'éclairage sur chaque face de l'environnement. Mais voila, sous notre moteur favoris, la multiplication du nombre de polygones a conduit a des solutions extrêmes : non seulement l'éclairage des Static Mesh est très général et peut donner lieu a des bugs, mais en plus, les brush, afin d'éviter de recalculer les lightmaps a chaque frame, n'acceptent plus les lumières dynamiques.
En fait, ce n'est pas tout a fait ça : pour éviter de devoir recalculer les lightmap a chaque frame, les effets de lumières dynamiques ont été désactivé sur la plupart des actors de lumières, sauf UN : le Triggerlight.
Triggerlight
Le Triggerlight se trouve ici dans l'actor browser :
Le Triggerlight est une lampe très spécifique. Pour vous en convaincre, soustrayez un cube de 384*1024*1024 et texturez-le, puis ajoutez-y une map normale et votre trigger light. Recompilez et observez :
Comme vous le voyez, l'éclairage diffusé par le Triggerlight est plus diffus, plus lisse, plus doux. Si vous placez les deux lumières contre le sol, vous verrez que la light normale sera environnée d'un cercle de lumière forte, alors que la Triggerlight aura une lumière plus égale et plus étendue. En effet, pour ne pas détruire complètement les performances d'une carte a cause de la recompilation, les Triggerlight sont très simplifiées. Impossible par exemple d'obtenir des ombre très détaillés avec, alors que c'est possible avec une lumière statique :
Là, c'est particulièrement flagrant : votre map normale est calculé une seule fois, donc le moteur se casse les pieds pour la compilation, et après, il oublie. Pour la Triggerlight, comme il faut sans cesse refaire le calcul, on simplifie et donc on oublie les ombres trop compliquées. Maintenant, voyons un peu les propriétés spéciales du Triggerlight : Ce dernier a en effet un onglet supplémentaire par rapport a la light normale : l'onglet "Triggerlight" (comme c'est original).
- bDelayFullOn: donne un temps d'attente avant que la lumière ne s'allume (ou ne s'éteigne).
- bInitiallyOn : si mise sur vrai, cette propriété allume la lumière des le début du jeu. Si mise a non, elle est éteinte et attend d'être activée.
- ChangeTime : temps (en secondes) mis par la lampe pour passer de l'état éteint a l'état allumé.
- RemainOnTime : temps en seconde pendant lequel la lampe reste allumée avant de s'éteindre. Si vous laissez "0", la lampe reste allumée indéfiniment une fois activée.
Placez votre lumière dans un coin de la pièce. Pour l'allumer, on va faire simple : vous marcherez sur un trigger, et ce dernier activera la lumière. Pour ce faire, placez un trigger dans la pièce et dans ses propriétés, onglet "Advanced", mettez bHidden a "faux" : ainsi, le trigger sera visible dans le jeu. Dans les propriétés de la lampe (que vous pouvez modifier comme une lampe normale pour tout ce qui est couleur et puissance), allez dans Object, et changez Initialstate à TriggerToggle. Ainsi, la lampe changera d'état dès que vous passerez sur le trigger. Dans l'onglet "Triggerlight", changez Changetime a 0.25, "bInitiallyOn" a faux et laissez "bDellayFullOn" a faux. Pour finir, dans l'event du trigger, mettez "Lux" (sans guillemet), et faites la même chose dans le tag du Triggerlight.
Ajoutez un playerstart, rebuildez et testez :
Comme vous voyez, ca marche ! vous pouvez changer cela comme vous le voulez, en mettant par exemple des Light Type dans la lumière, changer la couleur, le rayon, la direction si vous en faites un spotlight, le faire commander par un UseTrigger si vous voulez, bref, les possibilités sont multiples a partir de cet exemple. Juste quelques précisions :
Tout d'abord, la propriété InitialState des TriggerLight. Elle possède plusieurs sortes que voici :
- None : la Triggerlight ne change pas et n'est pas reliée a un trigger.
- TriggerPound : semble ne pas avoir d'effet.
- TriggerControl : gardez la touche "utiliser" enfoncée dans le cas d'un usetrigger), la lampe reste allumée (ou éteinte suivant que vous avez mis vrai ou faux dans bInitiallyOn). L'effet cesse des que le trigger n'est plus activé (que vous bougez ou que vous lâchez la touche utiliser dans notre exemple).
- TriggerToggle : lorsque le trigger est activé, il agit sur la lampe, puis il attend d'être réactivé (que vous ayez lâché puis renfoncé la touche utiliser, ou que vous soyez partit puis revenu dans son champ d'action par exemple) pour modifier de nouveau la lampe.
- TriggerTurnsOff et TriggerTurnsON : permet de faire en sorte qu'un trigger ne puisse qu'allumer ou éteindre la lampe. Peu d'intérêt.
Un autre point important est que quand vous recompilerez vos lumières, dans l'éditeur, les Triggerlight auront toujours l'air d'être allumé, mais dans le jeu, ne vous inquiétez pas, c'est bien votre choix dans bInitiallyOn qui est déterminant. Rappelez-vous que les lumières dynamiques consomment beaucoup de ressources si vous en utilisez trop. De plus, elles possèdent un défaut majeur qui devrait de toute façon limiter leur emploi :
On ne dirait pas sur cette image, mais les deux pièces sont complètement séparées, il n'y a qu'une trigger light dans la pièce de gauche, et j'ai effectivement rebuildé. Les Triggerlight émettent a travers les murs. C'est d'ailleurs pour cela qu'elles ne projettent pas d'ombre. Faites donc bien attention a leur emploi, n'utilisez que de faibles rayons pour de petites zones, ou alors concevez votre map de manière a ce que ca ne soit pas un problème.