Agora que você tem um mundo 3D, esta seção do tutorial ensina você como adicionar seu primeiro script para definir uma mecânica de coleta de moedas. Essa mecânica permite que os jogadores coletem moedas e desabilita a coleta de uma moeda se ela tiver sido recentemente coletada.
Criar as Moedas
Antes de você poder fazer qualquer coisa, você precisa ter objetos de espaço reservado no mundo para usar como suas moedas. Como as plataformas de pilhas de mar que você fez na seção anterior, as moedas podem ser objetos simples Part .
Para criar as moedas:
Na janela Explorer , adicione um novo pasta na pasta Mundo , então renomeie-a para Moedas .
Insira uma peça cilindro na pasta Moedas , então renomeie a peça para Coin .
Selecione a peça, então na janela Propriedades ,
- Definir Cor de Tijolo para Ouro .
- Definir Material para Metal .
- Definir Tamanho para 0.6, 8, 4 .
- Desabilitar CanCollide . Isso diz ao motor que outras peças podem passar pela moeda, o que significa que os jogadores podem caminhar através das moedas para coletá-las.
- Habilite Anchored . Isso diz ao motor para nunca alterar a posição da moeda devido a qualquer simulação relacionada à física, o que significa que os jogadores podem tocar a moeda sem afetar sua localização.
Duplica algumas moedas e coloca-as ao redor do mapa para fins de teste.
Suas peças de cilindro agora se parecem com moedas e impedem a simulação de física, mas você precisa adicionar lógica às moedas para que os jogadores possam coletá-las.
Criar o Script
Para que as moedas sejam coletáveis, você quer reagir aos jogadores que as tocam. O motor do Roblox pode notificá-lo quando algo toca uma moeda, mas você precisa declarar isso em um script. Para criar um script:
Na janela Explorer , passe o mouse sobre ServerScriptService e clique no botão ⊕ . Um menu contextual será exibido.
Do menu contextual, selecione Script. Um novo script será exibido em ServerScriptService ', que diz ao motor para executar o script no servidor e impede que os clientes acessoem o código.
Renomeie o script para CoinService .
Substitua o código padrão com o seguinte código:
-- Inicializando serviços e variáveislocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Definindo o gerenciador de eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- O jogador tocou em uma moedacoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Configurando ouvidores de eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endAgora, sempre que um jogador toca uma moeda, a moeda desaparece por 10 segundos, e o log de saída imprime Player collected coin .
Explica??o de C?digoAs seções a seguir descrevem como o script funciona com mais detalhes.
Inicializando Serviços e Variáveis
Como com muito do código que você provavelmente escreveu em outros idiomas, você define variáveis que você precisa mais tarde na parte superior do script. Nosso código faz o seguindo:
Obtenha referências a todas as moedas - O script então consulta o espaço de trabalho 3D para todas as referências a objetos de moeda com o método GetChildren(). Este método retorna um array contendo tudo o que está ligado ao objeto que você criou previamente, que neste caso é o Workspace.World.Coins pasta.
Define uma variável global - A variável COOLDOWN é usada mais tarde para definir o tempo de desativação de uma moeda depois de ser coletada.
Inicializando Serviços e Variáveislocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Definindo o Gerenciador de Eventos
O mecanismo Roblox fisicamente simula o mundo 3D e lida com muita da lógica para lidar com eventos relacionados a renderização, física e rede. Quando você está interessado em programar sua própria lógica durante alguns desses eventos, você pode ouvir e lidar com eles, enquanto deixa o motor fazer o resto. Neste caso, você ouve e lida com eventos relacionados
Detecta se a moeda está ativada ou não - Cada Instance tem um atributo Enabled que define se o objeto existe no mundo 3D ou não. Você pode obter atributos de instância com o método 0> Class.Instance:GetAttribute()|GetAttribute() .
Detecta se um jogador tocou a moeda - Se a moeda estiver ativada, o método usa o serviço do jogador para verificar se o objeto que tocou a moeda era realmente um jogador. Quando um evento de toque ocorre, o motor do Roblox passa o objeto que tocou a moeda como um parâmetro otherPart. O script verifica se o pai de otherPart pertence a um
Desabilita a moeda se um jogador a tocar a moeda, e re-abilita após 10 segundos. Finalmente, se um jogador tocar a moeda, o método desabilita a moeda, espera por 10 segundos e depois re-abilita a moeda para coleções. task.wait() é usado em vez de wait() porque
Definindo o Gerenciador de Eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- O jogador tocou em uma moedacoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
Conectando ao Gerenciador de Eventos
Todos os objetos 3D simulados herdam de BasePart e, portanto, têm um evento Touched(). O seguinte loop conecta o cabo de onTouchedEvent() ao evento de toque de cada moeda ao fazer o seguindo:
Loop através de todas as moedas - Loop através de cada uma das moedas usando iteração geral.
Conecte o gerador ao evento - Em cada iteração do loop, a moeda é ativada por padrão, então ela é visível no mundo 3D durante o início inicial da experiência. O método onCoinTouched() do gerador também é conectado ao evento Touched
Conectando ao Gerenciador de Eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Testar o Mecânico
É hora de ver se a coleção de moedas funciona como deveria. Para testar sua experiência:
Na barra de menu, clique no botão Jogar . Studio entra no modo de teste de jogo.
Mova seu personagem para tocar uma moeda. Se seus scripts estiverem funcionando corretamente, a janela Saída exibe Player collected coin , e a moeda desaparece por 10 segundos antes de reaparecer.