Il presente articolo è stato tradotto automaticamente.

Unity

Sviluppo del primo gioco con Unity e C# - Parte 3

Adam Tuliper

Sei ancora con me in questa serie. Buona. Nel primo articolo, coperto alcune basi di unità (msdn.microsoft.com/magazine/dn759441). Nel secondo, mi sono concentrato su 2D in unità (msdn.microsoft.com/magazine/dn781360). Ora ricevo per la mia parte preferita dello sviluppo del gioco — 3D. Il mondo del 3D è un luogo davvero magico — incredibili ambienti immersivi, ricco di effetti sonori e belle immagini — anche solo un semplice gioco di puzzle con la fisica del mondo reale può tenere collegato per ore.

Giochi 3D sicuramente aggiungono un livello di complessità sopra 2D, ma prendendolo pezzo per pezzo può costruire un gioco 3D. Nuove impostazioni progetto per 2D e 3D in unità supportano 3D. Si possono avere oggetti 3D in un gioco 2D (e viceversa).

Che cosa rende una scena 3D?

Scene 3D costituite principalmente da tre componenti principali di visual — luci, maglia renderer e shader. È una luce, Beh, una luce e l'unità supporta quattro tipi diversi. Li trovate tutti sotto il menu GameObject. Esperimento con i vari tipi di aggiunta e modifica delle loro proprietà. Il più semplice per illuminare una scena è una luce direzionale, che è come il sole nel cielo.

Una maglia (o modello) è un insieme di vertici che compongono i poligoni che compongono un oggetto. Uno shader è una routine compilata che contiene il codice per controllare come l'oggetto sarà mostrare o interagire con la luce. Alcuni shader semplicemente prendere luce e riflette come uno specchio; gli altri prendere una texture (un'immagine da applicare alla tua maglia) e possibile attivare ombre e profondità; e alcuni addirittura consentono di tagliare i fori visive attraverso i modelli, come un recinto.

I modelli sono in genere file FBX o OBJ esportati da un altro pacchetto software di modellazione. File FBX possono contenere anche dati di animazione, così si potrebbe ricevere un file FBX per il vostro modello e uno contenente diverse animazioni. Diversi formati di file di terze parti sono supportati anche, ad esempio il formato .ma Autodesk Maya e file di Blender. In genere è necessario il programma di terze parti installato sullo stesso sistema se volete unità per importare questi file, e quindi è semplicemente una questione di trascinandole e rilasciandole nel vostro progetto di unità, proprio come si farebbe con qualsiasi altro file. Dietro le quinte, unità converte altri formati di file (su importazione o rilevare le modifiche del file) nel formato di file FBX.

Asset Store

Toccato l'Asset Store nel mio primo articolo, ma nei giochi 3D è dove è veramente utile. Io non sono un artista, e perché questa è una rivista tecnica, presumo che la maggior parte di voi non sono neanche. (Se siete, vi prego di accettare il mio complimenti, sei parte di un gruppo raro.) Ma se voglio creare un gioco con ambienti lussureggianti e vecchi edifici distrutti, per esempio, non è un problema. Posso comprare quello che mi serve dal deposito di Asset. Se voglio 15 diversi zombie, posso procuro un pack da Mixamo nell'archivio di Asset. Le possibili combinazioni sono quasi infinite, quindi non preoccupatevi di qualcun altro gioco bello come il tuo. Meglio di tutti, il negozio di Asset integra in unità. È possibile aggiornare i pacchetti facendo clic su finestra | Asset Store e quindi l'icona di bin. Si può anche verificare giudizi e commenti a più facilmente determinano se un particolare elemento è buono per il vostro progetto, ad esempio, se il mobile ottimizzata o no. Giochi desktop in genere può gestire molti più oggetti/vertici/texture/memoria rispetto a un gioco per cellulare, anche se alcuni dei chip più recenti dispositivi mobili oggi sembrare Xbox 360s.

In un tipico gioco 3D, molti dei concetti stessi da un gioco 2D applicare — collisionatori, trigger, corpi rigidi, giochi/trasformazioni di oggetti, componenti e altro ancora. Indipendentemente dal tipo di gioco 3D, in genere ti consigliamo di controllare l'input, movimento e personaggi; utilizzare animazioni ed effetti particellari; e costruire un mondo fantasioso che sia fantastico e realistico. Tratterò alcuni modi che unità aiuta con questa.

Ingresso, movimento e controller di carattere

Ingresso di lettura per il movimento diventa un po' più complicato in 3D perché, piuttosto che semplicemente spostando in X e Y planes, può ora muoversi in tre dimensioni: X, Y e Z. Scenari per il movimento 3D includono (ma non sono limitati a) movimento verticistica, dove un personaggio si muove solo in orizzontale e in verticale; ruotando un carattere o una fotocamera quando si legge l'input del mouse, come avviene in molti giochi sparatutto in prima persona (FPS); bombardamento di sinistra a destra quando la lettura orizzontale ingresso; rotanti per girarsi quando lettura ingresso orizzontale; o semplicemente camminando all'indietro. Ci sono un buon numero di opzioni di movimento tra cui scegliere.

Quando si sposta un oggetto, non dare una posizione a muoversi, come ci si potrebbe aspettare. Ricordate, si esegue il codice con ogni fotogramma, quindi è necessario spostare l'oggetto in piccoli incrementi. Si può lasciare neanche il motore fisico di gestire questo aggiungendo una forza al tuo rigidbody per spostarlo, o si può interpolare l'oggetto. Tweening significa fondamentalmente transizione tra valori; cioè, lo spostamento dal punto al punto B. Ci sono vari modi per interpolazione valori in unità, tra cui liberi librerie di terze parti come iTween. Figura 1 illustrato alcuni modi manuali per spostare un oggetto in unità. Si noti che, per semplicità, essi non sono stati ottimizzati (per fare ciò, terrei un riferimento alla trasformazione in una variabile per evitare troppo spesso andando da codice gestito a codice nativo).

Figura 1 vari metodi per spostare gli oggetti

// 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);
}

Ogni approccio ha vantaggi e svantaggi. Ci può essere un calo di prestazioni, muovendo appena la trasformazione (metodi 1 - 2), anche se è un modo molto facile per fare movimento. Unità presuppone che se un oggetto non ha una componente rigidbody su di esso, probabilmente non è un oggetto in movimento. Si costruisce una matrice statica collisione internamente per sapere dove sono gli oggetti, che migliora le prestazioni. Quando si spostano oggetti spostando la trasformazione, matrix deve essere ricalcolato, che provoca un calo di prestazioni. Per giochi semplici, non si può notare mai il colpo e può essere la cosa più facile da fare, anche se come i tuoi giochi ottenere più complicati, è importante spostare il rigidbody stesso, come ho fatto nei metodi 4-6.

Ruotare gli oggetti

Rotazione di un oggetto è abbastanza semplice, tanto come lo spostamento di un oggetto, tranne i vettori rappresentano ora gradi invece una posizione o un vettore normalizzato. Un vettore normalizzato è semplicemente un vettore con un valore massimo di uno per ogni valore e può essere utilizzato quando si desidera solo fare riferimento semplicemente una direzione usando un vettore. Ci sono alcune parole chiave vettoriale disponibile ad aiutare, come Vector3.right, indietro, avanti, giù, su, sinistra, destra, zero e uno. Tutto ciò che sarà spostare o ruotare nella direzione orizzontale positiva può utilizzare Vector.right, che è solo una scorciatoia per (1.0.0), oppure un'unità a destra. Per rotazione di un oggetto, questo rappresenterebbe un corso di laurea. In Figura 2, basta ruotare un oggetto da un po ' in ogni fotogramma.

Figura 2 metodi per ruotare un oggetto

// 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);
}

Ognuna di queste tecniche ha lievi sfumature. Che si dovrebbe utilizzare? Io cercherei di applicare forze alla rigidbody, se possibile. Io ho probabilmente solo confuso è un po ' con quell'opzione. La buona notizia è che c'è il codice esistente che può fare praticamente tutto questo per voi.

Hai notato il quaternione nel metodo 3? Unità utilizza internamente i quaternioni per rappresentare tutte le rotazioni. I quaternioni sono strutture efficienti che impediscono un effetto chiamato gimbal lock, che può accadere se si utilizzano normali angoli di Eulero per la rotazione. Gimbal lock si verifica quando due assi sono ruotati per essere sullo stesso piano e quindi non possono essere separati. (Video di bit.ly/1mKgdFI fornisce una buona spiegazione.) Per evitare questo problema, unità utilizza i quaternioni anziché angoli di Eulero, anche se è possibile specificare gli angoli di Eulero nell'Editor unità e farà la conversione in un quaternione sul back-end. Molte persone non esperienza mai gimbal lock, ma volevo sottolineare che se si desidera impostare una rotazione direttamente nel codice, è necessario farlo tramite un quaternione e può convertire da angoli di Eulero usando Quaternion.Euler.

Ora che hai visto molte opzioni, vorrei sottolineare che trovare che il metodo più semplice è quello di utilizzare un rigidbody e semplicemente applicare.AddForce al carattere. Io preferisco per riutilizzare il codice quando posso, e per fortuna l'unità fornisce un certo numero di costruzioni prefabbricate.

Diciamo non reinventare la ruota

Unità fornisce il pacchetto campione beni nell'archivio di Asset (bit.ly/1twX0Kr), che contiene un gestore di input multi-piattaforma con controlli joystick mobile, alcune animazioni e particelle e la maggior parte controller di carattere importante, alcuni precompilati.

Ci sono alcuni anziani attivi inclusi con unità (al momento, versione 4.6). Tali beni sono distribuiti come pacchetto separato che unità può aggiornare separatamente. Invece di scrivere tutto il codice per creare un personaggio in prima persona nel vostro gioco, un personaggio in terza persona o anche una macchina auto-guida, si possono semplicemente utilizzare i prefabbricati dai beni campione. Trascinamento nella vostra scena e istantaneamente si dispone di una terza persona Mostra con più animazioni e pieno accesso al codice sorgente, come mostrato Figura 3.

terza persona prefabbricato
Figura 3 terza persona prefabbricato

Animazioni

Un intero libro potrebbe essere dedicato (e ha) per il sistema di animazione Mecanim nell'unità. Animazioni in 3D sono generalmente più complicati che in 2D. In 2D, un file di animazione cambia in genere un renderer di sprite in ogni fotogramma chiave per dare l'apparenza di animazione. In 3D, i dati di animazione sono molto più complessi. Richiamo dal mio secondo articolo che file di animazione contengono fotogrammi chiave. In 3D, ci possono essere molti fotogrammi chiave, ognuno con molti punti dati per cambiare un dito, un braccio o una gamba, in movimento o per l'esecuzione di qualsiasi numero e tipo di movimenti. Maglie possono anche definite ossa in loro e può usare componenti chiamato dalla pelle maglia renderer, che deformano la mesh basata su come spostare le ossa, proprio come farebbe una creatura vivente.

Solitamente vengono creati file di animazione in un sistema di modellazione/animazione di terze parti, anche se è possibile crearli in unità, pure.

La base posa per un personaggio in un sistema di animazione 3D è il T-posa, che è proprio ciò che sembra — il personaggio in piedi dritto con le braccia tese, e si applica a qualsiasi modello di forma umanoide. Si può quindi animare quel carattere di base avendo Mecanim assegnarle virtualmente qualsiasi file di animazione. Si può avere una zombie, elfi e umani tutti ballare nello stesso modo. Potete mescolare ed abbinare i file di animazione, tuttavia opportuno e assegnarli tramite stati proprio come si farebbe in 2D. A tale scopo, si utilizza un controller di animazione come quella indicata Figura 4.

Controller di animazione per il controllo degli Stati di animazione di un personaggio
Figura 4 Controller di animazione per il controllo degli Stati di animazione di un personaggio

Ricordate, che è possibile ottenere personaggi e animazioni da Unity Store Asset; è possibile crearli con modellazione strumenti; e ci sono prodotti di terze parti come fusibile su Mixamo che consentono di generare rapidamente i propri personaggi su misura. Scopri i miei video di Channel 9 per un intro di animazione nella unità.

Creazione di un mondo

Unità ha un sistema incorporato di terreno per la generazione di un mondo. È possibile creare un terreno e quindi utilizzare gli strumenti di terreno incluso per scolpire il vostro terreno, fare montagne, posizionare alberi ed erba, textures paint e altro. È possibile aggiungere un cielo al tuo mondo importando il pacchetto skybox (beni | Importare il pacchetto | Skybox) e assegnandolo in modifica | Le impostazioni di rendering | Materiale skybox. Mi ci è voluto solo un paio di minuti per creare un terreno con acqua riflettente, dinamico, alberi, sabbia, montagne ed erba, come mostrato Figura 5.

creato rapidamente terreno
Figura 5 creato rapidamente terreno

Unità sistemi di Coordinate

Unità ha quattro metodi diversi per riferendosi ad un punto in un gioco o sullo schermo, come mostrato Figura 6. C'è spazio sullo schermo, che varia da 0 al numero di pixel e viene utilizzato in genere per ottenere la posizione dello schermo, dove l'utente tocca o fa clic. Lo spazio della viewport è semplicemente un valore da 0 a 1, che lo rende facile da dire, per esempio, che è a metà strada 5, piuttosto che dover dividere pixel per 2. Così io posso facilmente inserire un oggetto al centro dello schermo utilizzando (. 5, 5) come la sua posizione. Spazio mondo si intende il posizionamento assoluto di un oggetto in un gioco basato su tre coordinate, (0, 0, 0). Tutti gli oggetti di livello superiore giochi in una scena hanno loro coordinate elencate nello spazio globale. Infine, spazio locale è sempre relativo oggetto padre gioco. Con un oggetto di gioco di primo livello, questo è lo stesso spazio del mondo. Tutti gli oggetti figlio gioco sono elencati nell'Editor in coordinate relative a loro padre, così un modello nella tua app di una casa, ad esempio, può avere le coordinate del mondo (200, 0, 35), mentre la sua porta di casa (ammesso che sia un oggetto di gioco bambino della casa) potrebbe essere solo (1.5, 0, 0), come quello è relativo all'elemento padre. Nel codice, quando si fa riferimento a transform.position, è sempre nelle coordinate del mondo, anche se è un oggetto figlio. Nell'esempio, la porta sarebbe (201,5, 0, 35), ma se si fa invece riferimento a transform.localPosition, si restituirebbe (1.5, 0, 0). Unità dispone di funzioni per la conversione tra i vari sistemi di coordinate.

coordinate nell'unità
Figura 6 coordinate nell'unità

Nel prima spostare esempi io principalmente spostato utilizzando lo spazio del mondo, ma in alcuni casi utilizzato spazio locale. Fare riferimento al metodo 7 nel Figura 1. In tale esempio prendo un vettore locale normalizzato (o unità) di Vector.forward, che è (0.0.1). Questo di per sé non ha molto significato. Tuttavia, Mostra intento a spostare qualcosa sull'asse Z, che è avanti. Se l'oggetto è ruotato di 90 gradi da (0, 0,0)? Latta avanti ora ha due significati. Può significare l'asse Z assoluto originale (in coordinate mondo), o un asse di Z rispetto all'oggetto ruotato, che è sempre rivolta in avanti per l'oggetto. Se voglio un oggetto sempre andare avanti non importa la sua rotazione, posso semplicemente tradurre tra locali avanti al vettore mediante trasformazione avanti reali.TransformDirection(Vector3.forward * speed) come è mostrato in questo esempio.

Filettatura e coroutine

Unità utilizza un sistema di coroutine per gestire i thread. Se si desidera che qualcosa accada in ciò che si pensa dovrebbe essere un thread diverso, dà il via un coroutine, anziché creare un nuovo thread. Unità gestisce tutto dietro le quinte. Quello che succede è che le coroutine pause quando colpisce il metodo di resa. Nell'esempio in Figura 7, un'animazione di attacco è giocata, in pausa per una lunghezza casuale e poi giocata in attacco ancora una volta.

Figura 7 utilizzando una Coroutine pausa azione

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);
}

Fisica e rilevamento delle collisioni

Caratteristiche di rilevazione fisica e collisione in 3D sono quasi lo stesso come in 2D, tranne i collisionatori sono modellati in modo diverso e il componente rigidbody ha alcune proprietà differenti, come l'essere in grado di compiere rotazioni liberi o movimento assi X, Y e Z. In 3D c'è ora un collisore di maglia che avvolge l'intera forma di un modello come una zona di rilevamento delle collisioni. Questo potrebbe sembrare grande e per collisioni è abbastanza buono, ma non è buono per le prestazioni. Idealmente, si desidera semplificare forme collider e limitare la potenza di elaborazione che serve per utilizzarli. Sono uno zombie? Nessun problema, utilizzare una capsula collider. Un oggetto complesso? Utilizzare collisionatori multiple. Evitare se possibile il collider di maglia.

Unità fornisce un certo numero di metodi per sapere quando si verifica una collisione o un trigger viene attivato. Seguito è riportato un esempio di 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);
}

Ci sono molti metodi più che elencati qui, come OnTriggerExit e OnCollisionExit e sono quasi identici alle loro controparti 2D.

Creazione di oggetti

Quando si desidera creare nuovi elementi di base di GameObject in fase di esecuzione, non utilizzare i costruttori. Invece utilizzare Instantiate. Si possono certamente avere classi con costruttori, non solo direttamente negli script che eredita da MonoBehavior, che succede a tutti gli script di primo livello assegnati a qualsiasi GameObject. Questi script possono, tuttavia, chiamare costruttori per altri oggetti tutti che vogliono:

// 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);
}

Effetti particellari

Se si desidera stelle lampeggianti, polvere, neve, esplosioni, fuoco, nebbia da una cascata, effetti di sangue o un certo numero di altri effetti, si utilizza un effetto particella. C'è un vecchio sistema di particella in unità e una più recente, più ottimizzato uno chiamato Shuriken. Si possono fare tante cose incredibili con Shuriken in unità, includendo avendo le particelle che cadono supportano le collisioni. Perché ci sono molti tutorial là fuori, come quella in bit.ly/1pZ71ite sono tipicamente stai creati nell'editor con il progettista, qui potrai solo mostrare come possono essere istanziate quando, diciamo, un personaggio entra nella regione di innesco di una moneta da raccogliere.

Per iniziare con particelle, semplicemente andare all'oggetto gioco | Menu di sistema antiparticolato e immediatamente vedrai uno aggiunto alla vostra scena, come in Figura 8.

Effetto di particelle
Effetto di particelle di figura 8

Mi piace creare prefabbricati (che ho coperto nel secondo articolo) dal mio sistemi di particelle, così li posso riutilizzare facilmente, e posso quindi facilmente creare loro tramite codice assegnando prima lo script per un oggetto di gioco (supponendo che è in una classe che deriva da MonoBehavior, come sono tutti i componenti di script oggetto di gioco) e poi, nell'editor, trascinando un effetto particella dalla mia scena o un prefabbricato nel mio progetto sul, ad esempio, la proprietà esposta SmokeEffect in Figura 9.

Figura 9 la proprietà esposta 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);
  }
}

Creazione di un'interfaccia utente

Unità 4.6 ha aggiunto un nuovo sistema di interfaccia utente per la creazione di heads-up display in gioco elementi utilizzando testo, pannelli, widget e altro ancora. Aggiunta di testo a schermo del gioco è semplicemente una questione di cliccando su GameObject | UI | Testo e impostare il tipo di carattere e testo. Se si desidera controllare che successivamente tramite codice forse aggiornare un punteggio, sufficiente utilizzare:

// Gets the UnityEngine.UI.Text component.
  var score = GetComponent<Text>();
  score.text = "Score:0";

Se vogliamo un'immagine nel mio UI, clicco semplicemente su GameObject | UI | Immagine e assegnare una 2D immagine di sprite per questo nuovo componente. Posso impostare questi valori come con qualsiasi altro oggetto di gioco. Spero che si vede un modello ormai. Per creare una semplice GUI, creare gli oggetti dell'interfaccia utente tramite il GameObject | UI menu, impostare i valori iniziali nell'Editor e li controllo più tardi ottenere riferimenti a quei componenti dell'interfaccia utente e impostando i valori o anche animare i valori. Costruito una base GUI, mostrato Figura 10, creando elementi sotto un nuovo componente di tela. Il nuovo sistema di unità 4.6 interfaccia utente contiene un certo numero di tipi di oggetto di base, ad esempio Panel, pulsante, testo, immagine, Slider, Scrollbar e Toggle, ed è incredibilmente facile per ancorarli, scala e trascinare per creare un'interfaccia utente.

UI con un'immagine e un testo di heads-up
Figura 10 UI con un'immagine e un testo di heads-up

Nel tuo gioco

Sarebbe giusto non parlare AI, anche se non voglio entrare nei creando AI qui (anche se i blocchi predefiniti per esso sono negli esempi di codice precedenti per trovare/spostare/ruotare). Ma accennerò alcune opzioni disponibili per voi. Ho esitato a chiamata in un gioco IA, perché non è così tanta intelligenza come solo un'azione molto di base. Vi ho mostrato come avere una trasformazione ruotare verso un altro oggetto e oggetto. Che è alla base in molti giochi. Unità presenta alcune funzionalità integrate di path-finding con relativo supporto NavMesh, che calcola anticipo tutti i sentieri attorno agli oggetti. NavMesh funziona abbastanza bene ed è ora inclusa nell'edizione free dell'unità, anche se molti scelgono invece di utilizzare il progetto di path-finding A * (arongranberg.com/astar), che è un algoritmo, è possibile implementare manualmente o Salva te stesso il tempo con l'acquisto di un bene del pacchetto per esso. A partire da questa scrittura, 2D pathfinding supporto non è costruito in unità, solo 3D, anche se hanno capacità che A *. Comportarsi 2.0 da AngryAnt è un popolare AI plug-in per l'unità con alcune caratteristiche davvero forte, e c'è anche la pioggia, un toolkit gratuito da rivaltheory.com, che è anche abbastanza decente e ha comportamenti predefiniti per seguire, trovare, integrazione di Mecanim e di più.

Conclusioni

Il mondo 3D aggiunge un ulteriore livello di complessità sopra 2D come si tratta di maglie completo e una dimensione di più. Il negozio di Asset è la chiave assoluta per principianti e avanzato allo stesso modo, e può davvero scendere per un avvio rapido utilizzando beni pre-creati.

Quando iniziato a sviluppare giochi, sono andato pazzo di trovare così tanti modelli e texture su Internet. Ci sono alcuni mercati grande bene là fuori, ma presto troverete che non sono tutti buoni per giochi. Una volta scaricato un piccolo masso che aveva vicino 100.000 vertici nel relativo modello! Cercare i beni che sono mobile ottimizzata, o controllare il conteggio di vertice/poligono affinché che voi trovare quelli che possono lavorare per i tuoi giochi. In caso contrario, possono rallentare le prestazioni notevolmente. Ci sono strumenti di ottimizzazione, che è possibile utilizzare modelli, tra cui uno per unità chiamato Cruncher. Nel prossimo articolo, tratterò come prendere un gioco o app da unità alla piattaforma Windows. Controllare il mio blog di Channel 9 (aka.ms/AdamChannel9) per alcuni video e link a contenuti da scaricare.


Adam Tuliper è un senior technical evangelist con Microsoft che vivono nel sud della California. Egli è un indie game dev, co-admin di Orange County unità Meetup e un Pluralsight.com autore. Lui e sua moglie stanno per avere il loro terzo figlio, così arrivare a lui mentre lui ha ancora un momento libero a adamt@microsoft.com o su Twitter a /AdamTuliper.

Grazie ai seguenti esperti tecnici per la revisione di questo articolo: Matt Newman (Subscience Studios) e Tautvydas Žilys (unità)