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. Scripts
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.
Scriptage : 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 la page Combiner des blueprints et du 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. Cependant, vous pouvez utiliser l'outil de comparaison de l'Unreal Engine avec des 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.
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 performances, 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 comme
UPROPERTY(BlueprintReadWrite)ouUFUNCTION(BlueprintCallable), pour exposer des éléments spécifiques.Créer une classe C++ qui étend la fonction
UBlueprintFunctionLibrarypour 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 Blueprints.Lorsque vous créez une interface utilisateur, vous pouvez accéder à un widget utilisateur créé dans Blueprint en utilisant
UPROPERTY(meta=(BindWidget)).
Pour plus d'informations sur ces méthodes, voir les pages suivantes :
C++ et Blueprint : un exemple détaillé sur la création d'une classe C++ extensible par Blueprint.
Exposer le C++ aux Blueprints : quelques conseils et astuces pour bien écrire une API adaptée aux blueprints.
Exposer des éléments de jouabilité en blueprints : un guide technique destiné aux programmeurs de jouabilité pour l'exposition des éléments de jouabilité en blueprints.
Bibliothèque de fonctions de blueprint : apprendre à utiliser la bibliothèque
UBlueprintFunctionLibrary.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 voulez convertir votre blueprint en C++, vous pouvez commencer par utiliser la vue d'en-tête de Blueprint afin de générer un fichier d'en-tête C++ pour une classe de blueprint ou une structure. 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 d'origine.
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 mises à jour nécessaires, envisagez d'utiliser des redirections principales pour remapper ces recommandations automatiquement.