Esta página inclui informações para ajudar desenvolvedores experientes do Unreal Engine a começar com o Roblox: orientação básica, uma comparação conceitual e as principais diferenças entre as duas plataformas.
Ficando Orientado
O Outliner da Unreal e o Explorador da Roblox Studio são as janelas primárias para organizar elementos em espaços 3D. Ambos exibem uma hierarquia de objetos e pastas. No entanto, o Outliner tem uma estrutura mais plana e menos definida e mostra apenas Actors. A janela do Explorador tem uma estrutura profunda e estrita e exibe todos os objetos como parte da hierarquia, até mesmo objetos que seriam considerados componentes na Unreal.
O Roblox Studio Asset Manager e Toolbox se sobrepõem ao Unreal Content Browser. O Gerenciador de Ativos permite que você gerencie todos os ativos dentro de sua experiência, enquanto a Caixa de Ferramentas permite que você acesse qualquer ativo que tenha publicado. A Caixa de Ferramentas também permite que você pesquise na Loja do Criador por ativos do Roblox ou da comunidade. A Loja do Criador é semelhante ao Mercado do Unreal Engine, mas você pode acessá-la diretamente da interface de usuário do Studio.
Diferenças Filosóficas
Roblox é um "motor de simulação" ao invés de um motor de jogo tradicional. Unreal Actors e Roblox Parts ambos servem como blocos de construção fundamentais, mas na prática, os dois são bem diferentes:
- Representação : Actors no Unreal são conceitos de nível mais alto para qualquer objeto em um nível, enquanto Parts no Roblox são projetados para representar objetos físicos como blocos de madeira e esferas de plástico.
- Física : Para realizar simulações de física no Unreal, você ativa a física dentro de certos componentes (como o StaticMeshComponent ) ou adicionando componentes a Actors , como restrições de física. No Roblox, a física é construída no digitarde dados Parts; o motor lida com as interações automaticamente.
Você pode ver a diferença imediatamente se você criar um Actor e um Part . O Actor tem pouco mais que uma localização, rotação e dimensionar/escalonar. O Part tem as mesmas informações, além de um material e cor, valores para refletância e transparência, massa e forma, e muito mais. Os dois só começam a compartilhar propriedades semelhantes quando você compara um StaticMeshActor em Unreal (por exemplo, um cubo) a um MeshPart em Roblox.
Outra comparação útil é a Unreal Actor para o Roblox Model . Modelos atuam como um recipiente para uma coleção de partes interconectadas da mesma maneira que Actors em Unreal são recipientes para componentes. Você especifica uma das partes do modelo como sua parte primária para definir o ponto de pivô. Modelos também possuem scripts, animações, efeitos de som, prompts, restrições, emissores de partículas e muito mais.
Por exemplo, um Unreal Actor pode ter um NiagraComponent que usa vários emissores para alcançar o efeito visual desejado, uma malha para a forma, uma restrição física para adicionar elasticidade e um script para a interatividade do jogador. No Outliner, você vê um único Actor chamado SpringyFireball .
Em Roblox, um modelo comparável SpringyFireball na janela do Explorador pode parecer algo assim:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
A filosofia de física por padrão do Roblox se estende ao processo de construção de modelos 3D. No Roblox, soldar várias peças juntas em um conjunto é uma excelente maneira de construir as coisas rapidamente, porque o Roblox trata as peças soldadas como um único corpo rígido. Essa abordagem não é prática no Unreal.
Em vez de usar unidades métricas padrão para comprimento e massa, o Roblox usa unidades nocionais chamadas studs e Roblox Mass Units (RMUs). Para conversões métricas aproximadas e recomendações de uso, consulte Unidades .
A localização importa
As experiências do Roblox são multijogador por padrão, então o Roblox Studio inclui muitos locais de armazenamento diferentes com comportamentos específicos. Por exemplo, um script pode ser rodado quando você o coloca em ReplicatedStorage , mas não quando você o coloca em StarterPlayerScripts . Para mais informações, consulte Client-Server Runtime e Object Organization .
Localização | Descrição :--- | :--- Workspace | Representa o mundo do jogo e contém todas as partes, modelos e outros objetos do jogo. Você pode colocar scripts no Workspace, mas apenas scripts de servidor e scripts de módulo são rodados quando relacionados a ele. Essa localização funciona bem para scripts que controlem o comportamento de objetos, pois podem ser anexados diretamente ao Objeto. ReplicatedStorage | Contém objetos que são replicados ao cliente e ao servidor, incluindo scripts. Essa localização é ideal para scripts que compartilham dados ou funcionalidade entre os dois, como configurações de jogo, dados do jogador e eventos. ServerScriptService | Contém scripts de servidor, incluindo scripts de módulo. Essa localização é ideal para scripts que precisam acessar funcionalidades do lado do servidor ou objetos, como lógica de jogos, armazenamento de dados e comportamentos de IA. ServerStorage | Contém objetos e configurações do lado do servidor. Essa localização é ideal para objetos grandes que não precisam ser replicados
Programação
As experiências do Roblox suportam três tipos diferentes de scripts Luau:
Scripts de cliente
Esses scripts são rodados no cliente e o servidor não tem visibilidade de seu comportamento. Por razões herdadas, esses scripts podem assumir a forma de LocalScripts ou Scripts com um valor de RunContext de Client. Os scripts de cliente normalmente vivem em ReplicatedStorage , StarterPlayerScripts ou StarterCharacterScripts .
Scripts do Servidor
Esses scripts são rodados no servidor, e o cliente não tem visibilidade de seu comportamento. Os scripts do servidor têm um RunContext valor de Server e normalmente vivem em ServerScriptService , o conteúdo do qual não é replicado para o cliente do jogo.
Scripts do módulo
Esses scripts são peças de código reutilizáveis que retornam exatamente um valor, normalmente uma função ou tabela (ou uma tabela de funções). Em vez de duplicar código em scripts de cliente e servidor, use scripts de módulo para compartilhar código e dados entre os dois. Os scripts de módulo geralmente vivem em ReplicatedStorage , mas podem viver em outro lugar se você quiser compartilhar código entre scripts no mesmo lado do limite cliente-servidor.
Unreal não tem o conceito de diferentes tipos de scripts. Se você optar por fazer um jogo multiplayer, você escreve código adicional para sincronizar o estado do jogo entre o servidor e os clientes.
Em Unreal, grande parte da funcionalidade do motor está disponível estendendo classes embutidas como UObject , ACharacters , ULevel , e UWorld em C++ ou Blueprint. Unreal suporta eventos personalizados, mas muitas classes incluem eventos que o motor invoca automaticamente como parte do ciclo de vida natural do nível.
Em comparação com o sistema de "ticking" Unreal, os scripts do Roblox são muito mais orientados a eventos. Você acessa a funcionalidade do motor semelhante assinando serviços e ouvindo atualizações.
C++ e Luau
Para scripting, Unreal usa C++. Roblox usa Luau, uma linguagem de programação derivada de Lua 5.1.
Em comparação com Luau, C++ tem uma vantagem de desempenho geral, que pode ou não ser relevante para os tipos de experiências que você deseja compilação / versão / build. Luau é digitado gradualmente e tem uma sintaxe menos verbosa. Em projetos maiores, no entanto, a digitação gradual pode introduzir categorias de bugs que linguagens fortemente digitadas como C++ evitam, então considere habilitar a verificação de tipo estrita em scripts do Roblox.
O Unreal também inclui um sistema de script visual chamado Blueprints. O Roblox tem plugins de terceiros que oferecem funcionalidade semelhante, mas sem sistema interno comparável.
Amostra de Código Luau
O seguinte exemplo de código Luau demonstra como, depois que um jogador equipa uma vara de pescar, ouvir a entrada do usuário (neste caso, a chaveE) e chamar funções adicionais:
-- Obtenha os serviços de jogo necessários
local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Obtenha um script de módulo do ReplicatedStorage que retorna uma única função
local performSomeAction = require(ReplicatedStorage.performSomeAction)
-- Assume que este script é um filho da vara de pescar
local fishingPole = script.Parent
local ACTION_CAST = "Cast"
-- Verifique se a chave está desligada e, em seguida, chame outra função
local function castLine(_actionName, inputState, _inputObject)
if inputState == Enum.UserInputState.Begin then
performSomeAction()
end
end
-- Ative a ação apenas quando o jogador equipa a vara de pescar
fishingPole.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_CAST, castLine, true, Enum.KeyCode.E)
end)
-- Desative a ação quando o jogador desequipar a vara de pescar
fishingPole.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_CAST)
end)
O script do Roblox pode ser relativamente conciso porque o Roblox tem muitos pressupostos internos: um Player com um Humanoid personagem conectado ao servidor e pode equipar Tools. Esses pressupostos não existem no Unreal, então a implementação seria muito diferente.
Ativos
Unreal e Roblox suportam a importação de malhas e modelos personalizados no formato .fbx. Certos tipos de ativos podem exigir configurações específicas e configurações de exportação do seu software de modelagem de terceiros. Para mais informações, consulte as seguintes páginas:
No Unreal, os ativos são importados para o seu Content diretório, visível no Content Browser. No Roblox, os ativos são importados para o seu Workspace e para a seção Toolbox ou Inventory do Asset Manager .
O Roblox também oferece um plugin Blender de código aberto para agilizar o processo de importação, semelhante à função Enviar para Unreal do Blender Tools.
Transformações
As transformações do props.engine e do CFrames do Roblox servem a propósitos semelhantes ao representar transformações 3D de objetos:
- Ambas as transformações e CFrames representam a posição e rotação de um objeto no espaço 3D. As transformações incluem dimensionar/escalonar, enquanto o Roblox usa uma propriedade BasePart.Size que não faz parte do CFrame .
- Ambos suportam multiplicação (ou seja, composição) para transformações complexas e têm métodos internos para outras manipulações.
Colaboração
No Unreal, você colabora com sistemas de controle de versão como Perforce ou SVN, geralmente através da interface de usuário embutida do Unreal. Esses sistemas de controle de versão usam o modelo de "checkout" centralizado que bloqueia arquivos enquanto uma pessoa trabalha neles.
Os arquivos do Roblox vivem na nuvem (embora você possa exportar cópias), então o Roblox Studio fornece fluxos de colaboração internos para edição simultânea, gerenciamento de grupo, permissões, elaboração de scripts e muito mais. Veja Colaboração .
Plugins
Semelhante ao Unreal, o Roblox Studio suporta plugins , que podem simplificar ou dar a você controle adicional sobre vários aspectos do processo de desenvolvimento. Plugins estão disponíveis na Creator Store , assim como ativos, muitos de grátis.
Glossário
| Unreal | Roblox | Notas | :--- | :--- | :--- Nível | | Nível | Lugar | | | Ator | Part ou Model | Veja Diferenças Filosóficas | | Classe de Planejamento | Pacote | | | | Transformar | CFrame | CFrame não inclui informações de escala. Veja Transformações | | Outliner | Explorer window | | | Details panel | Properties window | Level Viewport | Viewport | | Content Browser | Asset Manager ou Toolbox | | | | | Landscape Mode | Terrain Editor | | | PlayerStart | | | Output | Log Output