Unity TP3 Librement adapté et traduit de http://unity3d.com/learn/tutorials/modules/beginner/physics/assignments/bouncing-ball http://docs.unity3d.com/documentation/manual/instantiatingprefabs.html http://3dfoin.com/index-3.html LE MAGICIEN BOXBOY Ouvrez votre scène BoxBoy. Créez sur cette scène un ThirdPersonController de la même manière que vous avez défini un FirstPersonController le TP précédent. Placez la lumière ponctuelle sous le TPC pour que notre avatar puisse avoir de la lumière partout il ira! Le but de cette partie est de se déplacer dans l espace en évitant les obstacles (cubes et sphères) et en essayant de trouver le BoxBoy magicien qui pourra nous donner la lampe magique. Tout un programme! J Nous allons d abord améliorer l apparence des obstacles. Les Materials et les Shaders permettent, dans Unity, de donner une «apparence» aux objets. Les Materials sont liés aux GameObjets. Les Shaders contiennent du code (la méthode permettant de réaliser le rendu de l objet), les programmes vertex et fragment nécessaires au rendu et des propriétés. Le Material, lui, vous permet d ajuster ces propriétés et d assigner les assets (textures, couleurs, cubemap, ). Créer un Material ( clic droit sur Assets, puis Create > Material). Regardez le Material dans l Inspector, il utilise par défaut le shader Diffuse. Modifiez le shader à «Specular» et définissez la couleur principale et celle des reflets. Jouez un peu avec les réglages des shaders pour expérimenter et pour rendre l objet plus «joli». 1
Associez le matériau créé au cube en utilisant l Inspector : Créez une sphère et modifiez son apparence avec un nouveau matériau. Associez également un RigidBody à la sphère (sélectionnez- la dans l hiérarchie et puis cliquez sur Component > Physics > RigidBody). Testez la scène. La sphère ne se comporte pas de manière très réaliste! Nous allons améliorer cela grâce aux Physic Materials. Créez un nouveau PhysicMaterial (clic droit sur Assets, puis Create > PhysicMaterial) et associez- le au SphereCollider de la sphère. Modifiez dans le matériau la propriété bounciness. Testez le jeu. Vous pouvez augmenter l intensité des rebondissements en modifiant la propriété bouncecombine à «maximum». Voilà qui est mieux!! 2
Créez un prefab pour la sphère et effacez- la ensuite de la scène. Créez un nouveau script pour programmer la création et le placement aléatoire des «sphères - météorites» : (Attention : vous devez modifier tous les scripts de ce TP pour adapter les dimensions et positions à votre scène!) public var prefabsphere : GameObject; public var numberofobjects = 20; public var minx = -25 ; //adaptez aux dimensions de votre plan! public var maxx = 25; public var minz = -25 ; public var maxz = 25 ; public var t = 1 ; public var y = 10; function Start () { for (var i = 0; i < numberofobjects; i++) { yield WaitForSeconds(t); var randompos = Vector3(Random.Range(minX, maxx), y, Random.Range(minZ, maxz)); Instantiate(prefabSphere, randompos, Quaternion.identity); Créez un GameObject vide et associez le script. Modifiez les paramètres pour faire correspondre le prefab sphère à la variable prefabsphere du script et pour affiner l effet (plus ou moins de temps entre deux créations, plus ou moins d objects, ). Testez votre jeu! Créez maintenant un nouveau script permettant de placer plusieurs boxboy en cercle : public var prefabclone : GameObject; public var numberofobjects = 10 ; public var radius = 5; function Start () { for (var i = 0; i < numberofobjects; i++) { var angle = i * Mathf.PI * 2 / numberofobjects; var pos = Vector3 (Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius; Instantiate(prefabClone, pos, Quaternion.Euler(-90,0,0)); Glissez le script dans le GameObject vide et faites correspondre le prefab BoxBoy à la variable prefabclone. 3
Testez votre jeu! Dans les deux scripts précédents, nous avons utilisé de quaternions. En effet, Unity utilisé les quaternions pour représenter toutes les rotations. Cet outil mathématique est utilisé pour représenter les rotations, ils permettent, entre autres, de faire facilement une interpolation entre deux rotations. Vous utiliserez «99% du temps» 1 les fonctions suivantes : Quaternion.LookRotation, Quaternion.Angle, Quaternion.Euler, Quaternion.Slerp, Quaternion.FromToRotation et Quaternion.identity. La variable Quaternion.identity signifie qu il n y a pas de rotation, tandis que la fonction Quaternion.Euler(x,y,z) permet de définir une rotation de x degrés autour de l axe x, y degrés autour de l axe y et z degrés autour de l axe z. Cela nous a permis, dans le second script, de remettre droit notre modèle boxboy! LA LAMPE MAGIQUE Importez le package MagicLamp et ajoutez à la scène l un des modèles disponibles (LOD0 1898 tris, LOD1: 1200 tris, LOD2: 800 tris). Ajoutez à la lampe un système de particules (menu Component > Effects > ParticleSystem). Décochez l option Looping pour avoir un nombre fini de particules. Vous pouvez jouer avec l éditeur pour créer des courbes pour guider la vitesse et autres paramètres. Cela vous permet de tester les courbes par morceaux ;) tout en créant des effets sophistiques! 1 http://docs.unity3d.com/documentation/scriptreference/quaternion.html 4
Glissez votre lampe magique dans un nouveau prefab et effacez- la ensuite. Ajoutez maintenant à l objet BoxBoy un Boxcollider. Activez l option istrigger qui nous aidera à reconnaître le contact avec le joueur. Augmentez la taille du BoxCollider (avec la touche Majuscules et la souris) pour détecter la collision avant de toucher BoxBoy. Créez le script ci- dessous et associez- le à BoxBoy. Il nous permet de détecter la présence de l avatar dans le boxcollider et de le laisser s emparer de la lampe! Lorsque nous associons la transformation de la lampe à celle du joueur (graphe de scène), toutes les transformations du joueur lui seront propagées. Vous pouvez modifier le script pour détruire la lampe au lieu de la transporter. public var prefablamp : GameObject; var lamp : GameObject; function OnTriggerEnter( other : Collider ) { if (other.gameobject.comparetag ("Player")) { var pos = Vector3(transform.position.x, transform.position.y+2, transform.position.z-2); lamp = Instantiate(prefablamp, pos, Quaternion.Euler(-90,90,0)); ; // GameObject mybrick = Instantiate(brick, Vector3 (0, 0, 10), Quaternion.identity) as GameObject; // faisons disparaitre le magicien! et attrapons la lampe! function OnTriggerExit (other : Collider) { if (other.gameobject.comparetag ("Player")) { Destroy(gameObject); lamp.transform.parent=other.gameobject.transform; lamp.transform.localposition=vector3(0.5,0,0); 5
Pour finir avec cette scène, créez un nouveau matériau avec une texture (grid.png par exemple) à appliquer sur le plan. BESOIN DE PIECES EN OR? Dans cette partie nous allons récolter quelques pièces d or ;) dans notre scène terrain. Téléchargez d abord les textures «or» du site du TP. Unity accepte plusieurs formats d images : psd, tiff, jpg, tga, png, gif, bmp, iff, pict. La taille des textures doit être une puissance de deux, mais elles n ont pas besoin d être carrées. Les images avec plusieurs calques seront «aplaties» avant d être utilisées. Nous allons créer (encore!) un Prefab «Coin» pour réaliser nos pièces d or. Pour cela, créez un cylindre (menu GameObject > Create Other > Cylinder) et modifiez- le pour qu il ait la forme d une pièce. Créez le Prefab et glissez le cylindre vers lui. Créez un dossier «Textures» dans votre vue Project et rajoutez les textures «or». Puis, collez la texture de votre préférence sur le cylindre, en la glissant de la vue Project jusqu à l objet. La texture s applique et, plus intéressant, un nouvel élément apparaît dans le projet : un matériau (material)! En effet, les textures font toujours partie d un Material. Maintenant, dans le Collider du prefab Coins, cliquez sur la case Trigger pour l activer. Puis, créez un nouveau script Javascript et appelez- le CoinBehaviour. Il nous permettra de «désactiver» la pièce une fois qu elle sera trouvée : 6
var world : GameObject; function Start() { world = GameObject.Find("World"); function OnTriggerEnter( other : Collider ) { world.sendmessage("addcoin"); renderer.enabled = false; collider.enabled = false; // Destroy(gameObject); if ( audio ) { audio.play(); Liez votre script à l objet Coin. Pour que le son fonctionne, téléchargez le fichier coinsound.wav et rajoutez- le à votre projet. En gardant le prefab Coin sélectionné, créez ensuite un composant audio (menu Component > Audio > Audio Source). Glissez le fichier coinsound.wav vers le champ AudioClip. Enlèvez l option Play on Awake. Ajoutez plusieurs pièces à votre scène. Nous allons créer maintenant l objet «World». Créez un nouveau GameObject vide et appelez- le World. Puis, créez un script pour cet object, World.js avec le code suivant : var coins : int = 0; function AddCoin () { coins++; function OnGUI() { GUI.Label( Rect( 0, 0, 100, 100 ), "COINS:"+coins); Testez votre jeu et puis ajustez si nécessaire les paramètres du collider du prefab Coin. a vendredi prochain! 7