È possibile creare un progetto Unreal Engine (UE) utilizzando solo Blueprint o C++, ma la maggior parte dei progetti trae vantaggio dall'utilizzo di una combinazione dei due. Quindi, come si fa a decidere il miglior mix di Blueprint e C++ per il proprio progetto? Questo documento fornisce indicazioni su come rispondere a questa domanda.
Programmazione e Scripting
Per sapere al meglio quando utilizzare Blueprint o C++, è necessario innanzitutto comprendere la differenza tra programmazione e scripting.
Programmazione: istruzioni che definiscono i sistemi.
Scripting: istruzioni che definiscono i comportamenti interfacciandosi con i sistemi esistenti.
Ad esempio, è possibile utilizzare la programmazione per definire un sistema del veicolo che gestisce le funzionalità di base, ad esempio l'accelerazione e lo sterzo, e utilizzare lo scripting per definire tipi di veicoli specifici, ad esempio automobili o barche.
In questo contesto, C++ è un linguaggio di programmazione e Blueprint è un linguaggio di scripting. Tuttavia, non si tratta di una distinzione chiara, in quanto è possibile utilizzare C++ per definire i comportamenti o utilizzare Blueprint per definire i sistemi. Inoltre, ci sono momenti nei progetti in cui i confini tra programmazione e scripting sono sfumati e la migliore suddivisione tra i due dipende dallo scenario.
Blueprint funziona come linguaggio di scripting interfacciandosi con le funzionalità UE esposte. Allo stesso modo, è possibile esporre la funzionalità personalizzata a Blueprint. Per ulteriori informazioni, vedi Combinazione di Blueprint e C++.
Confronto tra Blueprint e C++
Poiché ogni progetto e team è unico, non esiste una "scelta giusta" quando si decide di utilizzare Blueprint o C++, ma consigliamo di considerare i loro punti di forza prima di utilizzarli.
Punti di forza di Blueprint
Scripting: Blueprint può definire più facilmente i comportamenti.
Iterazione più veloce: Blueprint è eccellente per la prototipazione in quanto è più veloce creare, modificare, compilare e testare le classi Blueprint.
Accessibilità più ampia: la rappresentazione del flusso visivo di Blueprint è più facile da comprendere e da utilizzare, il che la rende accessibile a programmatori o non programmatori orientati all'aspetto visivo come progettisti e artisti.
Maggiore rilevabilità: con Blueprint è più facile trovare e includere riferimenti ad API e asset.
Modello di memoria più sicuro: abbiamo progettato le Blueprint per avere un modello di memoria sicuro ed evitare arresti anomali.
Punti di forza di C++
Programmazione: C++ può compilare più facilmente nuovi sistemi.
Prestazioni di runtime più veloci: C++ è più performante, ma la rilevanza dipende dal contesto. Per informazioni più dettagliate, vedere la sezione Problemi di prestazioni di seguito.
Accesso più ampio: C++ ha accesso a una funzionalità UE di livello inferiore.
Estensibilità più ampia: con C++, puoi creare e interfacciarti con sistemi e librerie esterne.
Maggiore controllo: C++ garantisce un controllo di basso livello su sistemi, risorse e algoritmi complessi.
Collaborazione più fluida: C++ viene memorizzato come testo, semplificando la differenziazione, l'unione e la condivisione tra i progetti. Tuttavia, puoi utilizzare lo Strumento di differenziazione di Unreal con le Blueprint.
Migliore scalabilità: i file C++ di grandi dimensioni sono più facili da modificare rispetto ai grafici Blueprint di grandi dimensioni.
Debug migliore: Esistono strumenti di debug più potenti per C++ rispetto a Debugger Blueprint.
Problemi di prestazioni
Fondamentalmente, C++ è più performante di Blueprint perché:
C++ si compila in codice macchina che viene eseguito direttamente sulla CPU.
Le Blueprint si compilano in codice byte che viene eseguito su una macchina virtuale.
Ciò significa che Blueprint ha un sovraccarico aggiuntivo per l'esecuzione degli script. Tuttavia, le differenze di prestazioni tra Blueprint e C++ sono in genere insignificanti e dipendono dal contesto. Gli esempi seguenti sono i contesti in cui è possibile prevedere l'impatto maggiore:
Infrastruttura centrale di basso livello.
Cicli stretti che utilizzano pesantemente le risorse di I/O o di elaborazione.
Sistemi che elaborano grandi set di dati.
Classi dipendenti dai tick con molte istanze.
Scenari che traggono vantaggio dal multithreading, in quanto Blueprint non lo supporta.
Per migliorare le prestazioni, utilizzare timer o delegati per pianificare il lavoro in Blueprint anziché utilizzare tick.
Se utilizzi Blueprint e riscontri problemi di prestazioni, profila il progetto con
Unione di Blueprint e C++
L'approccio migliore per combinare Blueprint e C++ consiste nell'utilizzare C++ come base e creare classi Blueprint su di esso. In pratica, ciò significa esporre il proprio C++ in modo che sia utilizzabile da Blueprint.
È possibile esporre C++ a Blueprint con i seguenti metodi:
Creare una classe Blueprint che estenda una classe C++ e utilizzi Specificatori di metadati, come
UPROPERTY(BlueprintReadWrite)oUFUNCTION(BlueprintCallable), per esporre elementi specifici.Crea una classe C++ che estenda UBlueprintFunctionLibrary per esporre le funzioni statiche della classe.
In alcuni casi meno comuni, è possibile esporre Blueprint a C++, operazione che è possibile eseguire con i metodi seguenti:
Utilizza lo specificatore
UFUNCTION(BlueprintImplementableEvent)per definire una funzione virtuale pura che è necessario implementare in Blueprint.Utilizza lo specificatore
UFUNCTION(BlueprintNativeEvent)per definire una funzione virtuale di cui puoi eventualmente eseguire l'override in Blueprint.Quando crei un'interfaccia utente, puoi accedere a un UserWidget creato in Blueprint utilizzando
UPROPERTY(meta=(BindWidget)).
Per ulteriori informazioni su questi metodi, vedere le pagine seguenti:
C++ e Blueprint: esempio dettagliato della creazione di una classe C++ estendibile Blueprint.
Esposizione di C++ alle Blueprint: suggerimenti e trucchi per la scrittura di API compatibili con Blueprint.
Esposizione degli elementi gameplay alle Blueprint: guida tecnica per programmatori di gameplay sull'esposizione di elementi di gameplay alle Blueprint.
Libreria delle funzioni Blueprint: impara a utilizzare
UBlueprintFunctionLibrary.Gioco campione Lyra: scopri il progetto Lyra, che contiene esempi di ciascuno dei metodi discussi sopra.
Conversione di Blueprint in C++
Se desideri convertire la tua Blueprint in C++, puoi iniziare utilizzando Visualizzazione intestazione Blueprint per generare un file di intestazione C++ per una classe o una struttura Blueprint. Il file .h generato contiene tutte le dichiarazioni di variabili e funzioni dalla Blueprint, ma è necessario convertire manualmente l'implementazione della funzione nel file .cpp corrispondente .
Dopo aver convertito un Blueprint in C++, potrebbe essere necessario aggiornare i riferimenti per utilizzare la nuova classe C++. Se ciò comporta la necessità di molti aggiornamenti, prendi in considerazione l'utilizzo di Reindirizzamenti del core per rimappare automaticamente tali riferimenti.