Projekt Unreal Engine (UE) można utworzyć przy użyciu tylko Blueprintu lub C++, ale większość projektów zyskuje na połączeniu obu rozwiązań. Jak zatem wybrać najlepsze połączenie Blueprintu i C++ dla swojego projektu? Niniejszy dokument zawiera wskazówki, które pomogą odpowiedzieć na to pytanie.
Programowanie i Skryptowanie
Aby wiedzieć, kiedy najlepiej używać Blueprintu lub C++, trzeba najpierw zrozumieć różnicę między programowaniem a skryptowaniem.
Programowanie: Instrukcje, które określają systemy.
Skryptowanie: Instrukcje, które definiują zachowania poprzez połączenie z istniejącymi systemami.
Na przykład można użyć programowania do zdefiniowania systemu pojazdu, który obsługuje podstawowe funkcje, takie jak przyspieszenie i sterowanie, a także użyć skryptów do zdefiniowania określonych typów pojazdów, takich jak samochody lub łodzie.
W tym kontekście C++ jest językiem programowania, a Blueprint jest językiem skryptowym. Nie jest to jednak wyraźne rozróżnienie, ponieważ można używać C++ do definiowania zachowań lub Blueprintu do definiowania systemów. Ponadto w projektach zdarzają się sytuacje, w których granice między programowaniem a skryptowaniem zacierają się, a optymalny podział między nimi zależy od scenariusza.
Blueprint działa jako język skryptowy, łącząc się z dostępnymi funkcjami UE. W podobny sposób można udostępnić swoją niestandardową funkcjonalność Blueprintom. Więcej informacji można znaleźć tutaj: Combining Blueprints and C++ (Łączenie Blueprintów i C++).
Porównanie Blueprintu i C++
Każdy projekt i zespół jest wyjątkowy, dlatego nie ma „właściwego wyboru” przy podejmowaniu decyzji o użyciu Blueprintu lub C++, ale zalecamy rozważenie ich mocnych stron przed ich użyciem.
Mocne strony Blueprintu
Skryptowanie: Blueprint może łatwiej definiować zachowania.
Szybsza iteracja: Blueprint jest doskonały do prototypowania, ponieważ tworzenie, modyfikowanie, kompilowanie i testowanie klas Blueprintu jest szybsze.
Większa dostępność: Wizualna reprezentacja przepływu Blueprintu jest łatwiejsza do zrozumienia i użycia, dzięki czemu Blueprint jest przyjazny dla programistów nastawionych na wizualizacje oraz dla nie-programistów, takich jak projektanci i artyści.
Większa wykrywalność: Blueprint ułatwia znajdowanie i dołączanie odwołań do API i zasobów.
Bezpieczniejszy model pamięci: Zaprojektowaliśmy Blueprint z bezpiecznym modelem pamięci, aby uniknąć awarii.
Mocne strony C++
Programowanie: C++ może łatwiej tworzyć nowe systemy.
Szybsza wydajność w czasie wykonywania: C++ jest bardziej wydajny, ale to zależy od kontekstu. Więcej szczegółowych informacji można znaleźć w sekcji Problemy z wydajnością poniżej.
Większy dostęp: C++ ma dostęp do funkcji UE niższego poziomu.
Większa możliwości rozbudowy: Dzięki C++ można tworzyć i łączyć się z zewnętrznymi systemami i bibliotekami.
Większa kontrola: C++ zapewnia kontrolę o niskim poziomie nad systemami, zasobami i złożonymi algorytmami.
Łatwiejsza współpraca: C++ jest przechowywany jako tekst, co ułatwia porównywanie, scalanie i udostępnianie między projektami. Jednakże, z Blueprintem można użyć narzędzia Unreal Diff.
Lepsza skalowalność: Duże pliki C++ są łatwiejsze do modyfikacji niż duże grafy Blueprintu.
Lepsze debugowanie: Istnieją potężniejsze narzędzia do debugowania dla C++ niż debugger Blueprintu.
Problemy w wydajnością
Zasadniczo C++ jest bardziej wydajny niż Blueprint, ponieważ:
C++ kompiluje się do kodu maszynowego, który jest wykonywany bezpośrednio na CPU.
Blueprint kompiluje się do kodu bajtowego, który jest wykonywany na maszynie wirtualnej.
Oznacza to, że Blueprint ma dodatkowy koszt wykonania skryptu. Jednak różnice w wydajności Blueprintu i C++ są zazwyczaj nieznaczne i zależą od kontekstu. Poniższe przykłady to konteksty, w których można oczekiwać największego wpływu na wydajność:
Główna infrastruktura niskiego poziomu.
Ciasne pętle, które intensywnie wykorzystują zasoby wejścia/wyjścia lub przetwarzania.
Systemy przetwarzające duże zbiory danych.
Klasy zależne od tyknięć z wieloma instancjami.
Scenariusze, które korzystają z wielowątkowości, ponieważ Blueprint jej nie obsługuje.
W celu poprawienia wydajności należy użyć liczników czasu lub delegatów, aby zaplanować pracę wewnątrz Blueprintów zamiast używać tyknięć.
Jeśli użytkownik używa Blueprintu i ma problemy z wydajnością, może sprofilować swój projekt za pomocą Unreal Insights i zoptymalizować najważniejsze wąskie gardła przed rozważeniem konwersji Blueprintu na C++.
Łączenie Blueprintu i C++
Najlepszym podejściem do połączenia Blueprintu i C++ jest użycie C++ jako fundamentu i zbudowanie na nim klas Blueprintów. W praktyce oznacza to udostępnienie kodu C++ do użytku przez Blueprinty.
Kod C++ można uwidocznić za pomocą następujących metod:
Utworzenie klasy Blueprintu, która rozszerza klasę C++ i używa specyfikatorów metadanych, takich jak
UPROPERTY(BlueprintReadWrite)lubUFUNCTION(BlueprintCallable), aby uwidocznić określone elementy.Utworzenie klasy C++ rozszerzającej
UBlueprintFunctionLibraryw celu uwidocznienia funkcji statycznych klasy.
W niektórych mniej powszechnych przypadkach użytkownik może chcieć uwidocznić Blueprint w C++, co może zrobić za pomocą następujących metod:
Użycie specyfikatora
UFUNCTION(BlueprintImplementableEvent)do zdefiniowania czysto wirtualnej funkcji, którą należy zaimplementować w Blueprincie.Użycie specyfikatora
UFUNCTION(BlueprintNativeEvent)do zdefiniowania wirtualnej funkcji, którą można opcjonalnie nadpisać w Blueprincie.Podczas tworzenia interfejsu użytkownika można uzyskać dostęp do UserWidget utworzonego w Blueprincie za pomocą
UPROPERTY(meta=(BindWidget)).
Więcej informacji na temat tych metod można znaleźć na poniższych stronach:
C++ i Blueprint: Szczegółowy przykład tworzenia rozszerzalnej klasy Blueprintu w języku C++.
Uwidacznianie C++ w Blueprintach: Wskazówki i porady dotyczące pisania interfejsu API przyjaznego dla Blueprintu.
Uwidacznianie elementów rozgrywki w Blueprintach: Poradnik techniczny dla programistów rozgrywki dotyczący uwidaczniania elementów rozgrywki w Blueprintach.
Biblioteka funkcji Blueprintu: Dowiedz się, jak korzystać z
UBlueprintFunctionLibrary.Przykładowa rozgrywka w Lyra: Użytkownik może zapoznać się z projektem Lyra, który zawiera przykłady każdej z omówionych powyżej metod.
Konwersja Blueprintu do C++
Jeśli użytkownik chce przekonwertować Blueprint na C++, można zacząć od użycia widoku nagłówka Blueprintu, aby wygenerować plik nagłówkowy C++ dla klasy lub struktury Blueprintu. Wygenerowany plik .h zawiera wszystkie deklaracje zmiennych i funkcji z Blueprintu, ale należy ręcznie przekonwertować implementację funkcji do odpowiedniego pliku .fbx
Po przekonwertowaniu Blueprintu na kod C++ może być konieczne zaktualizowanie odwołań, aby użyć nowej klasy C++. Jeśli spowoduje to wiele wymaganych aktualizacji, należy rozważyć użycie przekierowań głównych do automatycznego ponownego mapowania tych odwołań.