Inhoud
- Wat vooraf ging
- Inleiding
- Bewegen langs een Spline
- Dynamisch actors maken met een Spline
- Cable
- Path
- Masterclass
Wat vooraf ging
- U bent vertrouwd met de werkomgeving van Unreal Engine.
- U bent vertrouwd met Blueprint Visual Scripting.
- U kunt berekeningen in een 3D omgeving uitvoeren.
- U kunt een Timeline toevoegen.
Inleiding
In deze handleiding bekijken we een Spline kunnen gebruiken om:
- Actors laten bewegen langs een voorgedefinieerd pad.
- Actors dynamisch aanmaken langs een pad.
Een derde gebruik van Splines is Landcape Splines om wegen te maken binnen een landschap, dit ga ik echter niet bespreken in deze handleiding. Wilt u hier meer over weten neem dan een kijkje in de officiële documentatie.
Situering van deze handleiding binnen Unreal Engine
Bewegen langs een Spline
Ik vertrek vanuit een bestaand Third Person Project (eventueel start u een nieuw Third Person Project op).
We maken een nieuwe klasse BP_MovingSpline aan.
- Maak eventueel een nieuwe folder aan. In de Content Browser, klik op Add New – New Folder.
Er zijn verschillende manieren om een nieuwe klasse aan te maken.
- In de Content Browser, klik op Add New – Blueprint Class (of klik met de rechtermuisknop in de net aangemaakte folder en klik op Blueprint Class).
- Of, klik in het menu op Blueprints – New Empty Blueprint Class….
U komt in onderstaand scherm waar u een Parent Class kunt selecteren. Bovenaan vindt u de meest gebruikte Parent Classes, onderaan kunt u eventueel een specifieke klasse zoeken (nadien verschijnt een knop Select om deze specifieke klasse als Parent Class te selecteren).
- Klik op Actor.
- Geef de nieuwe klasse de gewenste naam (bv. BP_MovingSpline) en dubbelklik om de klasse te openen.
Componenten
- Voeg de volgende componten toe (via Add Component):
- Static Mesh (die ik voorlopig een Plane heb toegekend).
- Box Collision die onder, een Child, de Static Mesh komt, zodat hij kan meebewegen met de Static Mesh.
- Klik op DefaultSceneRoot en voeg een Spline (geen SplineMesh) toe.
Alle componenten zijn toegevoegd.
Blueprint Visual Scripting
Constructor
Om te testen heb ik een Plane toegekend als Static Mesh maar het moet mogelijk zijn dit naar keuze te wijzigen, dit kunt u doen in de Constructor. Hiertoe heb ik een variabele aangemaakt van het type Static Mesh met de naam Moving Platform.
Event Graph
- Bij het starten van het programma (Event BeginPlay), zet de rotatie van de Static Mesh (SetRelativeRotaion), gelijk aan de rotatie van de Spline op Distance = 0 (Get Rotation at Distance Along Spline).
- Bij het beginnen overlappen (Event On Component Begin Overlap) van de Box Collision, start een Timeline die van 0 tot 1 gaat over een tijd van 5 seconden. De waarde tussen 0 en 1 van de TimeLine wordt aan de parameter Afstand toegekend.
- Vermenigvuldig de Afstand, verkregen door de Timeline met de lengte van de Spline (Get Spline Lenght)
- We kunnen nu de exacte positie en rotatie van de Spline op die afstand, tijdstip, opvragen via Get Location at Distance Along Spline en Get Rotation at Distance Along Spline. Vergeet niet de eigenschap Coordinate Space voor de locatie op World te zetten.
- Gebruik de verkregen locatie van de Spline als nieuwe locatie voor de Static Mesh via SetWorldLocation.
- Gebruik de verkregen rotatie van de Spline als nieuwe rotatie, relatief t.o.v. de Spline, voor de Static Mesh via SetRelativeRotation. Neutraliseer de rotatie voor de Y-as (hier omhoog en omlaag) door deze niet te verbinden.
Timeline
Voor het aanmaken van de Timeline kunt u terecht in de handleiding over Timelines.
Het is een eenvoudige TimeLine die een Float-waarde van 0 naar 1 wijzigt over een tijdspanne van 5 seconden. De waarde wordt meegegeven aan de parameter Afstand.
Onderstaande video demonstreert dit.
Dynamisch actors maken met een Spline
Onderstaande klasse stelt u in staat om via een Spline verschillende kopijen van een mesh aan te maken langs een pad bepaald door de Spline. Dit kan handig zijn als u een omwalling wilt maken, of buizen wilt leggen, eventueel zelf gebogen.
Dit systeem voegt pas een nieuwe mesh toe als de Spline lang genoeg is voor een nieuwe mesh. De Tangent wordt gebruikt om eventueel af te buigen. De te gebruiken mesh is vast en kan niet dynamisch gewijzigd worden, zoals hierboven.
- In de Content Browser, klik op Add New – Blueprint Class (of klik met de rechtermuisknop in de net aangemaakte folder en klik op Blueprint Class).
U komt in onderstaand scherm waar u een Parent Class kunt selecteren. Bovenaan vindt u de meest gebruikte Parent Classes, onderaan kunt u eventueel een specifieke klasse zoeken (nadien verschijnt een knop Select om deze specifieke klasse als Parent Class te selecteren).
- Klik op Actor.
- Geef de nieuwe klasse de gewenste naam (bv. BP_SplineMeshes) en dubbelklik om de klasse te openen.
Componenten
Er is maar één component nodig, een Spline.
Blueprint Visual Scripting
Constructor
Alle code komt in de Constructor.
Bekijk eerst de volledige code, nadien ga ik wat meer in detail.
Bepaal het aantal te creëren meshes
- Om het aantal meshes die moeten worden weergegeven te berekenen deelt u de lengte van de Spline (Get Spline Length) door de lengte van de mesh (de variabele Mesh Lenght, inderdaad, verkeerd gespeld).
- Truncate laat het gedeelte na de komma weg en levert een geheel getal op.
- Die -1 is een optie, start u zonder aanwezige mesh, de -1, of met een aanwezige mesh, zonder de -1.
- Nu we het aantal meshes kennen gebruiken we deze als Last Index van de For Loop.
Voeg de Mesh toe
- De Index van de lus wordt bewaard in een lokale variabele (variabele Local Index) die vooral om het overzicht te bewaren als we zo dadelijk verbindingen gaan maken.
- Binnen de lus worden de nodige meshes toegevoegd via Add Spline Mesh Component, meshes moeten via de eigenschap Static Mesh worden toegekend.
- Bepaal de voorwaartse as via Set Forward Axis (hier de X-as).
Zet de start en stop positie van de Mesh en zijn collision
- Geef de toegevoegde mesh weer door zijn start- en eindlocatie te bepalen via de functie Set Start and End en geef de mesh Collision via de functie Set Collision Enabled en kies onder New Type Collision Enabled (Query and Physics).
Bepaal de positie en hoek (tangent) van de Spline
- Bepaal de start– en eind locatie door de locatie van de Spline op te vragen met de functie Get Location at Distance Along Spline.
- Bepaal de start– en eind tangent door de tangent (raaklijn) van de Spline op te vragen met de functie Get Tangent at Distance Along Spline.
- De start krijgt u door de index van de lus (variabele Local Index) van de lus te vermenigvuldigen met de lengte van de mesh (variabele Mesh Lenght).
- Voor het einde moet u bij de index van de lus (variabele Local Index) 1 optellen en dan vermenigvuldigen.
- Om de tangent (raaklijn) niet te lang te laten worden wordt deze beperkt tot de lengte van de mesh (variabele Mesh Lenght) met de functie Clamp Vector Size.
Onderstaande afbeelding toont de Spline in actie, in geen tijd bouwt u deze omwalling, let op de lichte afbuiging. Sleep gewoon het witte bolletje van de Spline verder (let wel op dat u de mesh zelf niet verplaatst).
Onderstaande video was een inspiratiebron voor de code.
Nog een voorbeeld.
Cable
Onderstaande is een Blueprint Class waarin een Cable (kabel) langs een Spline loopt.
De componenten
Construeer de kabel
Plaats een CollisionCapsule langs de Spline
Distance Ratio
Als extraatje, onderstaande functie bepaalt waar op de Spline het Character zich bevindt en gebruikt de ratio (verhouding tussen de locatie van het Character op de Spline en de lengte van de Spline) om de Timeline op dat specifieke moment te starten.
Een praktisch gebruik van deze functies vindt u in het project Apex Legends – Zip lines.
Path
Splines kunnen ook gebruikt worden om een Path (een pad over de grond) aan te leggen op basis van een materiaal. Onderstaande Blueprint klasse legt zo’n pad aan.
Masterclass
Onderstaande Masterclass gaat wat dieper in op de Cable component.