Vandaag gaan we dieper in op UDK's Kismet en kijken we naar het ontwikkelen van evenementen, wat ze zijn, hoe we ze kunnen maken en hoe we ze kunnen beheren. Je leert hoe je bijna elk type evenement in UDK kunt maken en beheren om complete, complexe en volledig gescripte levels te kunnen maken, te beginnen met het eenvoudige niveau dat we in deze tutorial zullen creëren.
In UDK is een gebeurtenis een bepaalde situatie die je definieert (uiteraard in Unreal Kismet) die consequenties heeft voor het spel of voor andere spelelementen. U kunt gebeurtenissen overal in een niveau creëren, zonder beperkingen. U kunt ze in drie verschillende groepen indelen: voorgecompileerde gebeurtenissen, triggergebeurtenissen of InterpActor-evenementen. In deze zelfstudie bespreken we ze allemaal om u een volledig beeld te geven van hoe een gebeurtenis wordt gemaakt en gemanipuleerd.
Vooraf gecompileerde evenementen: als je de Unreal Kismet opent (de groene K bovenaan het UDK-venster, bij het pictogram van de inhoudsbrowser en het Matinee-pictogram) en rechtsklik op een lege ruimte in het Kismet-venster, en je ondergaat "Nieuw evenement", ziet u veel kant-en-klare evenementen gegroepeerd als "Actor", "AI" of "Pawn" bijvoorbeeld. Actor, AI en Pawn zijn in dit geval het activerende deel van een evenement en zonder deze begint het evenement helemaal niet. Dus een voorbeeld: als je wilt dat een evenement begint wanneer een vijand sterft, moet je onder "Pawn" gaan, omdat een vijand een pion wordt genoemd en de dood kiest.
Maak voor ons doel een 512 x 512 x 256 Uitgeholde kubus.
Voeg nu een puntlicht toe aan de ruimte door de L toets op het toetsenbord en klik vervolgens met de linkermuisknop in de kamer die we zojuist hebben gemaakt (de kubus).
Verplaats het licht naar het midden van de kamer en herbouw dan de verlichting (met of zonder Lightmass, het is niet belangrijk.)
Gedaan? Nu kunnen we beginnen met ons eerste UDK-evenement, een voorgecompileerd evenement in dit geval. De meest voorkomende vooraf gecompileerde gebeurtenis die door een UDK-coder wordt gebruikt, is de gebeurtenis 'Level Loaded'. Zoals u zich kunt voorstellen, start deze gebeurtenis wanneer het niveau is geladen. Dus laten we beginnen met dit: ga naar Unreal Kismet, klik met de rechtermuisknop op een lege ruimte en ga naar Nieuw evenement> Niveau geladen.
Nu zou u een Node genaamd "Level Loaded" in uw Kismet moeten hebben. Als dat zo is, kun je nu zien dat dit knooppunt drie uitgangen heeft of, beter in dit geval, drie voorwaarden om de gebeurtenis te activeren: wanneer het niveau geladen en zichtbaar is, aan het begin van het level of wanneer er een niveau-reset is. Deze omstandigheden spreken voor zich, in feite is het enige verschil tussen "Geladen en Zichtbaar" en "Begin van niveau" een kleine vertraging van de tweede vergeleken met de eerste. Terwijl de derde gaat over een herladen van het niveau, maar we komen nu niet in deze functie.
We gaan een soort alarm maken dat de speler opdraagt zich voor te bereiden omdat er een vijand aankomt. Laten we om dit te bereiken een ander knooppunt maken door (altijd met de rechtermuisknop) naar te gaan Nieuwe actie> Stem / aankondigingen> Aankondiging afspelen.
Klik nu op dit knooppunt en typ in de balk met aankondigingstekst "Bereid je voor! Er komt een robot om je te vermoorden!" Hiermee vertellen we UDK om een tekst in het midden van de monitor te schrijven die de speler adviseert dat er een robot komt om hem te doden, dus hij moet zichzelf voorbereiden om te vechten.
Maak nu nog eens 6 Play Announcement Nodes, zoals we eerder hebben gedaan.
In de laatste schrijf je onder Aankondigingstekst "Take the Shock Rifle en het gevecht zal beginnen!".
In de andere Nodes gaan we een degelijke aftelling gebruiken die is opgenomen in de UDK-activa. Ga dus naar de "Inhoudsbrowser" en schrijf in de zoekbalk "countdown". Er verschijnt een Ten Soundnode Wave en selecteer vervolgens de "Countdown 5".
Keer nu terug naar Kismet en klik op het eerste lege Play Announcement Node. Ga naar de balk met aankondigingsgeluiden en klik op de groene pijl aan de rechterkant. De naam van de SoundNode Wave moet in de balk verschijnen. Wat u zojuist hebt gedaan, is UDK vertellen om het geluid een aantal keren (vijf) af te spelen om een aftelling te maken.
Dus nu, doe wat je net hebt gedaan met het vorige knooppunt, met de vier resterende Play Announcement Nodes. Vergeet niet dat u eerst het nummer voor het aftellen in de inhoudsbrowser (de vierde, de derde, de tweede en de eerste) moet selecteren en vervolgens op het knooppunt in Kismet klikt, en klik vervolgens in de aankondigingsgeluid op de groene pijl om steek het erin.
Gedaan? Goed. Nu is het tijd om de gebeurtenis aan te sluiten op de knooppunten die we hebben gemaakt. Verbind de Uitgang van "Begin Niveau" met het eerste Aankondigingsknooppunt.
Dan, van de uitgang van uw eerste aankondigingsknooppunt naar de ingang van het tweede aankondigingsknooppunt, enzovoort (zoals hieronder getoond)
Nu, als het level begint, hebben we een reeks aankondigingen die de speler adviseren, maar als we ze laten zoals ze zijn, wordt er slechts één aankondiging op het scherm weergegeven en krijgt de speler niet alle informatie die we hem willen geven . Om ze allemaal weer te geven, moeten we een vertraging instellen tussen onze Aankondigingsknooppunten. Dus klik met de rechtermuisknop op de Output (de zwarte rechthoek) van het eerste Announcement Node en klik op "Set Activate Delay". Stel in het venster dat verschijnt de vertraging in 2.0 en klik op OK.
Herhaal de vorige stap voor de verbindingen tussen de andere knooppunten, maar stel deze keer de vertraging in op 1.0, omdat er het aftellen is!
Triggergebeurtenissen: dit zijn bepaalde gebeurtenissen die worden gebruikt om een deel van een element te activeren, wat tijdens het spelen niet wordt getoond, een "Trigger" genoemd. Triggers zijn cilinders, maar geen goede cilinders. Ze hebben een straal en een hoogte, maar zijn geen penseel of iets waar je een materiaal op kunt toepassen. De straal en hoogte van deze cilinders beschrijven het gebied dat een speler, een pion of wat dan ook, de relatieve gebeurtenis kan activeren. Dus in dit geval zijn spelers of pionnen niet direct verantwoordelijk voor het begin van een evenement, maar ze activeren het door contact met het gedefinieerde gebied van de Trigger's cilinder.
Weet je nog dat je schreef in de laatste aankondiging "Take the Shock Rifle?"? nou ik denk dat het tijd is om er een in je level te zetten. Maar laten we eerst een Trigger inleggen, die ons zal helpen om het gebied te definiëren waarin de speler het volgende evenement zal activeren, en waar we onze Rocket Launcher zullen spawnen. Dus klik met de rechtermuisknop op de vloer, ga naar "Voeg acteur toe" en selecteer "Add Trigger". Nu zul je merken dat er een vreemd icoon is verschenen, wat een schakelaar lijkt, met een rode rechthoek die zich om een groene cilinder wikkelt.
Nu, zoals ik al eerder zei, de cilinder is het gebied dat bepaalt of er contact is met de speler of niet, en activeert een gebeurtenis. Laten we het groter maken. Klik met de rechtermuisknop op de trigger, ga naar "Eigenschappen" en onder "Cilindercomponent", wijzig de cilinderradius en hoogte naar wens (ik ga voor een 60-60.)
Waarschijnlijk als bij de mijne, is de cilinder van je Trigger in de grond gevallen. Dus schuif het omhoog en als je klaar bent, keer je terug naar Kismet.
Klik met de rechtermuisknop op een lege ruimte naast de laatste aankondiging en ga naar Nieuwe actie> Acteur en selecteer "Actor Factory".
Klik op dit knooppunt en klik in de fabrieksbalk op de blauwe pijl links en selecteer "UTFactoryPickup". Klik vervolgens op "Fabriek" om het uit te vouwen en selecteer in de inventarisbalk "Shock Rifle".
Selecteer vervolgens de Trigger in het level en keer terug naar Kismet, klik met de rechtermuisknop op de "SpawnPoint" -invoer en klik op "New Object Var using Trigger".
Verbind nu de uitgang van het laatste aankondigingsknooppunt met de ingang van het actorfabrieksnooppunt. Nou, we hebben eindelijk ons Shock Rifle dat spawnen na de laatste aankondiging.
Nu moeten we een vijand spawnen nadat de speler het Shock Rifle heeft genomen. Om dit te doen, maken we een Trigger Event. Ga met de trigger geselecteerd in het niveau naar Kismet en klik met de rechtermuisknop op een lege ruimte. Selecteer vervolgens "Touch" onder "New Event Using Trigger". Dit betekent dat het evenement wordt geactiveerd wanneer de speler het gebied van de cilinder betreedt. Een andere veel voorkomende keuze is "Gebruikt", dit betekent dat wanneer de speler zich voor de cilinder bevindt en op de E-toets drukt, hij een gebeurtenis kan activeren. De andere zijn kleine keuzes, die niet vaak met een trigger worden gebruikt.
Maak nu een ander "ActorFactory" -knooppunt, maar selecteer deze keer in de fabrieksbalk "UTActorAI". En in de Factory-eigenschappen, stel de ControllerClass: in op "UTBot", de PawnClass: op "UTPawn" en controleer de eigenschap "GiveDefaultInventory".
Geef hem dan een naam (ik laat de beslissing aan jou over) en verbind de "Trigger Touch" -gebeurtenis met "Actor Factory". Klik nu met de rechtermuisknop op de "Uitgezette" Uitgang en selecteer "Create New Object Var".
In je level, aan de andere kant van je Trigger, klik je met de rechtermuisknop op de vloer, ga je naar "Add Actor" en selecteer je "Add Pathnode".
Keer nu terug naar Kismet, klik met de rechtermuisknop op "Spawn Point" en selecteer New Object Var met Pathnode. Eindelijk, je hebt je eerste Trigger Event gecreëerd en laat je vijand paaien nadat de speler het wapen heeft genomen, het enige dat overblijft is om de vijand een doelwit te geven.
Klik in Kismet met de rechtermuisknop en ga naar Nieuwe actie> Misc en selecteer "Trace".
Verbind de "Finished" Output van ActorFactory met de "Trace" Input en verbind vervolgens de Start Input van "Trace" met de Object Variable van ActorFactory's "Spawned".
Klik nu met de rechtermuisknop op een lege ruimte en ga naar Nieuwe actie> AI en selecteer "Start Firing At".
Klik vervolgens met de rechtermuisknop op een lege ruimte, ga naar Nieuwe actie> AI en selecteer deze keer "Stop Firing".
Verbind de uitgang "Not Obstructed" met "Start Firing At" en "Obstructed" met "Stop Firing".
Verbind de uitgang van zowel "Start" als "Stop Firing" met de invoer van "Trace" (zie afbeelding).
Stel hun uitgangsvertraging in op .5.
Verbind de doelinvoer van zowel "Start" als "Stop Firing" met de objectvariabele van de spawn.
Klik nu met de rechtermuisknop op een lege ruimte en ga naar Nieuwe variabele> Speler, en selecteer "Speler".
Verbind de "Fire At" -ingang met de spelervariabele. Plots heb je een bot (een vijand) gemaakt die spawnt in de trigger-cilinder en vervolgens naar de speler zoekt. En als hij ergens door belemmerd wordt, schiet hij niet, terwijl hij, als hij niet belemmerd wordt, vrij kan schieten op de speler.
Als je nu je niveau probeert, zie je dat de vijand soms spawelt voor het einde van het aftellen. Dit gebeurt omdat de Trigger al is ingeschakeld en niet wacht op het einde van de vorige Kismet-reeks. Om dit alleen te activeren wanneer het aftellen is voltooid, gaan we naar Kismet, selecteer "Trigger Event Touch" en verwijder "Ingeschakeld" in zijn eigenschappen.
Klik vervolgens met de rechtermuisknop (zoals altijd in Kismet) en ga naar Nieuwe actie> Toggle en kies "Toggle".
Verbind nu de uitgang van het laatste Play Announcement Node met de "Turn On" ingang van het Toggle Node en de "Event" output van "Toggle" met de "Trigger Touch Event". Nu heb je een triggergebeurtenis die is ingeschakeld wanneer de afspeelmededeling is beëindigd.
InterpActor, StaticMeshActor en Brush-gebeurtenissen: deze zijn vergelijkbaar met triggergebeurtenissen, in feite worden deze gebeurtenissen altijd geactiveerd door contact met een gebied, maar in dit geval niet met een cilindrisch gebied, maar met een aangepast gebied ten opzichte van de InterpActor (of StaticMeshActor of penseel) gekozen. De enige grote verandering, behalve het andere gebied waarmee je contact kunt opnemen, is dat de Trigger zichtbaar is tijdens het spelen en dat je er tijdens het spelen fysiek contact mee kunt maken.
Eindelijk zijn we bij InterpActor Events aangekomen. Voor dit soort evenementen maken we een soort van scheiding tussen het niveau en splitsen het op in twee delen, maar op een unieke manier! Ga dus naar de "Inhoudsbrowser" en zoek naar "thinwire", wanneer de zoekopdracht is voltooid, dubbelklik op "Thinwire16" en klik met de rechtermuisknop in uw niveau en selecteer "InterpActor toevoegen".
Zoek nu naar "connector" en selecteer het eerste resultaat van uw zoekopdracht, voeg deze InterpActor tweemaal toe.
Pas deze drie elementen aan zoals wordt weergegeven in de onderstaande afbeelding om de ruimte in twee delen te verdelen. (Voor dit doel, schaal de dunne draad in Y door 1.2)
Met deze elementen nog steeds geselecteerd, druk op F4 om de eigenschappen te openen.
Ga nu naar "Collision" en stel het "Collision Type" in op "Touch All".
Wat je zojuist hebt gedaan, is dat er drie InterpActor's op het niveau staan met een botsingstype dat is ingesteld op Alles aanraken. Dit betekent dat in dit geval een gebeurtenis wordt geactiveerd als de speler of iemand anders de draden of de aansluitingen aanraakt. Nu moeten we deze gebeurtenis maken! Selecteer de drie acteurs die we hebben gemaakt, ga naar Kismet, klik met de rechtermuisknop op een lege ruimte en ga naar "Nieuw evenement met behulp van InterpActor?", En selecteer "Touch".
Klik met de rechtermuisknop in Kismet, ga naar Nieuwe actie> Acteur en selecteer "Modify Health".
Selecteer het knooppunt "Modify Health" en stel de schadebedrag in 100 (het leven van de speler) kun je het Schade Type ook instellen op Crushed of Telefragged als je een geluid wilt laten spelen wanneer de Speler de schade ontvangt.
Klik nu met de rechtermuisknop in Kismet, ga naar Nieuwe variabele> Speler en selecteer "Speler".
Verbind de "Target" Input van "Modify Health" met deze variabele.
Verbind alle "aangeraakte" uitgangen van de InterpActor Events met de "Modify Health" -knoop. Wanneer iemand de draden of de aansluitingen aanraakt, gaat de speler dood. Niet zo gelijk, maar op dit niveau beweegt de vijand niet zelf, hij staat gewoon recht voor je en schiet je neer, zodat hij de draden niet kan aanraken. Terwijl de speler voorzichtig moet zijn wanneer hij zelf beweegt.
Er is nog steeds een probleem dat moet worden verholpen. Als je doodgaat door de draden of de connectors aan te raken en te respawnen, raak je de InterpActor aan die je net heeft gedood, en dood je je niet opnieuw. Dat komt omdat onze evenementen slechts één keer worden geactiveerd. Om dit op te lossen, ga naar Kismet, selecteer alle InterpActor Event Nodes en ga verder onder "Sequence Events".
Deze eigenschappen zijn hetzelfde in het startknooppunt van elk evenement: "Max. Triggertelling" betekent hoe vaak het evenement kan worden geactiveerd. "Triggervertraging" betekent hoe lang een activering duurt vóór de volgende. "Ingeschakeld" betekent duidelijk dat als het is aangevinkt, de gebeurtenis is geactiveerd, anders is het inactief. "Prioriteit" is handig wanneer u veel gebeurtenissen hebt die op hetzelfde moment starten en ten slotte betekent "Alleen speler of alleen client" wie deze gebeurtenis kan activeren. Stel voor ons doel de "Max. Aantal toeren" in op 0 (oneindig).
Eindelijk is het level voltooid, dus bewaar, herbouw je levelverlichting en paden en je bent klaar om het level te proberen!
Klik nu met de rechtermuisknop en ga naar "Nieuwe voorwaarde" en selecteer "Is in leven".
Sluit de afgewerkte uitgang aan op "Is Alive's" ingang en verbind de "Ware" uitgang met "Trace" en "Start Fire At" en de "Stop Fire" met "Is Alive's" ingang. Verbind ook de "Is Alive's" Player met het "Spawned" -object. Nu heb je eindelijk de fout opgelost (probeer het gewoon!) En ben je klaar om je niveau te spelen!