C++ con Unreal Engine

Warehouse Wreckage

Preparativi

Capitolo verificato con versioni 5.2.1 / 5.0.3
Al primo avvio chiede l'installazione di .NET Framework 3.5
CTRL + SPACE apre il content drawer



Blueprint



Physics Simulation

Le sedie si trovano nella mappa Minimal_Default
Mass



Oggetti
Creare un Cube movable e abilitare la simulazione della fisica. Dargli una massa di 80 kg.

Applicare un impulso
F = m*a
I = m*Δv

Perché i tasti vengano rilevati bisogna prima cliccare sulla finestra di preview.

Classi e istanze
Aggiungo una sfera, che servirà come proiettile.
La converto in una Blueprint Class:


Posso crearne delle istanze trascinandole dal Content Drawer.
Modificando lo Static Mesh Component / Material della classe la modifica viene riportata a tutte le istanze.


Spawning

Rimuoviamo tutti i proiettili tranne uno, che teniamo come riferimento per la posizione.

Per rimuovere un collegamento nel blueprint bisogna premere ALT.

Spawn Actor > in Class seleziono BP_Projectile
Poi Split Struct Pin per espandere la Transform:



Player e vettori
F8 per eiettarsi dal player

Notare il DefaultPawn e la posizione iniziale Player Start

Facciamo partire il proiettile dalla posizione del player:
Dopo averlo allungato ruotiamo il proiettile in base alla rotazione del Pawn:

Moltiplichiamo la direzione in avanti del Player (e del proiettile) per uno scalare e otteniamo il vettore per l'impulso:
Blocco multiply, to integer.

Importare asset

Se cercando di aprire la mappa Showcase si pianta...

Chiudiamo il processo che sta occupando il processore, riapriamo, click col tasto destro sulla mappa, sotto a destra inizia la preparazione degli shaders, a questo punto doppio click sulla mappa e si apre.

Geometry Brushes (BSP)
File > New level > Basic

Eliminiamo il pavimento predefinito.

Piazziamo una Box e chiamiamola Walls
Cambiamo dimensione non da Transform ma da Brush Settings:

Duplichiamo Walls con CTRL + C e CTRL + V: WallsSubtract
Ingrandiamo Walls di 2 metri lungo ogni asse.
Brush Type: Subtractive
Proviamo a entrarci
Salviamo il livello col nome Main

Project Settings > Maps & Modes > Default Maps: settate entrambe a Main

Posizioniamo un rack

Creiamo le finestre con un nuovo brush sottrattivo, alto 400
Lo duplichiamo con ALT.


Le selezioniamo e duplichiamo sull'altra parete.

Materiali e Luci
Copiamo il level Blueprint che avevamo creato, con CTRL+C e CTRL+V (prima di incollare possiamo cancellare i due eventi predefiniti).

Proviamo a tirare i proiettili.

Aggiungiamo un filtro Material al Content Drawer e scegliamo dei materiali per la stanza.


Nella scena sono presenti una SkyLight omnidirezionale e una luce direzionale: proviamo a cambiare la direzione della luce direzionale.

Actor Components
Vogliamo mettere delle mensole (SM_Rack02) sullo scaffale (SM_Rack01).
Rimangono oggetti separati.
Trascino allora le mensole sullo StaticMeshComponent:

 

Collision Meshes
Proviamo a mettere tre Barrel uno sopra l'altro... anche lasciando un po' di spazio tra uno e l'altro si vede come si mettono a ballare, a causa dei collider imprecisi.
Possiamo vedere i collider così:

Facciamo doppio click sul Barrel dal Content Drawer.
Rimuoviamo il collider predefinito:

e ne creiamo uno nuovo:

Adesso sono molto più stabili:

Per convertire un barile in una classe Blueprint:

Da qui possiamo cambiare ad esempio la massa.
Li rimettiamo nella scena creando un muro di barili.
Move to... new folder
per raggrupparli.


Variabili
Vogliamo mettere a disposizione un numero di proiettili finito.
A ogni colpo il numero decresce.

Se non compare il pannello laterale selezionare Window > My Blueprint

Creiamo una nuova variabile:


Assegnamo un valore di default di 20.
Trascinando nel Blueprint la variabile possiamo creare un Getter o un Setter.

Ad ogni impulso diminuiamo il valore delle munizioni di 1:
Il blocco per fare la sottrazione si chiama Subtract

Booleans and branches
Intercettiamo l'evento Space Bar e generiamo il nuovo proiettile solo se la condizione è soddisfatta:


Il blocco per il confronto si chiama Greater

Possiamo usare il false per far scrivere "Munizioni esaurite".


Funzioni
Premendo c si crea un blocco di commento.
Selezionando invece una serie di blocchi e scegliendo Collapse to Function è possibile creare una funzione (ad es. SparaProiettile).

Facendo doppio click la possiamo vedere e modificare.

Per creare una nuova funzione:

Per aggiungere input e output:



Funzioni pure

Non hanno side effects, restituiscono solo un valore.
Nei dettagli della funzione seleziono "Pure".

Funzioni membro

Finora abbiamo ragionato sul Blueprint del livello. Possiamo creare delle funzioni membro dell'oggetto BP_Projectile, richiamate sempre su una particolare istanza.

Apriamo la Blueprint Class dal Content Drawer:

Creiamo una nuova funzione che scrive il nome dell'Actor:

Self

Nella programmazione a oggetti Self è una variabile che fa riferimento all'oggetto stesso, e permette di richiamarne proprietà e metodi (valori e funzioni).
In alcuni linguaggi viene chiamata anche this.

La usiamo allo spawn del proiettile:

Creiamo una funzione membro Launch:

In Main rimane:


Caricare un livello

Quando terminano le munizioni attendiamo 5 secondi e poi riapriamo il livello: