In deze tutorial laat ik je zien hoe je een eenvoudig verbrijffect voor je Unity-game kunt maken. In plaats van alleen een kist (of een ander object) te "verwijderen" wanneer het wordt geraakt of vernietigd, kunnen we het in kleinere stukjes laten splinteren.
Voor deze zelfstudie hebt u de nieuwste versie van Unity nodig en wat basiservaring hiermee. Voor het meer geavanceerde effect later in de zelfstudie is ook een 3D-modelleringstool nodig. Als je er geen hebt of de objecten zelf niet wilt modelleren, heb ik ze bij de brondownloads gevoegd. (De Unity-bestanden zelf zijn daar ook beschikbaar.)
In de basisversie van dit effect wordt een kubus vernietigd, waardoor er meerdere fragmenten achterblijven die realistisch op de grond vallen:
Later zullen we de kubus omschakelen voor een meer gecompliceerd vatmodel:
Je kunt het hier zelf uitproberen:
Klik om de demo te proberen. (De demo van de kubus is hier ook beschikbaar.)Maak een nieuw Unity-project en open een nieuwe scène. Maak een vlak, dat zal fungeren als onze grond, en een kubus, die het vernietigbare object zal zijn. Plaats ook een gericht licht om dingen zichtbaarder te maken. Maak twee nieuwe materialen en wijs deze toe aan de vloer en de kubus, zodat we ze uit elkaar kunnen houden en verplaats de camera zodat alles zichtbaar is:
Er zijn veel manieren om de kubus te "vernietigen". Voor nu nemen we de eenvoudigste aanpak mogelijk.
Maak een nieuw JavaScript-bestand en geef het een naam destructionController.js
. Hierin plaatsen we alle functionaliteit van het verwijderen van de kubus en het maken van de fragmenten. Voeg de volgende regels toe:
function Update () if (Input.GetKey (Keycode.space)) Destroy (gameObject);
Voeg nu het script toe aan de kubus door het naar de kubus te slepen. Start het spel en maak een testrun. Als u op spatie drukt, moet de kubus worden verwijderd.
Nadat het is verwijderd, verschijnt het ook niet meer in de hiërarchie, zoals u kunt zien in de schermafbeelding.
Maak nu acht kleinere kubussen; dit zijn de "fragmenten" van de huidige kubus. Geef ze hetzelfde materiaal als de kubus. (Maak je geen zorgen over het uiterlijk, we zullen ze er later fantastisch uit laten zien.) Ze zouden er als volgt uit moeten zien:
Stapel alle 8 kubussen om een grotere, enkele kubus te vormen, zonder dat ze elkaar kruisen:
Geef elke kubus een star lichaam, plaats hun massa- naar 22
, activeren gebruik de zwaartekracht, en deactiveren is kinematisch. Hierdoor vallen de fragmenten naar beneden en gebruiken ze natuurkunde. Als u wilt, kunt u deze waarden later aanpassen om resultaten te produceren die beter geschikt zijn voor uw game.
Groepeer de blokjes nu onder een nieuwe lege gameObject
en noem het remainsCube
. Wanneer de originele kubus wordt vernietigd, wordt deze vervangen door dit nieuwe object dat is gemaakt van kleinere kubussen.
Sleept de remainsCube
object in de projectmap om er een prefab van te maken. Zodra het zich veilig in de prefab-map bevindt, verwijdert u het uit de hoofdscène en is het gereed voor gebruik.
Voeg de gemarkeerde lijnen toe aan de destructionController
script:
var blijft: GameObject; function Update () if (Input.GetKey (Keycode.space)) Instantiate (blijft, transform.position, transform.rotation); Vernietigen (gameObject);
Hiermee wordt een kopie van de overblijfselen gemaakt op de exacte positie van de kubus. Daarna wordt de kubus verwijderd, waardoor de illusie wordt gewekt dat de nieuwe eigenlijk de oude is, maar "gebroken".
Om dit te laten werken, moet je de resten handmatig toewijzen aan de kubus. Klik erop en in de Inspecteur je zou een tabblad moeten zien met de Destruction Controller script. Er zou een gokkast moeten zijn Stoffelijk overschot, welke momenteel leeg zou moeten zijn. Sleept de stoffelijk overschot
prefab uit de projectmap in deze sleuf. De Destruction Controller script in de Inspecteur zou er nu als volgt uit moeten zien:
Maak een testrun! Als alles correct is ingesteld, moet de kubus worden vervangen als u op spatie drukt. Als je geluk hebt, moeten ze dan op de grond vallen.
Dus deze basis kubus:
... zou in iets vergelijkbaars moeten veranderen:
Helaas is het niet gegarandeerd dat de fragmenten op een mooie manier zullen tuimelen. Gelukkig zijn er manieren om dat op te lossen.
Maak een nieuwe leeg gameObject
en geef het een bol-collider, maar geen rigide lichaam. Trek de overblijfselen naar de scène, zodat u ze kunt bewerken. Voeg het bol-collider-object toe aan de resten en plaats het zo dat het snijdt met enkele van de kubussen:
Nu botsen de fragmenten onmiddellijk tegen de bol, waardoor een tuimeleffect ontstaat:
Afhankelijk van het spel dat je aan het bouwen bent, kunnen we niet teveel "splinters" tegelijk in een scène veroorloven. De eenvoudige oplossing is om ze na een paar seconden te verwijderen. Maak hiervoor een nieuw JavaScript-bestand en geef het een naam selfDestruct.js
. Plaats de volgende code erin:
functie Start () render WaitForSeconds (4.0); Vernietigen (gameObject);
Wanneer het object is gemaakt, wacht het vier seconden en wordt het vervolgens zelf verwijderd. Voeg deze code toe aan de stoffelijk overschot
voorwerp. Als je nu de kubus vernietigt en de fragmenten maakt, zullen de overblijfselen zichzelf na vier seconden vernietigen.
En dat is het! Nu heb je de basis om een object efficiënt te laten "uiteenspatten" in verschillende kleinere stukken wanneer het wordt vernietigd. Je kunt dit effect gebruiken zoals het is, maar laten we het een beetje verder nemen en kijken hoe het te gebruiken met een complexer object.
Nu we het basissysteem hebben geïnstalleerd, kunnen we het mooier maken door de kubussen te vervangen door echte objecten.
Als u bedreven bent in een 3D-modelleertool, kunt u uw eigen objecten maken. Als dat niet het geval is, of als er geen beschikbaar is, kunt u het voorbereide 3D-bestand van de bron downloaden.
Kopieer het bestand naar uw activamap en de 3D-modellen worden automatisch voor uw gebruik geïmporteerd. Klik voordat u ze gebruikt op het bestand in de Asset Explorer en zorg ervoor dat de bronbestanden correct worden geïmporteerd op een schaalfactor van 1
(niet 0.1
of 0.001
; dat maakt het alleen maar ingewikkelder).
Als u naar de objecten kijkt, ziet u een veld met de naam meshfilter in de Inspecteur. Als u erop klikt, krijgt u een lijst met alle beschikbare netten in het project. Vervang nu alle kubussen in de Cube-resten met tonvormige onderdelen.
De intacte kubus krijgt de vat
mesh; de kleinere kubusfragmenten hebben de mazen nodig barrel_fragment_01
naar barrel_fragment_08
. Nadat deze zijn toegewezen, stelt u hun lokale posities in (0, 0, 0)
. (Hun draaipunten zijn zo ingesteld dat ze op die manier eenvoudig op nul kunnen worden gezet.)
In plaats van een box-collider zou een mesh-collider veel handiger zijn. Verwijder alle box-colliders op de fragmenten en vervang ze door mesh-colliders. Controleer elke mesh-collider en zorg ervoor dat elke mesh correct is toegepast (dat wil zeggen, barrel_fragment_01
heeft de barrel_fragment_01
mesh, enzovoort).
Zodra dat is gebeurd, stelt u alle mesh-colliders in convex
. (Een niet-convexe mesh-collider kan niet botsen met andere niet-convexe mesh-colliders.) Het is ook een programmering.) Verwijder ook de bol-collider die we aan de overblijfselen hebben toegevoegd, omdat het misschien niet nodig is.
Alles is goed ingesteld, je moet een vat hebben dat uit elkaar springt in acht kleinere stukken.
Hetzelfde systeem kan ook worden gebruikt om andere effecten aan de vernietiging toe te voegen. Heb je een explosie? Voeg het toe aan de resten! Voeg geluiden toe, voor een bevredigend resultaat barst. Zet daar een deeltje-effect in, waardoor een kleine rookwolk ontstaat.
In deze tutorial heb ik je de meest eenvoudige manier laten zien om een object in kleinere fragmenten te laten versplinteren. Nu weet je hoe je een voorwerp moet vernietigen, het uit het spel verwijderen; hoe je het object kunt verwisselen met kleinere fragmenten direct voordat het wordt vernietigd; en hoe je de fragmenten daarna zelfvernietigt.
Dit systeem kan nu worden aangepast en aangepast aan veel specifieke doeleinden. Je zou een krat of een vat kunnen versplinteren en verbrijzelen wanneer je hem doodt. Je zou een explosie kunnen creëren nadat een vliegtuig is geraakt. Of je kunt een boot in twee stukken laten barsten. Genieten!