Conectar a entrada do usuário a ações oferece aos usuários um controle muito melhor e mais intuitivo sobre os recursos da experiência.Neste Tutorial, você vai ligar uma ação de recarregamento a uma chave específica.
Comece
Este tutorial usa a ferramenta Blaster criada em Criar Ferramentas do Jogador.Você pode seguir essas instruções para criar a ferramenta ou pode baixar o modelo Blaster e inseri-lo no StarterPack .
Modelos podem ser adicionados ao seu inventário para serem usados entre qualquer experiência. Para adicionar um modelo à sua experiência:
- Em um navegador, abra a página do modelo modelo, clique no botão Obter . Isso adiciona o modelo ao seu inventário.
- No Studio, vá para a aba Ver e clique na Caixa de Ferramentas .
- Na janela da Caixa de Ferramentas, clique no botão Inventário . Em seguida, certifique-se de que o menu suspenso está em Meus Modelos .
- Selecione o modelo Blaster para adicioná-lo à experiência.
Crie um manipulador de ação
Primeiro, você precisará de uma função para lidar quando a entrada do usuário for detectada.
Abra o Controlador de Ferramentas dentro do Blaster.
Crie uma variável para armazenar um nome para a ação.
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function toolEquipped()tool.Handle.Equip:Play()endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)Crie uma função chamada onAction que recebe três argumentos: actionName , inputState e inputObject.Esta será a função que será executada quando o input do usuário for detectado.
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)endlocal function toolEquipped()tool.Handle.Equip:Play()endDentro da função, verifique se o dado actionName corresponde ao nome da ação de recarregamento e garanta que inputState seja UserInputState.Begin (o estado inicial).Isso é importante porque a função será executada sempre que as alterações de inputState mudarem, mas a recarga só precisa acontecer uma vez.
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thenendendPara tornar óbvio quando o usuário recarrega, altere o TextureId do instrumento para "rbxassetid://6593020923" por um momento e depois volte ao seu valor original de "rbxassetid://92628145".
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endend
Vincule a ação
ContextActionService pode ser usado para ligar uma função a uma entrada específica usando a função BindAction, que aceita vários argumentos:
- O nome da ação
- A função para lidar com a ação (também chamada de "retorno de chamada")
- Se um botão de toque deve ou não ser exibido
- Qualquer quantia de Enum.KeyCodes para detectar e associar à ação.
Os códigos de tecla são valores que representam diferentes botões de entrada, como teclas de teclado ou botões de controlador.Uma lista completa de códigos está disponível here .
Obtenha ContextActionService na parte superior do script.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"Dentro da função toolEquipped, chame BindAction e passe pelos seguintes argumentos:
- O nome da ação ( RELOAD_ACTION )
- O manipulador de ação ( onAction )
- Um valor para criar um botão de toque ( true )
- Uma pressão de tecla para detectar ( Enum.KeyCode.R )
local RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endTeste de jogo equipando a ferramenta e pressionando a tecla R na sua tecla.O ícone da mochila deve mudar momentaneamente para um símbolo de espera para sinalizar que a arma está recarregando:
Desvincular a ação
Quando o usuário desequipa a ferramenta, a ação precisa ser desvinculada para que eles não possam recarregar sem que a ferramenta seja equipada.
Crie uma nova função chamada toolUnequipped e chame UnbindAction, passando pelo nome da ação.
local function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)Conecte a função toolUnequipped à função Unequipped do evento para que a função seja executada quando o evento for disparado.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Unequipped:Connect(toolUnequipped)tool.Activated:Connect(toolActivated)Teste de jogo para confirmar que tudo funciona corretamente. Você deve ser capaz de recarregar quando a ferramenta for equipada, mas não quando for desequipada.
Sua animação de recarga agora está completa - para um desafio extra, tente contar um contador de munição cada vez que o blaster for disparado.Você pode então desativar a função toolActivated quando a arma não tem munição, então reativá-la quando a animação de recarga terminar.