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.
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.
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:
Se premiamo Play, il blocco non farà nulla. Mentre ha un collisore, manca un corpo rigido, quindi non è influenzato da alcuna forza fisica.
Un corpo rigido è l'elemento più critico in un motore fisico. Qualsiasi GameObject a cui è collegato è incluso nella simulazione.
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.
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.
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.
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.
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:
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!
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));
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.
Ora abbiamo bisogno di creare la sceneggiatura che distruggerà e gli oggetti che si allontanano al di fuori del confine.
limite di classe pubblica: MonoBehaviour void OnTriggerExit (Collider other) Destroy (other.gameObject);
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.
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");
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.
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.
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.
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