Unreal Engine – Project Villa – Meshing Pass – Interactie

print
Deze handleiding maakt deel uit van het programmeertraject:



Wat vooraf ging

Deze handleiding bouwt verder op Unreal Engine – Project Villa – Meshing Pass.


Inleiding

In de Meshing Pass hebben we de brushes vervangen en aangevuld met meshes.

Sommige van deze meshes vragen echter interactie. Bijvoorbeeld, een deur moet open gaan, een licht moet aan of uit kunnen,…

Interactie toevoegen doet u via programmeercode, Blueprint Visual Scripting.

Omdat deze handleiding onderdeel is van een cursus binnen de opleiding ICT Programmeren wordt het programmeergedeelte, dat normaal deel uitmaakt van de Meshing Pass, er speciaal uitgelicht.

Het is niet de bedoeling om de programmeercode zelf gedetailleerd uit te leggen, dit gebeurt in andere handleidingen. Het is meer een overzicht van wat ik geprogrammeerd heb en dat is:

  • Informatietekst die mee roteert met de gebruiker
  • Deuren die openen
  • Lichten aan en uit
  • Schuiven open en toe
  • Beveiligingscamera die meedraait
  • Zaklamp

Interactie via Blueprints Visual Scripting

Informatietekst die mee roteert met de gebruiker

Om de gebruiker te informeren over de te gebruiken toetsen laat ik meteen een tekst zien, die mee roteert met de speler/gebruiker.

Blueprint

Object Name is de wat ongelukkig gekozen naam voor de variabele die de tekst bevat die moet getoond worden. Deze variabele is Instance Editable gemaakt zodat we deze Blueprint kunnen hergebruiken met wisselde tekst invoer. De tekst wordt getoond in een Tekst Render object via de functie Set Text.

Bij iedere Tick (Event Tick) wordt de onderlinge afstand tussen ons Player Character en de tekst (Self) berekend door beide locaties op te vragen via GetActorLocation en nadien te controleren of deze onderlinge afstand, verkregen via de functie VectorLenght, kleiner is dan een vooraf ingestelde waarde 1000 (hiervan zou u ook een Instance Editable variabele kunnen maken zodat u deze afstand gemakkelijk kunt wijzigen naargelang de situatie.

Vervolgens wordt de tekst (on)zichtbaar gemaakt.

De tekst wordt geroteerd door de functie SetWorldRotation. De rotatie zelf wordt berekend door de functie Find Look at Rotation die als invoer de locatie van ons Player Character en de tekst (Self) opvraagt.

Deuren

Deuren die opendraaien lijken eenvoudig maar kunnen voor problemen zorgen. Als een deur opendraait kan de deur in collision komen met uw karakter en duwt het karakter uw een beetje achteruit. Dit kan voor ongewenste resultaten zorgen, zoals het blijven steken in de deurcollision (een zogenaamde glitch). Tijdens het uittesten ben ik dit een paar keer tegengekomen.

Mogelijke oplossingen zijn:

  • schuifdeuren
  • deuren die altijd naar buitendraaien, ongeacht van de kant vanwaar u komt
  • een animatie die u door de deur brengt en voorbij het potentiële probleem

Geen van deze oplossingen is echter bruikbaar voor ons en we hebben nogal wat deuren in ons huisje. Ik heb het proberen op te vangen door 4 verschillende deuren te maken en deze gepast te gebruiken:

  • automatisch naar binnen open
  • automatisch naar buiten open
  • naar binnen open na drukken op O-toets
  • naar buiten open na drukken op O-toets

Het automatisch openen/sluiten lost geen problemen op maar voorkomt de noodzaak om telkens op de O-toets te drukken.

Bij het plaatsen van een deur kan het gebeuren dat u deze nog moet spiegelen over de Y-as, zodat de klink aan de gewenste kant staat.

  • Klik met de rechtermuisknop op de deur en kies voor TransformMirror Y.

Blueprints

Automatisch openen

Enkel het PlayerCharacter kan de deur openen, vandaar de controle via een Cast to PlayerCharacterLet op, in uw project kan het zijn dat u moet casten naar FirstPersonCharacter of ThirdPersonCharacter of…

Vervolgens wordt, gestuurd door een tijdlijn die een float-waarde tussen 0 en 90 aflevert, de deur geroteerd over de Z-as via de functie SetRelativeRotation waarvan ik de inputparameter gesplit heb om de individuele assen te kunnen sturen.

Bij het beëindigen van de overlapping wordt de tijdlijn geReversed.

Om de deur de andere kant te laten draaien moet u enkel de uitgevoerde float-waarde vermenigvuldigd worden met -1.

O-toets

Om de O-toets te kunnen indrukken moet u eerst de invoer inschakelen via de functie Enable Input en bij het beëindigen van de overlapping weer uitschakelen via Disable Input.

Om de O-toets zowel voor het openen (Play Timeline) als het sluiten (Reverse Timeline) te kunnen gebruiken gebruikt u een Flip Flop.

Timeline

De Timeline wijzigt de waarde van een Float van 0 naar 90 over 2 seconden.

Opmerking

4 Blueprints, hebben we echt 4 Blueprints nodig, zie ik de meer ervaren programmeur al denken?

Wel, nee, dit kan zeker beter, veel beter. Het is zelfs helemaal niet zo moeilijk er één Blueprint van te maken, maar dit is wellicht hoe een beginnende programmeur het zou benaderen en hoe ik het hier dan ook, voorlopig, presenteer.

Zie het als iets dat we nog moeten “polijsten” in de Polishing Pass (als is vooraf plannen natuurlijk veel werk uitgespaard)..

Lichten

Voor de lichten heb ik in alle kamers een Blueprint geplaatst die een Collision Box bevat. Bij het overlappen, en het drukken op de L-toets worden de lichten aan en uit gedaan. Er zijn maximaal 2 lichten per kamer.

Blueprint

Omdat er per kamer maximaal 2 lichten zijn heb ik 2 variabelen van het type SpotLight toegevoegd aan de Blueprint. Deze zijn Instance Editable zodat per kamer de gepaste SpotLights kunnen worden meegegeven.

De code zelf is vrij eenvoudig. Net als bij de deuren moet bij overlappen de invoer worden in- of uitgeschakeld.

Het enige speciale is misschien de controle of er effectief een SpotLight is toegekend (let op, het is mogelijk slechts één SpotLight toe te kennen en dit zowel aan Licht1 als aan Licht2) via de functie IsValid.

Schuiven

Tijdens de Meshing Pass hebben we gezien dat sommige meubilair komt als een Blueprint. Het is dan ook mogelijk de schuiven/deuren/… afzonderlijk te animeren.

Blueprint

Ik heb één voorbeeld uitgewerkt. Merk de verschillende componenten op. Er is ook een TextRender voorzien die zichtbaar wordt wanneer u de Box overlapt.

Leg de beginlocatie van de schuiven vast. Net als bij de deuren en het licht moet bij overlappen de invoer worden in- of uitgeschakeld. Hier wordt extra de TextRender (on)zichtbaar gemaakt.

De code is erg gelijklopend met het roteren van de deur met dit verschil dat we de verplaatsing sturen door een Timeline die een vector teruggeeft en dat de functie SetWorldLocation wordt aangestuurd.

De TimeLine wijzigt een vector enkel over de X-as van 0 naar 30 (een verplaatsing van 30 cm over de X-as) over 2 seconden.


Bestaande Blueprints integreren

Het is zeker niet nodig om het wiel constant zelf uit te vinden.

Zo komt het reeds gebruikte project Realistic Rendering met een Blueprint BP_FlashLight. In het project Content Examples vindt u een Blueprint BP_Spotlight_Follow.

Deze Blueprints kunt u opnemen in uw eigen project zonder aanpassing of eventueel kunt u de code wijzigen zodat ze beter aansluit bij uw noden en wensen. Hoedanook, met of zonder aanpassing, zijn het interessante bronnen om de code te bestuderen.

Geef een reactie

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

  • Abonneer je op deze website d.m.v. e-mail

    Voer je e-mailadres in om je in te schrijven op deze website en e-mailmeldingen te ontvangen van nieuwe berichten.