Cet article a fait l'objet d'une traduction automatique.
Unity
Développer votre premier jeu avec Unity et C# - Partie 3
Vous êtes toujours avec moi dans cette série. Bonne. Dans le premier article, j'ai abordé certaines notions de base de l'unité (msdn.microsoft.com/magazine/dn759441). Dans la seconde, je me suis concentré sur la 2D dans l'unité (msdn.microsoft.com/magazine/dn781360). Maintenant j'arrive à ma partie préférée de développement de jeux — 3D. Le monde de la 3D est un endroit vraiment magique — incroyables environnements immersifs, bruitages riches et belle visuels — même juste un jeu de puzzle simple avec la physique du monde réel peut vous tenir accroché pendant des heures.
Jeux 3D certainement ajoutent une couche de complexité sur 2D, mais en prenant ce morceau par morceau, vous pouvez construire un jeu cool 3D. Nouveaux paramètres de projet pour en 2D ou en 3D dans l'unité prend en charge la 3D. Vous pouvez avoir des objets 3D dans un jeu en 2D (et vice versa).
Ce qui compose une scène 3D ?
Scènes 3D consistent principalement en des trois principaux composants visuels — lumières, mesh convertisseurs et les shaders. Une lumière est, Eh bien, une lumière et l'unité prend en charge quatre types différents. Vous pouvez les trouver sous le menu GameObject. Expérimenter avec l'ajout de différents types et en modifiant leurs propriétés. Le plus simple pour éclairer votre scène est une lumière directionnelle, qui est comme le soleil dans le ciel.
Une maille (ou modèle) est une collection de sommets qui composent les polygones qui composent un objet. Un shader est une routine compilée qui contient le code pour contrôler comment votre objet sera afficher ou interagissent avec la lumière. Certains shaders simplement prennent la lumière et il reflètent comme un miroir ; d'autres prennent une texture (une image à appliquer à votre maillage) et peuvent activer les ombres et la profondeur ; et certains même vous permettent de découper visuelle par le biais de vos modèles, comme une clôture.
Modèles sont généralement des fichiers FBX ou d'articles exportés depuis un autre logiciel de modélisation. Fichiers FBX peuvent également contenir des données de l'animation, alors vous risquez de recevoir un fichier FBX pour votre modèle et l'autre contenant plusieurs animations. Plusieurs formats de fichiers tiers sont également pris en charge, tels que le format de .ma Autodesk Maya et fichiers Blender. Vous devez généralement le programme tiers installé sur le même système si vous voulez l'unité d'importer ces fichiers, et puis c'est tout simplement une question de glisser et en les déposant dans votre projet de l'unité, tout comme vous le feriez pour tout autre fichier. Dans les coulisses, l'unité va convertir formats de fichiers (sur l'importation ou la détection des modifications apportées au fichier) dans le format de fichier FBX.
Asset Store
J'ai touché sur l'Asset Store dans mon premier article, mais dans les jeux 3D est où c'est vraiment pratique. Je ne suis pas un artiste, et parce qu'il s'agit d'une revue technique, je suppose que la plupart d'entre vous ne sont pas, non plus. (Si vous êtes, s'il vous plaît accepter mes félicitations, vous faites partie d'un groupe rare.) Mais si je veux créer un jeu avec des environnements luxuriants et de vieux bâtiments détruits, par exemple, il n'est pas un problème. Je peux acheter ce que j'ai besoin de l'Asset Store. Si je veux 15 zombies différents, je peux obtenir un pack de Mixamo dans le magasin actif. Les combinaisons possibles sont presque infinies, donc ne vous inquiétez pas sur quelqu'un d'autre jeu à la recherche comme la vôtre. Le meilleur de tous, l'Asset Store s'intègre dans l'unité. Vous pouvez mettre à jour vos paquets en cliquant sur fenêtre | Asset Store, puis sur l'icône bin. Vous pouvez également consulter les critiques et commentaires à plus facilement déterminer si un élément particulier est bon pour votre projet, par exemple, si son mobile optimisé ou non. Bureau jeux peuvent généralement gérer les objets/vertex/textures/mémoire du beaucoup plus qu'un jeu mobile, bien que certains des morceaux plus récents appareils mobiles aujourd'hui sembler Xbox 360 s.
Dans un jeu 3D typique, beaucoup de ces mêmes notions d'un jeu 2D s'appliquent — collisionneurs, déclencheurs, corps rigides, jeu objets/transformations, composants et plus encore. Quel que soit le type de jeu en 3D, vous voudrez généralement contrôler entrées, mouvement et des personnages ; utiliser des animations et des effets de particules ; et construire un monde imaginaire qui est réaliste et fantastique. J'aborderai quelques-unes des façons que l'unité contribue à cela.
D'entrée, de mouvement et de contrôleurs de caractère
Entrée de lecture pour le mouvement devient un peu plus compliquée en 3D parce que plutôt que de simplement en déplaçant en X et Y avions, vous pouvez maintenant déplacer en trois dimensions : X, Y et Z. Scénarios pour le mouvement 3D incluent (mais ne sont pas limités à) mouvement de haut en bas, où un personnage se déplace uniquement horizontalement et verticalement ; tournant une caméra ou un caractère lorsque vous lisez l'entrée de la souris, comme cela se fait dans de nombreux jeux de tir subjectif (FPS) ; mitraillage de gauche à droite lorsque la lecture horizontale d'entrée ; rotation pour tourner autour, en lisant l'entrée horizontale ; ou tout simplement à pied vers l'arrière. Il y a un bon nombre d'options de mouvement parmi lesquelles choisir.
Lorsque vous déplacez un objet, vous ne lui donnez pas un poste pour passer, comme vous vous en doutez. N'oubliez pas, vous êtes l'exécution de code à chaque image, vous devez déplacer l'objet par petits incréments. Vous pouvez soit laisser le moteur physique gérer cela en ajoutant une force à votre rigidbody pour le déplacer, ou vous pouvez interpolation de l'objet. Interpolation signifie fondamentalement la transition entre les valeurs ; autrement dit, se déplaçant du point A au point B. Il y a différentes façons d'interpolation de valeurs dans l'unité, y compris les bibliothèques libres de tierce partie tels qu'iTween. Figure 1 montre quelques façons manuelle pour déplacer un objet dans l'unité. Notez que par souci de simplicité, ils n'ont pas été optimisés (pour ce faire, je conclurais une référence à la transformation dans une variable pour empêcher les cours de code managé en code natif trop souvent).
Figure 1 diverses méthodes pour déplacer des objets
// Method 1
void Update()
{
// Move from point a to point b by .2 each frame - assuming called in Update.
// Will not overshoot the destination, so .2 is the max amount moved.
transform.position =
Vector3.MoveTowards(transform.position, new Vector3(10, 1, 100), .2f);
}
// Method 2
void Update()
{
// Interpolate from point a to point b by a percentage each frame,
// in this case 10 percent (.1 float).
var targetPosition = new Vector3(10,0,15);
transform.position = Vector3.Lerp(parentRig.position, targetPosition, .1f);
}
// Method 3
void Update()
{
// Teleport the object forward in the direction it is rotated.
// If you rotate the object 90 degrees, it will now move forward in the direction
// it is now facing. This essentially translates local coordinates to
// world coordinates to move object in direction and distance
// specified by vector. See the Unity Coordinate Systems section in the
// main article.
transform.Translate(Vector3.forward * Time.deltaTime);
}
// Method 4
void FixedUpdate()
{
// Cause the object to act like it's being pushed to the
// right (positive x axis). You can also use (Vector.right * someForce)
// instead of new Vector().
rigidbody.AddForce( new Vector3(7, 0, 0), ForceMode.Force);
}
// Method 5
void FixedUpdate()
{
// Cause the object to act like it's being pushed to the positive
// x axis (world coordinates) at a speed of approx 7 meters per second.
// The object will slow down due to friction.
rigidbody.velocity = new Vector3(7,0,0);
}
// Method 6
// Move the rigidbody's position (note this is not via the transform).
// This method will push other objects out of the way and move to the right in
// world space ~three units per second.
private Vector3 speed = new Vector3(3, 0, 0);
void FixedUpdate()
{
rigidbody.MovePosition(rigidbody.position + speed * Time.deltaTime);
}
// Method 7
void FixedUpdate()
{
// Vector3.forward is 0,0,1. You could move a character toward 0,0,1, but you
// actually want to move the object forward no matter its rotation.
// This is used when you want a character to move in the direction it's
// facing, no matter its rotation. You need to convert the meaning of
// this vector from local space (0,0,1) to world space,
// and for that you can use TransformDirection and assign that vector
// to its velocity.
rigidbody.velocity = transform.TransformDirection(Vector3.forward * speed);
}
Chaque méthode présente des avantages et des inconvénients. Il peut y avoir une baisse de performance se déplaçant juste la transformation (méthodes 1 et 2), si c'est un moyen très facile de faire mouvement. L'unité suppose que si un objet n'est pas un composant rigidbody là-dessus, ce n'est probablement pas un objet en mouvement. Il construit une matrice de collision statique en interne pour savoir où les objets sont, qui améliore les performances. Lorsque vous déplacez des objets en déplaçant la transformation, cette matrice doit être recalculée, ce qui provoque une baisse de performance. Pour des jeux simples, vous ne remarquerez peut-être jamais le coup et il peut être la chose la plus facile pour vous de le faire, même si comme vos jeux deviennent plus compliquée, il est important de déplacer la rigidbody lui-même, comme je le faisais en méthodes 4-6.
Rotation d'objets
Rotation d'un objet est assez simple, tout comme le déplacement d'un objet, sauf les vecteurs représentent maintenant degrés au lieu d'un poste ou un vecteur normalisé. Un vecteur normalisé est simplement un vecteur avec une valeur maximale d'un pour n'importe quelle valeur et peut être utilisé lorsque vous voulez tout simplement faire référence à une direction à l'aide d'un vecteur. Il y a certains mots-clés vecteur disponibles afin d'aider, Vector3.right, arrière, avant, bas, haut, gauche, droite, zéro et un. Tout ce qui se déplacer ou faire pivoter dans le sens horizontal positif peut utiliser Vector.right, qui est juste un raccourci pour (1,0,0), ou une unité vers la droite. Pour faire tourner un objet, cela représenterait un degré. Dans Figure 2, j'ai juste faire pivoter un objet par un petit peu dans chaque image.
Figure 2 méthodes pour faire tourner un objet
// Any code below that uses _player assumes you
// have this code prior to it to cache a reference to it.
private GameObject _player;
void Start()
{
_player = GameObject.FindGameObjectWithTag("Player");
}
// Method 1
void Update () {
// Every frame rotate around the X axis by 1 degree a
// second (Vector3.right = (1,0,0)).
transform.Rotate(Vector3.right * Time.deltaTime);
}
// Method 2
void Update () {
// No matter where the player goes, rotate toward him, like a gun
// turret following a target.
transform.LookAt(_player.transform);
}
// Method 3
void Update()
{
Vector3 relativePos = _player.transform.position - transform.position;
// If you set rotation directly, you need to do it via a Quaternion.
transform.rotation = Quaternion.LookRotation(relativePos);
}
Chacune de ces techniques a des nuances mineures. Lequel devez-vous utiliser ? Je vais essayer d'appliquer des forces à la rigidbody, si possible. J'ai probablement juste confondu vous un peu avec cette option. Les bonnes nouvelles sont, il y a un code existant qui peut faire pratiquement tout cela pour vous.
Avez-vous remarqué le Quaternion en méthode 3 ? L'unité utilise des Quaternions en interne pour représenter tous les rotations. Les quaternions sont des structures efficaces qui empêchent un effet appelé blocage de cardan, ce qui peut arriver si vous utilisez régulières angles d'Euler pour la rotation. Blocage de cardan se produit lorsque deux axes pivotent pour être sur le même plan et puis ne peuvent être séparés. (La vidéo sur bit.ly/1mKgdFI fournit une bonne explication.) Pour éviter ce problème, l'unité utilise les Quaternions plutôt que les angles d'Euler, bien que vous pouvez spécifier des angles d'Euler dans l'éditeur de l'unité et il va faire la conversion en un Quaternion sur le back-end. Beaucoup de gens éprouvent jamais de blocage de cardan, mais je tenais à souligner que si vous voulez définir une rotation directement dans le code, vous devez le faire via un Quaternion et vous pouvez convertir des angles d'Euler en utilisant Quaternion.Euler.
Maintenant que vous avez vu beaucoup d'options, je dois signaler que j'ai trouver que la méthode la plus simple consiste à utiliser un rigidbody et il suffit d'appliquer.AddForce au personnage. Je préfère à réutiliser du code quand je peux, et heureusement l'unité fournit un certain nombre de constructions préfabriquées.
Ne réinventons pas la roue
L'unité fournit le package actifs échantillonnés dans le magasin atout (bit.ly/1twX0Kr), qui contient un gestionnaire d'entrée multi-plateforme avec les contrôles mobiles joystick, des animations et des particules et la plupart contrôleurs de personnage important, certains préconstruits.
Il y a certains actifs plus âgés inclus avec l'unité (à ce jour, version 4.6). Ces actifs sont maintenant distribués dans un emballage séparé que l'unité peut mettre à jour séparément. Plutôt que d'avoir à écrire tout le code pour créer un caractère subjectif dans votre jeu, un personnage de la troisième personne ou même une voiture conduite automatique, vous pouvez simplement utiliser les préfabriqués de l'actif de l'échantillon. Glisser / déplacer instantanément dans votre scène et vous avez une troisième personne Découvre avec de multiples animations et un accès complet au code source, comme le montre Figure 3.
Figure 3 troisième personne Prefab
Animations
Un livre entier pourrait être consacré (et a) pour le système d'animation de Mecanim dans l'unité. Animations en 3D sont généralement plus compliquées qu'en 2D. En 2D, un fichier d'animation change généralement un moteur de rendu de sprite de chaque image clé pour donner l'apparence de l'animation. En 3D, les données d'animation sont beaucoup plus complexes. Me souviens de mon deuxième article qu'animation fichiers contiennent des images clés. En 3D, il peut y avoir plusieurs images clés, chacune avec nombreux points de données pour modifier un doigt, passer un bras ou une jambe, ou pour l'accomplissement de n'importe quel nombre et type de mouvements. Maillages peuvent également avoir défini OS en eux et peuvent utiliser des composants appelés peau mesh convertisseurs, qui déforment la maille basée sur comment déplacent des os, autant qu'une créature vivante serait.
Fichiers d'animation sont généralement créés dans un système de modélisation et d'animation tiers, même si vous pouvez les créer dans l'unité, aussi bien.
La posture de base pour un personnage dans un système d'animation 3D est le T-pose, qui est juste ce que cela ressemble — le caractère permanent droites avec tendus de bras, et elle s'applique à n'importe quel modèle de forme humanoïde. Vous pouvez puis animent ce caractère de base en ayant Mecanim affectez-lui pratiquement n'importe quel fichier d'animation. Vous pouvez avoir un zombie, l'elfe et l'homme tous danser de la même manière. Vous pouvez mélanger et assortir les fichiers d'animation, cependant vous entendent et assignez via affirme, comme vous le feriez en 2D. Pour ce faire, vous utilisez un contrôleur de l'animation comme celle montrée dans Figure 4.
Figure 4 contrôleur de l'Animation pour le contrôle Animation États du personnage
N'oubliez pas, que vous pouvez obtenir des personnages et des animations sur l'unité Asset Store ; vous pouvez les créer avec le modelage d'outils ; et il y a les produits de tiers comme fusible de Mixamo qui vous permet de rapidement générer vos propres caractères personnalisés. Découvrez mes vidéos de Channel 9 pour une intro à l'animation dans l'unité.
Création d'un monde
L'unité dispose d'un système de terrain intégré pour générer un monde. Vous pouvez créer un terrain et ensuite utiliser les outils de terrain inclus pour sculpter votre terrain, de faire des montagnes, de placer des arbres et herbe, textures de peinture et plus. Vous pouvez ajouter un ciel à votre monde en important le paquet skybox (actifs | Importer le Package | Skyboxes) et en l'assignant à Edit | Paramètres de rendu | Matériau de la « loge ». Il m'a fallu quelques minutes pour créer un terrain avec eau réfléchissant, dynamique, arbres, sable, montagnes et l'herbe, comme le montre Figure 5.
Figure 5 créé rapidement Terrain
L'unité systèmes de coordonnées
L'unité a quatre méthodes différentes pour renvoyant à un point dans un jeu ou sur l'écran comme le montre Figure 6. Il y a des espace de l'écran, qui varie entre 0 et le nombre de pixels et sont utilisé en général pour obtenir l'emplacement à l'écran lorsque l'utilisateur touche, ou clique sur. L'espace de la fenêtre d'affichage est simplement une valeur entre 0 et 1, qui le rend facile à dire, par exemple, qui est à mi-chemin.5, plutôt que de devoir diviser pixels par 2. Donc je peux facilement placer un objet dans le milieu de l'écran en utilisant (. 5,.5) comme sa position. Espace universel se réfère à la position absolue d'un objet dans un jeu basé sur les trois coordonnées, (0, 0, 0). Tous les objets jeu de niveau supérieur dans une scène ont leurs coordonnées indiquées dans l'espace universel. Enfin, un espace local est toujours par rapport à l'objet jeu de parent. Avec un objet jeu de niveau supérieur, c'est le même que l'espace universel. Tous les objets du jeu enfant sont répertoriés dans l'éditeur dans les coordonnées par rapport à leur parent, donc un modèle dans votre application d'une maison, par exemple, peut comporter les coordonnées universelles de (200, 0, 35), tandis que sa porte d'entrée (en supposant que c'est un objet jeu de l'enfant de la maison) peut être seulement (1.5, 0, 0), car c'est par rapport à la société mère. Dans le code, lorsque vous faites référence à transform.position, il est toujours en coordonnées universelles, même si c'est un objet enfant. Dans l'exemple, la porte serait (201.5, 0, 35), mais si vous faites référence à la place transform.localPosition, vous devrez retourner (1.5, 0, 0). L'unité dispose de fonctions de conversion entre les différents systèmes de coordonnées.
Figure 6 coordonnées dans l'unité
Dans l'avant de la déplacer exemples j'ai déplacé à l'aide de l'espace mondial pour la plupart, mais dans certains cas utilisé un espace local. Référence à la méthode 7 dans Figure 1. Dans cet exemple, je prends un vecteur normalisé (ou unité) local de Vector.forward, qui est (0,0,1). Cela en soi n'est pas beaucoup de sens. Cependant, il montre l'intention de déplacer quelque chose sur l'axe Z, c'est-à-dire vers l'avant. Si l'objet est pivotée de 90 degrés de (0,0,0) ? Vers l'avant peut maintenant avoir deux significations. Il peut signifier l'axe de Z absolu initial (en coordonnées universelles), ou un axe Z par rapport à l'objet pivoté, qui pointe toujours vers l'avant pour l'objet. Si je veux un objet à toujours aller de l'avant peu importe sa rotation, je peux traduire simplement entre un attaquant local au monde réel vecteur vers l'avant à l'aide de la transformation.TransformDirection(Vector3.forward * speed) comme le montre cet exemple.
Enfilage et Coroutines
L'unité utilise un système de coroutine pour gérer ses threads. Si vous voulez quelque chose se passe dans ce que vous pensez que devrait être un thread différent, vous lancer une coroutine, plutôt que de créer un nouveau thread. L'unité qu'elle gère tout dans les coulisses. Ce qui se passe, c'est que la coroutine s'arrête quand il frappe la méthode de rendement. Dans l'exemple de Figure 7, une animation d'attaque est jouée, en pause pour une durée aléatoire et puis a joué dans l'attaque à nouveau.
Figure 7 utilisation d'un Coroutine à Action Pause
void Start()
{
// Kick off a separate routine that acts like a separate thread.
StartCoroutine(Attack());
}
IEnumerator Attack()
{
// Trigger an attack animation.
_animator.SetTrigger("Attack");
// Wait for .5 to 4 seconds before playing attacking animation, repeat.
float randomTime = Random.Range(.5f, 4f);
yield return new WaitForSeconds(randomTime);
}
Physique et détection de Collision
Physique et la collision des fonctionnalités de détection en 3D sont presque les mêmes qu'en 2D, sauf les collisionneurs sont façonnés différemment et le composant rigidbody possède quelques propriétés différentes, comme le fait de pouvoir accomplir des rotations libres ou mouvement dans les axes X, Y et Z. En 3D, il y a maintenant un collisionneur de maille qui encapsule la forme entière d'un modèle comme une zone de détection de la collision. Cela peut paraître beaucoup et pour les collisions, il est assez bon, mais il n'est pas bon pour les performances. Idéalement, vous souhaitez simplifier les formes de hadrons et de limiter la puissance de traitement, qu'il faut s'en servir. Avoir un zombie ? Pas de problème, utilisez une capsule de hadrons. Un objet complexe ? Utiliser plusieurs collisionneurs. Éviter, si possible le maillage de hadrons.
L'unité fournit un certain nombre de méthodes pour savoir quand se produit une collision ou un déclencheur est déclenché. Vous trouverez ci-dessous un exemple de base :
void OnCollisionEnter(Collision collision)
{
// Called when you have a physical collision.
Debug.Log("Collided with " + collision.gameObject.name);
}
void OnTriggerEnter(Collider collider)
{
// Called when another object comes within the trigger zone.
Debug.Log("Triggered by " + collider.gameObject.name);
}
Il y a des méthodes plus nombreuses que celles énumérées ici, tels que OnTriggerExit et OnCollisionExit et ils sont presque identiques à leurs équivalents 2D.
Création d'objets
Lorsque vous souhaitez créer de nouveaux éléments axés sur les GameObject au moment de l'exécution, vous n'utilisez pas les constructeurs. Au lieu de cela, vous utilisez Instantiate. Vous pouvez certainement avoir des classes avec des constructeurs, mais pas directement dans les scripts qui hérite de MonoBehavior, qui se trouve être tous les scripts de niveau supérieur assignés à n'importe quel GameObject. Ces scripts peuvent, toutefois, appeler des constructeurs pour tous les autres objets, qu'ils veulent :
// Assume this reference has been assigned in the editor.
[SerializeField]
private GameObject _zombie;
void Start()
{
// Create a new instance of that game object. This can be
// a prefab from your project or object already in scene.
Instantiate(zombie, transform.position, Quaternion.identity);
}
Effets de particules
Si vous souhaitez que les étoiles clignotantes, poussière, neige, explosions, incendies, la brume d'une chute d'eau, effets de sang ou un certain nombre d'autres effets, vous utilisez un effet de particules. Il y a un vieux système de particule dans l'unité et un Shuriken appelé une plus récente, plus optimisé. Vous pouvez faire tellement de choses étonnantes avec Shuriken dans l'unité, y compris l'obtention de votre chute de particules soutenir les collisions. Parce qu'il ya de nombreux tutoriels là-bas, comme celui de bit.ly/1pZ71itet elles sont généralement créées dans l'éditeur avec le concepteur, ici je vais vous montrer juste comment ils peuvent être instanciés lorsque, disons, un personnage pénètre dans la région de déclencheur d'une pièce de monnaie pour recueillir.
Pour commencer avec des particules, il suffit d'aller à l'objet du jeu | Particle System menu et vous verrez immédiatement ajoutée à votre scène, comme dans Figure 8.
Effet de particule figure 8
J'aime créer des constructions préfabriquées (que j'ai abordées dans le deuxième article) de mes systèmes de particules, donc je peux facilement les réutiliser, et je peux ensuite facilement instancier eux via le code en premier en assignant le script à un objet de jeu (en supposant que c'est dans une classe qui dérive de MonoBehavior, comme le sont tous les composants de script objet de jeu), puis, dans l'éditeur, vous faites glisser un effet de particules depuis ma scène ou un prefab à mon projet sur, par exemple, la propriété de SmokeEffect exposée dans Figure 9.
Figure 9 la propriété exposée de la SmokeEffect
[SerializeField]
private ParticleSystem _smokeEffect;
void OnTriggerEnter(Collider collider)
{
// Ensure you only show particles if the player comes within your zone.
if (collider.gameObject.tag == "Player")
{
GameController.Score++;
// Create particle system at the game objects position
// with no rotation.
Instantiate(_smokeEffect, transform.position, Quaternion.identity);
// Don’t do: Destroy(this) because "this"
// is a script component on a game object, so use
// this.gameObject, that is, just gameObject.
Destroy(gameObject);
}
}
Création d'une interface utilisateur
L'unité 4.6 ajouté un tout nouveau système d'interface utilisateur pour créer des affichages de Heads-up en jeu des éléments à l'aide du texte, des panneaux, des widgets et plus encore. Ajout de texte à l'écran de votre jeu, il suffit de cliquer sur GameObject | UI | Texte et définir la police et le texte. Si vous souhaitez contrôler que plus tard via le code à jour peut-être un indice, vous utilisez simplement :
// Gets the UnityEngine.UI.Text component.
var score = GetComponent<Text>();
score.text = "Score:0";
Si je veux une image dans mon interface utilisateur, j'ai simplement cliquez sur GameObject | UI | Image et attribuer un 2D sprite image à ce nouveau composant. Je peux définir ces valeurs comme pour tout autre objet de jeu. J'espère que vous voyez un modèle maintenant. Pour créer une interface graphique simple, créer les objets d'interface utilisateur via le GameObject | Menu de l'interface utilisateur, définissez les valeurs initiales dans l'éditeur et de les contrôler plus tard par obtenir des références à des composants d'interface utilisateur et définissant les valeurs ou même animer les valeurs. J'ai construit une base GUI, montré dans Figure 10, en créant des éléments sous un nouveau composant de la toile. Le nouveau système de l'unité 4.6 interface utilisateur contient un certain nombre de types d'objets fondamentaux, tels que Panel, Button, texte, Image, Slider, Scrollbar et activer/désactiver, et il est incroyablement facile ancrer, échelle et glisser-déplacer pour créer une interface utilisateur.
Figure 10 UI avec une Image et du texte de Heads-up
AI dans votre jeu
Il ne serait pas juste pour ne pas mentionner les AI, mais je n'obtiendrai pas dans la création d'AI ici (même si les blocs de construction pour elle sont dans les exemples de code précédents pour trouver/déplacer/tourner). Mais je vais mentionner quelques options qui s'offrent à vous. J'hésite à appel AI dans un jeu AI, car il n'est pas tant d'intelligence comme juste une action très basique. Je vous ai montré comment faire pour avoir une transformation tourner vers un autre objet et le déplacer cet objet. C'est l'IA base dans de nombreux jeux. L'unité a quelques fonctionnalités intégrées d'orientation avec son soutien NavMesh, qui calcule, avance, tous les chemins autour des objets. NavMesh fonctionne très bien et est maintenant inclus dans la version gratuite de l'unité, bien que beaucoup choisissent plutôt d'utiliser le projet de Pathfinding A * (arongranberg.com/astar), qui est un algorithme, vous pouvez soit implémenter vous-même ou vous épargner le temps en achetant un atout paquet pour elle. À partir de cette écriture, 2D pathfinding soutien n'est pas intégré dans l'unité, uniquement 3D, même si A * n'a pas cette capacité. Se comporter 2.0 de AngryAnt est un populaire AI plug-in pour l'unité avec quelques fonctionnalités vraiment fortes, et il y a aussi des pluies, une boîte à outils AI libre de rivaltheory.com, qui est également assez décent et a des comportements intégrés pour le suivi, trouver, Mecanim intégration et bien plus encore.
Synthèse
Le monde 3D ajoute une couche supplémentaire de complexité au 2D car elle traite de mailles complètes et une dimension plus. Le magasin atout est la clé absolue pour les débutants et avancés identique, et vous pouvez vraiment descendre à un démarrage rapide en utilisant des actifs pré-créé.
Quand j'ai commencé à développer des jeux, je suis devenu fou de trouver autant de modèles et de textures sur l'Internet. Il y a quelques marchés grand atout là-bas, mais vous trouverez rapidement qu'ils ne sont pas tous bons pour les jeux. Une fois, j'ai téléchargé un petit rocher qui avait près de 100 000 sommets dans son modèle ! Recherchez les actifs qui sont optimisées, ou consulter le nombre de vertex/polygones afin de que vous trouverez ceux qui peuvent travailler pour vos jeux. Dans le cas contraire, ils peuvent ralentir votre performance considérablement. Il y a des outils d'optimisation que vous pouvez utiliser sur les modèles, dont une unité appelée Cruncher. Dans le prochain article, je vous indiquerai comment faire pour reprendre un jeu ou l'application de l'unité vers la plate-forme Windows. Découvrez mon blog de Channel 9 (aka.ms/AdamChannel9) pour des vidéos et des liens vers du contenu à télécharger.
Adam Tuliper est un spécialiste technique senior avec Microsoft vivant en Californie du Sud ensoleillée. Il est un dev de jeu indie, co-admin de l'Orange County unité Meetup et un Pluralsight.com auteur. Lui et son épouse sont sur le point d'avoir leur troisième enfant, tellement tendre la main pour lui alors qu'il doit toujours un moment de libre à adamt@microsoft.com ou sur Twitter à twitter.com/AdamTuliper.
Je remercie les experts techniques suivants d'avoir relu cet article : Matt Newman (Subscience Studios) et Tautvydas Žilys (l'unité)