Lavorare con Unity3D Physics

Questo tutorial ti insegnerà come costruire un knock down con Unity3D! Lungo la strada, imparerai dell'importanza di utilizzare un motore fisico e in questo modo risparmierai innumerevoli ore di animazione manuale. Continuare a leggere!

Quale moderno motore di gioco sarebbe completo senza un motore fisico? Ogni motore di gioco attuale, 3D o 2D, ha una libreria fisica di qualche tipo e Unity non fa eccezione. La fisica in tempo reale è l'ideale per simulare interazioni complesse tra oggetti nel tuo gioco. Un motore fisico può risparmiare un sacco di codifica manuale e animazione per ottenere movimenti realistici, può rendere la rilevazione dei colpi efficace un gioco da ragazzi e può introdurre rapidamente una serie di nuove meccaniche di gioco ai tuoi giochi.

In questo tutorial, utilizzeremo il motore fisico di Unity per creare un gioco 3D knockdown simile a BoomBlox e Angry Birds. Impareremo come dare agli oggetti diverse proprietà fisiche, renderli capaci di scontrarsi e persino permettere che vengano distrutti se le collisioni sono abbastanza forti.


Che cos'è un motore di fisica?

Un motore fisico funziona simulando il modo in cui gli oggetti reagiscono tra loro quando vengono applicate le forze. Queste forze possono essere costanti, come la gravità o la quantità di moto di un veicolo, mentre altre sono brevi e potenti, come le esplosioni. Una simulazione fisica a volte viene chiamata "sandbox" perché sono interessati solo gli oggetti all'interno della simulazione. In effetti, non tutti gli oggetti nel tuo gioco devono essere parte della simulazione. Questo è importante poiché i movimenti dei giocatori spesso hanno bisogno di essere irrealistici mentre rispondono realisticamente alle collisioni.


Impostazione del progetto

  • Fai clic su File> Nuovo progetto
  • Passare a una cartella adatta e denominare il progetto CannonBowl
  • Fai clic su Crea
  • Fai clic su GameObject> Crea altro> Luce direzionale
  • Fai clic su File> Salva scena
  • Dai un nome alla scena Principale
  • Fai clic su Salva

collider

I collider sono ciò che i motori fisici utilizzano per eseguire il rilevamento dei colpi. A differenza degli oggetti mesh, sanno quando sono entrati in contatto l'uno con l'altro. Sono forme semplici come scatole, sfere o capsule che vengono assegnate ai tuoi oggetti GameObjects e le seguono in giro. Puoi pensare a loro come a qualcosa di un "campo di forza".

Convenientemente, ogni volta che viene creato un GameObject, viene automaticamente assegnato un collisore appropriato. Un cubo prende un BoxCollider, una sfera prende uno SphereCollider, un cilindro ottiene un CapsuleCollider e così via.

Alla fine avremo bisogno di alcuni blocchi per abbattere:

  • Fai clic su GameObject> Crea altro> Cubo
  • Rinominare il cubo in Blocco di legno
  • Imposta la posizione del blocco su 0, 0, 0. Questo centrerà il Blocco nel mondo
  • Scarica Wood.jpg
  • Trascina Wood.jpg nel pannello Progetto per renderlo una texture
  • Trascina la Texture Legno sul Blocco nella Vista Scena, questo creerà automaticamente un materiale Legno per noi e lo applicherà al Blocco
  • Trascina il Blocco dal pannello Gerarchia nel pannello Progetto per trasformarlo in Prefabbricato

Se premiamo Play, il blocco non farà nulla. Mentre ha un collisore, manca un corpo rigido, quindi non è influenzato da alcuna forza fisica.


Rigidbodies

Un corpo rigido è l'elemento più critico in un motore fisico. Qualsiasi GameObject a cui è collegato è incluso nella simulazione.

  • Seleziona il blocco prefabbricato nel pannello Progetto
  • Fare clic su Componente> Fisica> Corpo rigido

Per impostazione predefinita, un corpo rigido è influenzato dalla gravità e dalla resistenza dell'aria, noto anche come resistenza. Se premiamo Play, il blocco inizierà a cadere, accelerare e alla fine colpirà la velocità finale quando la forza di gravità e la forza di gravità si uniformano.


Costruisci una struttura

Dovremo creare alcuni altri elementi per costruire un livello adeguato. Innanzitutto, aggiungiamo un po 'di terreno in modo che il blocco abbia qualcosa su cui atterrare.

  • Fai clic su GameObject> Crea altro> Piano
  • Rinominare l'aereo in Terra
  • Imposta la posizione di Ground su 0, 0, 0
  • Scarica Grass.jpg
  • Trascina Grass.jpg nel pannello Progetto per renderlo una texture
  • Trascina la texture Grass sul terreno nella vista scena

A Ground verrà automaticamente assegnato un MeshCollider che impedirà il passaggio di tutti i corpi rigidi. Premi Play e il Block dovrebbe cadere e sistemarsi in cima al terreno.

Ora abbiamo bisogno di una struttura per abbattere. Seleziona il blocco e premi Ctrl + D in Windows, o Cmd + D in OSX, per duplicare il blocco alcune volte. Usa la scala e sposta gli strumenti per allungare e posizionare i blocchi approssimativamente nella stessa configurazione dell'immagine sottostante.

NOTA: È una buona idea usare numeri precisi per le tue trasformazioni. I blocchi devono essere l'uno contro l'altro, ma non si sovrappongono. Le sovrapposizioni causano la perdita di potenza del motore fisico e fanno cose imprevedibili.


Controlli della fotocamera

Ora che abbiamo creato la nostra bellissima struttura, scriviamo una sceneggiatura che ci consentirà di spostare la fotocamera in modo da poter ammirare la nostra creazione da tutti gli angoli.

  • Fai clic su Risorse> Crea> Script C #
  • Rinominare lo script in Cannone (perché alla fine la nostra macchina fotografica farà le riprese)
  • Trascina lo script sulla fotocamera principale
  • Fai doppio clic sullo script per modificarlo

Il seguente script farà in modo che la videocamera orbiterà intorno al centro del mondo e inclinerà su e giù:

 Cannone di classe pubblica: MonoBehaviour void LateUpdate () float x = Input.GetAxis ("Mouse X") * 2; float y = -Input.GetAxis ("Mouse Y"); // vertical inclilting float yClamped = transform.eulerAngles.x + y; transform.rotation = Quaternion.Euler (yClamped, transform.eulerAngles.y, transform.eulerAngles.z); // horizontal orbiting transform.RotateAround (new Vector3 (0, 3, 0), Vector3.up, x); 

Come tocco finale, rendiamo più facile mirare aggiungendo un mirino alla nostra fotocamera:

  • Fai clic su GameObjects> Crea> Piano
  • Rinominare l'aereo in Crosshair
  • Imposta la posizione del mirino su 0, 0, 0
  • Scarica Crosshair.png
  • Trascina Crosshair.png nel pannello Progetto
  • Trascina la texture Crosshair sul piano Crosshair nel pannello Scena
  • Nell'Inspector, fai clic con il pulsante destro del mouse sul componente MeshCollider e rimuovilo in modo che non influisca sugli altri oggetti fisici nella scena

Spara palle di cannone

Essere in grado di guardare la nostra struttura va bene, ma questo dovrebbe riguardare la fisica! Abbiamo bisogno di un modo per abbatterlo per vedere la fisica in azione. Ciò di cui abbiamo bisogno è qualcosa da sparare!

  • Fai clic su GameObject> Crea altro> Sfera
  • Rinominare la sfera in Palla di cannone
  • Imposta la posizione della palla di cannone su 0, 0, 0
  • Con la palla di cannone selezionata, fare clic su Componenti> Fisica> Corpo rigido
  • Trascina Cannonball dal pannello Gerarchia al pannello Progetto per trasformarlo in Prefabbricato

Dal momento che stiamo per sparare palle di cannone direttamente dalla fotocamera, possiamo modificare il nostro script Cannon esistente. Innanzitutto, aggiungiamo un attributo pubblico nella parte superiore della classe per il nostro prefabbricato a proiettili.

 Cannone di classe pubblica: MonoBehaviour public GameObject projectilePrefab;

Aggiungiamo un metodo FixedUpdate per ascoltare il pulsante "Fire1" da premere, quindi istanziare un prefabbricato Cannonball, posizionarlo sulla telecamera e quindi aggiungere una forza per spostarlo in avanti.

 void FixedUpdate () if (Input.GetButtonDown ("Fire1")) GameObject projectile = Instantiate (projectilePrefab, transform.position, transform.rotation) come GameObject; projectile.rigidbody.AddRelativeForce (new Vector3 (0, 0, 2000)); 

confini

Potresti aver notato che se una palla di cannone viene sparata abbastanza lontano, può cadere dal bordo del nostro piano di terra. Questa palla di cannone continuerà ad esistere fintanto che il gioco continua a funzionare e la sua fisica continuerà a essere calcolata, rallentando infine le cose. Dobbiamo creare un limite attorno al livello e distruggere qualsiasi oggetto di gioco che lasci questo limite.

  • Fai clic su GameObject> Crea vuoto
  • Rinominalo in Confine
  • Impostare la posizione x, yez z del limite su 0
  • Con il confine selezionato, fare clic su Componenti> Fisica> Collimatore
  • Nell'insector, assicurati che Is Trigger sia selezionato
  • Imposta il Centro di controllo del riquadro su 0, 25, 0
  • Imposta la dimensione di Box Collider a 50, 50, 50

Ora abbiamo bisogno di creare la sceneggiatura che distruggerà e gli oggetti che si allontanano al di fuori del confine.

  • Fai clic su Risorse> Crea> Script C #
  • Rinominare lo script in Confine
  • Trascina lo script sull'oggetto Boundary nel pannello Gerarchia
  • Modifica lo script e aggiungi il seguente codice
 limite di classe pubblica: MonoBehaviour void OnTriggerExit (Collider other) Destroy (other.gameObject); 

Causando la distruzione

Abbiamo bisogno di un modo per vincere il nostro livello. Per fare questo, i nostri blocchi devono essere distrutti se prendono abbastanza danni dagli impatti.

  • Fai clic su Risorse> Crea> Script C #
  • Rinominare lo script in Bloccare
  • Trascina lo script sul blocco prefabbricato nel pannello Progetto
  • Fai doppio clic sullo script nel pannello Progetto per modificarlo

Nella sceneggiatura, diamo al prefabbricato una proprietà pubblica per la salute che può essere regolata nell'editor. Ciò consente a diversi blocchi di avere diversi livelli di salute.

 classe pubblica Block: MonoBehaviour public float health = 20;

Quando viene rilevata una collisione, viene misurata l'entità dell'impatto. Maggiore è la grandezza, maggiore è il danno che è stato fatto. Qualunque cosa al di sopra di un tocco leggero viene sottratta dalla salute del blocco. Se la salute del blocco scende sotto 0, il blocco si distrugge. Quindi controlla per vedere quanti altri blocchi rimangono nella scena. Se è rimasto solo un blocco, il gioco è finito e si ricarica la scena per giocare di nuovo.

 void OnCollisionEnter (Collision collision) // applica il danno da collisione if (collision.relativeVelocity.magnitude> 0.5) health - = collision.relativeVelocity.magnitude;  // distruggi se la salute è troppo bassa se (salute <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Blocchi di cemento

Finora, abbiamo usato solo blocchi di legno. Sono leggeri e relativamente deboli, rendendo la struttura troppo facile da distruggere e abbastanza prevedibile nel modo in cui si muoverà. Abbiamo bisogno di creare un altro tipo di blocco, uno più pesante e più forte.

  • Nel pannello Progetto, duplicare il prefabbricato WoodBlock (Ctrl + D in Windows, Cmd + D in OSX)
  • Rinominare il duplicato in ConcreteBlock
  • Scarica Concrete.jpg
  • Trascina Concrete.jpg nel pannello Progetto
  • Trascina la texture Concrete sul prefabbricato ConcreteBlock nel pannello Progetto
  • Con il prefabbricato selezionato, usa Inspector per aggiornare Health a 50
  • Nel componente Rigidbody, aumenta la massa a 5 per renderla più pesante
  • Trascina il prefabbricato ConcreteBlock nella scena

Prova a sostituire alcune traverse con blocchi di cemento. I blocchi di cemento dovrebbero essere più difficili da ribaltare, cadere con grande impatto ed essere più difficili da distruggere con palle di cannone.


Gioco finito

Di seguito è riportato il gioco finito in esecuzione in Unity Web Player. Usa il mouse per muovere la telecamera e premi Ctrl o il tasto sinistro del mouse per sparare palle di cannone.




Conclusione

Questo tutorial graffia solo la superficie di ciò che è in grado di fare il motore fisico Unity. Forze costanti, forze esplosive, materiali fisici, cardini, molle, ragdoll, ecc. Anche se questo può sembrare scoraggiante, gli elementi del motore fisico Unity si adattano tutti insieme, rendendo facile comprendere e facilmente implementare la fisica nei tuoi giochi.

Per ulteriori informazioni sulle funzionalità del motore fisico Unity, visitare:

http://docs.unity3d.com/Documentation/Manual/Physics.html