Agora que você tem um mundo 3D, esta seção do tutorial ensina você a adicionar seu primeiro script para definir uma mecânica de coleta de moedas.Essa mecânica permite que os jogadores coletem moedas e desabilite a coleta de uma moeda se ela foi coletada recentemente.
Criar as moedas
Antes de poder programar qualquer coisa, você precisa ter objetos de espaço reservado no mundo para usar como suas moedas.Como as plataformas de pilha 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 diretório ao diretório Mundo , então renomeie-o Moedas .
Insira uma peça cilindro na pasta Moedas , então renomeie a peça para Moeda .
Selecione a peça, então na janela Propriedades ,
- Defina Cor do Tijolo para Ouro .
- Defina Material para Metal .
- Defina Tamanho 0.6, 8, 4 .
- Desabilite CanCollide .Isso diz ao motor que outras peças podem passar pela moeda, o que significa que os jogadores podem caminhar pelas moedas para coletá-las.
- Ativar Ancorado .Isso diz ao motor que nunca mude 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.
Duplique mais algumas moedas e posicione-as ao redor do mapa para fins de teste.
Suas peças de cilindro agora parecem moedas e impedem a simulação de física, mas você precisa adicionar lógica às moedas para que os jogadores possam coletá-las.
Crie o script
Para que as moedas sejam coletáveis, você quer reagir aos jogadores que as tocarem.O Motor do Roblox pode notificá-lo quando algo tocar uma moeda, mas você precisa declarar isso em um script.Para criar um script:
Na janela Explorer , passe o mouse sobre Serviço de Script de Servidor e clique no botão ⊕ . Um menu contextual é exibido.
Do menu contextual, selecione Script .Um novo script é exibido sob Serviço de Script de Servidor , que diz ao motor para executar o script no servidor e impede que os clientes acessem o código.
Renomeie o script para CoinService .
Substitua o código padrão pelo 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 manipulador de eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- 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 ouvintes de eventofor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endAgora, sempre que um jogador toca em uma moeda, a moeda desaparece por 10 segundos e o registro de saída imprime Player collected coin .
Explicação de códigoAs seções a seguir descrevem como o script funciona em mais detalhes.
Inicializar 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 no topo do script.Nosso código faz o seguindo:
Obtenha instâncias de serviço - Os serviços do Roblox fornecem funcionalidades integradas para recursos comuns.O script primeiro obtém instâncias do serviço Workspace 3D, que contém todos os objetos no mundo 3D e do serviço Player, que gerencia e contém todos os jogadores conectados à sua experiência.
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 que contém tudo associado ao objeto com o qual está associado, que neste caso é o diretório Workspace.World.Coins que você criou anteriormente.
Defines uma variável global - A variável COOLDOWN é usada mais tarde para definir por quanto tempo desativar uma moeda depois de 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...
Defina o manipulador de eventos
O motor do Roblox simula fisicamente 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 ouvi-los e lidar com eles, enquanto deixa o motor fazer o resto.Neste caso, você ouve e lida com eventos relacionados a moedas sendo tocadas.O script define a lógica para lidar com esse evento no método onCoinTouched(), que faz o seguindo:
Detecta se a moeda está habilitada - Cada tem um atributo booleano que define se o objeto existe ou não no mundo 3D.Você pode obter atributos de instância com o método GetAttribute().
Detecta se um jogador tocou a moeda - Se uma 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 Roblox passa o objeto que tocou a moeda como um parâmetro otherPart.O script verifica se o pai de otherPart pertence a um jogador.
Desabilita a moeda se um jogador a tocou, e reativa-a após 10 segundos - Finalmente, se um jogador tocou a moeda, o método desabilita a moeda, espera por 10 segundos e, em seguida, reativa a moeda para coleções. task.wait() é usado em vez de wait() porque oferece melhor desempenho ao não pausar totalmente a execução de código, permitindo que tarefas em outros subprocessos sejam executadas simultaneamente.
Definindo o Gerenciador de Eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Jogador tocou em uma moedacoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
Conectar o manipulador de eventos
Todos os objetos 3D simulados herdados de BasePart e, portanto, têm um evento Touched().O seguinte loop conecta o manipulador onTouchedEvent() ao evento de toque de cada moeda fazendo o seguindo:
Percorra todas as moedas - Percorra cada uma das moedas usando a iteração geral.
Conecte o manipulador ao evento - Em cada iteração do loop, a moeda é habilitada por padrão, então ela é visível no mundo 3D durante o início inicial da experiência.O método do manipulador onCoinTouched() também está conectado ao evento Touched da moeda para que ele ocorra sempre que o evento ocorrer.Quando o motor detecta um toque, também passa no objeto que tocou o Objeto, otherPart .
Conectando o Gerenciador de Eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Teste o mecânico
É hora de ver se a mecânica de coleção de moedas funciona como pretendido. Para testar sua experiência:
Na barra de ferramentas, clique no botão Jogar . O Studio entra no modo de teste de jogo.
Mova seu personagem para tocar em 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.