Você pode criar um projeto da Unreal Engine (UE) usando apenas Blueprint ou C++, mas a maioria dos projetos se beneficia do uso de uma combinação das duas linguagens. Então, como decidir qual é a melhor combinação de Blueprint e C++ para um projeto? Este documento oferece orientações para que você possa responder a essa pergunta.
Programação vs. Criação de scripts
Para saber melhor quando usar Blueprint ou C++, você deve primeiro entender a diferença entre programação e criação de scripts.
Programação: instruções que definem sistemas.
Criação de scripts: instruções que definem comportamentos por meio da interface com sistemas existentes.
Por exemplo, você pode usar a programação para definir um sistema de veículo que lida com funcionalidades básicas, como a aceleração e a condução, e usar scripts para definir tipos específicos de veículo, como carros ou barcos.
Nesse contexto, C++ é uma linguagem de programação, e Blueprint é uma linguagem de criação de scripts. No entanto, essa não é uma distinção clara, pois você pode usar C++ para definir comportamentos ou usar Blueprint para definir sistemas. Além disso, há momentos nos projetos em que as diferenças entre programação e criação de scripts ficam indistintas, e a melhor divisão entre as duas depende da situação.
Blueprint funciona como uma linguagem de script, fazendo a interface com a funcionalidade exposta da UE. Da mesma forma, você pode expor sua funcionalidade personalizada a Blueprints. Para obter mais informações, consulte Como combinar Blueprints e C++.
Comparação entre Blueprint e C++
Como cada projeto e cada equipe são diferentes, não há uma "escolha certa" ao decidir usar Blueprint ou C++, mas recomendamos considerar os pontos fortes de cada uma dessas linguagens antes de usá-las.
Pontos fortes de Blueprint
Criação de scripts: o Blueprint pode definir comportamentos com mais facilidade.
Iteração mais rápida: o Blueprints é excelente para prototipagem, pois é mais rápido para criar, modificar, compilar e testar classes de Blueprint.
Acessibilidade mais ampla: a representação do fluxo visual do Blueprint é mais fácil de entender e usar, tornando-a acessível a programadores com orientação visual ou não programadores, como designers e artistas.
Maior capacidade de descoberta: com o Blueprint, é mais fácil encontrar e incluir referências de API e ativos.
Modelo de memória mais seguro: projetamos Blueprints para que tenham um modelo de memória seguro com o objetivo de evitar falhas.
Pontos fortes de C++
Programação: o C++ pode criar novos sistemas com mais facilidade.
Desempenho de tempo de execução mais rápido: o C++ tem um desempenho melhor, mas a importância depende do contexto. Consulte a seção "Preocupações com o desempenho" abaixo para obter informações mais detalhadas.
Acesso mais amplo: o C++ tem acesso às funcionalidades de nível inferior da UE.
Extensibilidade mais ampla: com o C++, você pode criar e interagir com sistemas e bibliotecas externos.
Maior controle: o C++ concede controle de baixo nível sobre sistemas, recursos e algoritmos complexos.
Colaboração mais fácil: o código C++ é armazenado como texto, o que facilita a comparação, a mesclagem e o compartilhamento entre projetos. No entanto, você pode usar a Unreal Diff Tool com Blueprints.
Melhor escalabilidade: arquivos C++ grandes são mais fáceis de modificar do que gráficos Blueprint grandes.
Depuração aprimorada: existem ferramentas de depuração para C++ mais eficientes do que o depurador de Blueprint.
Preocupações com o desempenho
Fundamentalmente, a linguagem C++ é mais eficiente do que Blueprint porque:
O C++ compila em um código de máquina que é executado diretamente na CPU.
Os Blueprints compilam em bytecode, que é executado em uma máquina virtual.
Isso significa que a linguagem Blueprint tem uma sobrecarga adicional de execução de scripts. No entanto, as diferenças de desempenho entre Blueprint e C++ geralmente são insignificantes e dependem do contexto. Os exemplos a seguir são contextos em que você pode esperar o maior impacto:
Infraestrutura básica e de baixo nível.
Loops concisos que usam intensamente recursos de E/S ou de processamento.
Sistemas que processam grandes conjuntos de dados.
Classes dependentes de marcações com muitas instâncias.
Situações que se beneficiam de multithreading, pois o Blueprint não oferece suporte a esse recurso.
Para melhorar o desempenho, use temporizadores ou delegados para programar o trabalho em Blueprints em vez de usar tiques.
Se você usar Blueprint e tiver problemas de desempenho, crie um perfil do seu projeto com o Unreal Insights e otimize os gargalos mais significativos antes de considerar a conversão de Blueprint em C++.
Como combinar Blueprint e C++
A melhor abordagem para combinar Blueprint e C++ é usar C++ como base e criar classes de Blueprint de forma complementar. Na prática, isso significa expor o código C++ para que possa ser usado a partir de Blueprints.
Você pode expor o código C++ a Blueprint com os seguintes métodos:
Crie uma classe de Blueprint que estenda uma classe C++ e use Especificadores de metadados, como
UPROPERTY(BlueprintReadWrite)ouUFUNCTION(BlueprintCallable), para expor elementos específicos.Crie uma classe C++ que estenda
UBlueprintFunctionLibrarypara expor as funções estáticas da classe.
Em alguns casos menos comuns, talvez seja melhor expor Blueprint a C++, o que pode ser feito com os seguintes métodos:
Use o especificador
UFUNCTION(BlueprintImplementableEvent)para definir uma função virtual pura que deve ser implementada em Blueprint.Use o especificador
UFUNCTION(BlueprintNativeEvent)para definir uma função virtual que pode ser substituída opcionalmente em Blueprint.Ao criar uma interface de usuário, você pode acessar um UserWidget criado no Blueprint usando
UPROPERTY(meta=(BindWidget)).
Para obter mais informações sobre esses métodos, consulte as páginas a seguir:
C++ e Blueprint: um exemplo detalhado sobre a criação de uma classe C++ extensível por Blueprint.
Como expor C++ a Blueprints: dicas e truques para escrever uma API compatível com Blueprints.
Como expor elementos de jogabilidade a Blueprints: um guia técnico para programadores de jogabilidade sobre a exposição de elementos de jogabilidade a Blueprints.
Biblioteca de funções de Blueprint: aprenda a usar
UBlueprintFunctionLibrary.Jogo de amostra Lyra: saiba mais sobre o projeto Lyra, que tem exemplos de cada um dos métodos discutidos acima.
Como converter Blueprints em C++
Se quiser converter seu Blueprint em C++, você pode começar usando a Visualização de Cabeçalho do Blueprint para gerar um arquivo de cabeçalho C++ para uma classe ou struct do Blueprint. O arquivo .h gerado contém todas as declarações de variáveis e funções do seu Blueprint, mas você deve converter manualmente a implementação da sua função no arquivo .cpp correspondente.
Depois de converter Blueprint em C++, talvez seja necessário atualizar as referências para usar a nova classe C++. Se isso resultar em muitas atualizações necessárias, considere usar Redirecionamentos Principais para remapear essas referências automaticamente.