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 e 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.
- Script: 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 Blueprint 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: Blueprint pode definir comportamentos com mais facilidade.
- Iteração mais rápida: Blueprint é excelente para a criação de protótipos, pois é mais rápido criar, modificar, compilar e testar classes de Blueprint.
- Acessibilidade mais ampla: a representação do fluxo visual de 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 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: C++ pode criar novos sistemas com mais facilidade.
- Desempenho mais rápido no tempo de execução: C++ é mais eficiente, mas a importância disso depende do contexto. Consulte a seção "Preocupações com o desempenho" abaixo para obter informações mais detalhadas.
- Acesso mais amplo: C++ tem acesso às funcionalidades de nível inferior da UE.
- Extensibilidade mais ampla: com C++, você pode criar e interagir com sistemas e bibliotecas externos.
- Maior controle: 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.
- Melhor depuração: há ferramentas de depuração mais avançadas para C++ do que o Blueprint Debugger.
Preocupações com o desempenho
Fundamentalmente, a linguagem C++ é mais eficiente do que Blueprint porque:
- C++ compila em um código de máquina que é executado diretamente na CPU.
- 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 tiques com muitas instâncias.
- Situações que se beneficiam de multithreading, pois a linguagem Blueprint é compatível com essa funcionalidade.
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 você deve implementar em Blueprint. - Use o especificador
UFUNCTION(BlueprintNativeEvent)para definir uma função virtual que pode ser substituída opcionalmente em Blueprint. - Quando estiver criando uma interface de usuário, você poderá acessar um UserWidget criado em Blueprint usando
UPROPERTY(meta=(BindWidget)).
Para obter mais informações sobre esses métodos, consulte as páginas a seguir:
- C++ and Blueprints (C++ e Blueprints): um exemplo detalhado sobre a criação de uma classe C++ extensível por Blueprint.
- Exposing C++ to Blueprints (Como expor C++ a Blueprints): dicas e truques para criar uma API compatível com Blueprint.
- Exposing Gameplay Elements to 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.
- Blueprint Function Library (Biblioteca de funções de Blueprint): saiba como usar
UBlueprintFunctionLibrary. - Lyra Sample Game (Exemplo de jogo: Lyra: saiba mais sobre o projeto Lyra, que tem exemplos de cada um dos métodos discutidos acima.
Como converter Blueprint em C++
Se quiser converter Blueprint em C++, você poderá começar usando a Visualização de cabeçalho de Blueprint para gerar um arquivo de cabeçalho C++ para uma classe ou uma estrutura de Blueprint. O arquivo .h gerado contém todas as declarações de variáveis e funções de Blueprint, mas você deve converter manualmente a implementação da 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 Core Redirects para remapear essas referências automaticamente.