Il est tout à fait possible de créer un projet Unreal Engine (UE) qui n'utilise que Blueprint ou le C++, mais la plupart des projets gagnent à employer les deux langages en tandem. Alors, comment choisir le meilleur mélange de Blueprint et de C++ pour votre projet ? Ce document fournit des conseils sur la manière de répondre à cette question.
Programmation vs scriptage
Pour savoir quand utiliser Blueprint ou C++, vous devez d'abord comprendre la différence entre la programmation et le scriptage.
- Programmation : Instructions qui définissent les systèmes.
- Script : Instructions qui définissent des comportements en s'interfaçant avec les systèmes existants.
Par exemple, vous pouvez utiliser la programmation pour définir un système de véhicule qui gère les fonctionnalités de base, telles que l'accélération et la direction, et utiliser des scripts pour définir des types de véhicules spécifiques, tels que des voitures ou des bateaux.
Dans ce contexte, le C++ est un langage de programmation et Blueprint est un langage de scriptage. Cependant, la distinction n'est pas si claire, car vous pouvez utiliser le C++ pour définir des comportements ou utiliser Blueprint pour définir des systèmes. En outre, dans certains projets, la frontière entre la programmation et la création de scripts est floue, et la meilleure répartition entre les deux dépend du scénario.
Blueprint fonctionne comme un langage de scriptage en s'interfaçant avec les fonctionnalités exposées de l'UE. De même, vous pouvez exposer votre fonctionnalité personnalisée aux blueprints. Pour plus d'informations, consultez Coder dans l'UE : blueprint vs C++.
Comparer Blueprint et C++
Chaque projet et chaque équipe étant uniques, il n'y a pas de "bon choix" lorsqu'il s'agit de décider d'utiliser Blueprint ou C++, mais nous vous recommandons de tenir compte de leurs points forts avant de les utiliser.
Points forts de Blueprint
- Scriptage : Blueprint peut définir des comportements plus facilement.
- Itération plus rapide : Blueprint est excellent pour le prototypage, car créer, modifier, compiler et tester des classes de blueprint est plus rapide.
- Meilleure accessibilité : La représentation visuelle des flux de Blueprint est plus facile à comprendre et à utiliser, ce qui rend Blueprint accessible aux programmeurs orientés vers le visuel ou aux non-programmeurs tels que les concepteurs et les graphistes.
- Plus grande facilité de découverte : Avec Blueprint, il est plus facile de trouver et d'inclure des références aux API et aux ressources.
- Modèle de mémoire plus sûr : Nous avons conçu les blueprints pour qu'ils disposent d'un modèle de mémoire sûr afin d'éviter les plantages.
Points forts de C++
- Programmation : La création de nouveaux systèmes est plus facile avec le C++.
- Performances d'exécution plus rapides : le C++ est plus performant, mais son importance dépend du contexte. Pour plus d'informations, consultez la section Problèmes de performance ci-dessous.
- Accès plus large : le C++ a accès aux fonctionnalités de niveau inférieur de l'UE.
- Plus grande extensibilité : Avec C++, vous pouvez créer et interfacer avec des systèmes et des bibliothèques externes.
- Meilleur contrôle : C++ permet d'exercer un contrôle de bas niveau sur des systèmes, des ressources et des algorithmes complexes.
- Collaboration plus harmonieuse : le code C++ est stocké sous forme de texte, ce qui facilite la diff., la fusion et le partage entre les projets. Toutefois, vous pouvez utiliser l'Unreal Diff Tool (outil Diff de l'Unreal Engine) avec les blueprints.
- Meilleure évolutivité : Les grands fichiers en C++ sont plus faciles à modifier que les grands graphiques Blueprint.
- Meilleur débogage : Il existe des outils de débogage plus puissants pour C++ que le Blueprint Debugger (débogueur de Blueprint).
Problèmes de performance
Fondamentalement, le C++ est plus performant que Blueprint pour les raisons suivantes :
- le C++ compile en code machine qui s'exécute directement sur le CPU.
- Blueprint compile en bytecode qui s'exécute sur une machine virtuelle.
Cela signifie que Blueprint a davantage de surcoût pour l'exécution des scripts. Cependant, les différences de performances entre Blueprint et C++ sont généralement insignifiantes et dépendent du contexte. Les exemples suivants sont des contextes dans lesquels l'impact sera certainement le plus important :
- Noyau, infrastructure de bas-niveau.
- Boucles serrées qui utilisent fortement des E/S ou pour traiter des ressources.
- Systèmes qui traitent de grands ensembles de données.
- Classes dépendantes d'un tick avec de nombreuses instances.
- Scénarios qui bénéficient du multithreading, car Blueprint ne le prend pas en charge.
Pour améliorer les performances, utilisez des minuteries ou des délégués pour planifier le travail dans les blueprints au lieu d'utiliser le tick.
Si vous utilisez Blueprint et que vous rencontrez des problèmes de performance, profilez votre projet avec Unreal Insights et optimisez les ralentissements les plus importants avant d'envisager de convertir votre Blueprint en C++.
Combiner Blueprint et C++
La meilleure approche pour combiner Blueprint et C++ est d'utiliser le C++ comme base et de créer des classes de blueprint par-dessus. En pratique, cela signifie exposer votre C++ pour qu'il soit utilisable depuis les blueprints.
Vous pouvez exposer le C++ à Blueprint avec les méthodes suivantes :
- Créer une classe de blueprint qui prolonge une classe C++ et utiliser des Metadata Specifiers (spécificateurs de métadonnées), comme
UPROPERTY(BlueprintReadWrite)
ouUFUNCTION(BlueprintCallable)
, pour exposer des éléments spécifiques. - Créer une classe C++ qui prolonge
UBlueprintFunctionLibrary
, pour exposer les fonctions statiques de la classe.
Dans certains cas moins courants, vous pouvez vouloir exposer vos blueprints au C++, comme le permettent les méthodes suivantes :
- Utiliser le spécificateur
UFUNCTION(BlueprintImplementableEvent)
pour définir une fonction virtuelle pure que vous devez implémenter dans Blueprint. - Utiliser le spécificateur
UFUNCTION(BlueprintNativeEvent)
pour définir une fonction virtuelle que vous pouvez éventuellement remplacer dans Blueprint. - Lors de la création d'une interface utilisateur, vous pouvez accéder à un UserWidget créé dans le Blueprint à l'aide d'
UPROPERTY(meta=(BindWidget))
.
Pour plus d'informations sur ces méthodes, voir les pages suivantes :
- C++ and Blueprints (C++ et blueprints) : Un exemple détaillé sur la création d'une classe C++ extensible par blueprint.
- Exposing C++ to Blueprints (Exposer C++ aux blueprints) : Conseils et astuces sur l'écriture d'une API adaptée aux blueprints.
- Exposing Gameplay Elements to Blueprints (Exposer les éléments de Gameplay aux blueprints) : Un guide technique pour les programmeurs de gameplay sur l'exposition des éléments de gameplay aux blueprints.
- Blueprint Function Libraries (Bibliothèque de fonctions Blueprint) : Apprendre à utiliser
UBlueprintFunctionLibrary
. - Lyra Sample Game (Exemple de jeu Lyra) : Découvrez le projet Lyra, qui présente des exemples de chacune des méthodes décrites ci-dessus.
Convertir Blueprint en C++
Si vous souhaitez convertir votre Blueprint en C++, vous pouvez commencer par utiliser Blueprint Header View (Vue d'en-tête Blueprint) pour générer un fichier d'en-tête C++ pour une classe ou une structure de blueprint. Le fichier .h
généré contient toutes les déclarations de variables et de fonctions de votre blueprint, mais vous devez convertir manuellement l'implémentation de vos fonctions dans le fichier .cpp
correspondant.
Après avoir converti un blueprint en C++, il se peut que vous deviez mettre à jour les références pour utiliser la nouvelle classe C++. Si cela entraîne de nombreuses modifications, envisagez d'utiliser les Core Redirects (redirections principales) pour remapper ces références automatiquement.