Agora que você tem um mundo 3D, é hora de adicionar seu primeiro script. Nesta seção, você criará uma mecânica de coleta de moedas que permite aos jogadores coletar moedas e desabilitar temporariamente as moedas depois que elas foram coletadas.
Crie as moedas
Antes de começar a scriptar, você precisa ter objetos de placeholder no mundo para usar como suas moedas. Assim como as plataformas de pilha marinha que você fez na seção anterior, as moedas podem ser objetos simples Part.
Crie as moedasNo Workspace > World, crie uma nova pasta chamada Coins.Dentro da pasta Coins, crie uma parte cilíndrica nomeada Coin com a BrickColor definida como Gold, Material definido como Metal, Tamanho 0.6, 8, 4 e Orientação 90, 0, 0.Desative CanCollide e ative Anchored.Em seguida, duplique a parte Coin várias vezes e espalhe as duplicatas ao redor da ilha e nas plataformas para que sejam acessíveis a partir dos níveis de pilha marinha.Mantenha cada duplicata nomeada como Coin.
Crie o script
Em seguida, você fará com que as moedas respondam aos jogadores. O motor Roblox pode detectar quando algo toca uma moeda, mas você precisa usar um script para definir como a moeda deve reagir.
Crie CoinServiceNo ServerScriptService, crie um Script chamado CoinService com o seguinte código:```lua-- 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-- O jogador tocou uma moedacoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Jogador coletou uma moeda")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Configurando ouvintes de eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Agora, sempre que um jogador tocar uma moeda, a moeda desaparece por 10 segundos, e o registro de saída imprime Jogador coletou uma moeda.
As seções a seguir descrevem como o script funciona em mais detalhes.
Inicializar serviços e variáveis
Assim como em muitos dos códigos que você provavelmente escreveu em outras linguagens, você define variáveis que precisará mais tarde no início do script. Nosso código faz o seguinte:
- Obter referências a todas as moedas - O script, em seguida, consulta o espaço de trabalho 3D para todas as referências aos objetos de moeda com o método GetChildren(). Este método retorna uma matriz contendo tudo que é parentado ao objeto com o qual está associado, que neste caso é a pasta Workspace.World.Coins que você criou anteriormente.
- Define uma variável global - A variável COOLDOWN é usada posteriormente para definir quanto tempo desabilitar uma moeda após ela 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...
Definir o manipulador de eventos
O Motor Roblox simula fisicamente o mundo 3D e lida com muita da lógica para gerenciar eventos relacionados à renderização, física e rede. Quando você está interessado em scriptar sua própria lógica durante alguns desses eventos, você pode ouvir e gerenciá-los, permitindo que o motor faça o resto. Neste caso, você ouve e manipula eventos relacionados ao toque nas moedas. O script define a lógica para lidar com esse evento no método onCoinTouched(), que faz o seguinte:
- Detecta se a moeda está habilitada - Cada Instance tem um atributo booleano Enabled 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 habilitada, o método usa o serviço de jogadores para verificar se o objeto que tocou a moeda era de fato 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 a reabilita após 10 segundos - Finalmente, se um jogador tocou a moeda, o método desabilita a moeda, aguarda 10 segundos e então reabilita a moeda para coleta. task.wait() é usado em vez de wait() porque oferece melhor desempenho ao não pausar completamente a execução do código, permitindo que tarefas em outras threads sejam executadas de forma concorrente.
Definindo o Manipulador de Eventos
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- O jogador tocou uma moeda
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Jogador coletou uma moeda")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
Conectar o manipulador de eventos
Todos os objetos 3D simulados herdam de BasePart e, portanto, possuem um evento Touched(). O seguinte loop conecta o manipulador onTouchedEvent() a cada evento de toque da moeda fazendo o seguinte:
- Iterar através de todas as moedas - Percorra cada uma das moedas usando iteração geral.
- Conectar o manipulador ao evento - Em cada iteração do loop, a moeda é habilitada por padrão, então é visível no mundo 3D durante o início do jogo. O método do manipulador onCoinTouched() também é conectado ao evento Touched da moeda para que seja executado toda vez que o evento ocorrer. Quando o motor detecta um toque, ele também passa o objeto que tocou o objeto, otherPart.
Conectando o Manipulador de Eventos
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
Teste a mecânica
Selecione Testar no dropdown e clique em Jogar. Mova seu personagem para tocar uma moeda. Se tudo estiver funcionando, a moeda desaparece, a janela Output imprime Jogador coletou uma moeda, e a moeda reaparece 10 segundos depois.
