Połączenie wejścia użytkownika z akcjami daje użytkownikom znacznie lepszą i bardziej intuicyjną kontrolę nad funkcjami twojej gry. W tym samouczku powiążesz akcję przeładowania z określonym klawiszem.
Rozpocznij
Ten samouczek wykorzystuje narzędzie Blaster stworzone w Tworzenie narzędzi gracza. Możesz postępować zgodnie z tymi instrukcjami, aby stworzyć narzędzie lub możesz pobrać model Blaster i wstawić go do StarterPack.
Modele można dodać do swojego Inwentarza, aby używać ich w różnych grach. Aby dodać model do swojej gry:
- W przeglądarce otwórz stronę modelu, kliknij przycisk Pobierz. To dodaje model do twojego inwentarza.
- Z menu Okno w Studio lub paska narzędzi na karcie Strona główna, otwórz Toolbox i wybierz kartę Inwentarz.
- Upewnij się, że rozwijane menu jest ustawione na Moje modele.
- Wybierz model Blaster, aby dodać go do gry.
Utwórz obsługę akcji
Najpierw potrzebujesz funkcji, która obsłuży wykrycie wejścia użytkownika.
Otwórz LocalScript ToolController wewnątrz Blastera.

Utwórz zmienną do przechowywania nazwy akcji.
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)Utwórz funkcję o nazwie onAction, która przyjmuje trzy argumenty: actionName, inputState i inputObject. To będzie funkcja, która uruchomi się, gdy wykryte zostanie wejście użytkownika.
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)endlocal function toolEquipped()tool.Handle.Equip:Play()endWewnątrz funkcji sprawdź, czy podana actionName odpowiada nazwie akcji przeładowania i upewnij się, że inputState to UserInputState.Begin (stan początkowy). To jest ważne, ponieważ funkcja uruchomi się za każdym razem, gdy zmieni się inputState, ale przeładowanie musi się zdarzyć tylko raz.
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thenendendAby było oczywiste, kiedy użytkownik przeładowuje, zmień TextureId narzędzia na "rbxassetid://6593020923" na chwilę, a następnie zmień go z powrotem na jego oryginalną wartość "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
Powiąż akcję
ContextActionService może być użyty do powiązania funkcji z określonym wejściem, używając funkcji BindAction, która przyjmuje kilka argumentów:
- Nazwa akcji.
- Funkcja obsługująca akcję (nazywana również "callback").
- Czy przycisk dotykowy powinien być wyświetlany.
- Dowolna liczba Enum.KeyCodes, które mają być wykrywane i powiązane z akcją.
KeyCodes to wartości reprezentujące różne przyciski wejściowe, takie jak klawisze na klawiaturze lub przyciski kontrolera. Pełna lista kodów jest dostępna tutaj.
Uzyskaj ContextActionService na początku skryptu.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"Wewnątrz funkcji toolEquipped wywołaj BindAction i przekaż następujące argumenty:
- Nazwa akcji (RELOAD_ACTION)
- Obsługa akcji (onAction)
- Wartość do utworzenia przycisku dotykowego (true)
- Naciśnięcie klawisza do wykrycia (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()endPrzetestuj grę, wyposażając narzędzie i naciskając klawisz R na klawiaturze. Ikona plecaka powinna na chwilę zmienić się na symbol oczekiwania, aby sygnalizować, że broń jest przeładowywana:
Odłącz akcję
Gdy użytkownik zdejmie narzędzie, akcja musi być odłączona, aby nie mógł przeładować bez wyposażonego narzędzia.
Utwórz nową funkcję o nazwie toolUnequipped i wywołaj UnbindAction, przekazując nazwę akcji.
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)Połącz funkcję toolUnequipped z wydarzeniem Unequipped, aby funkcja uruchomiła się, gdy zdarzenie zostanie wywołane.
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)Przetestuj grę, aby potwierdzić, że wszystko działa poprawnie. Powinieneś być w stanie przeładować, gdy narzędzie jest wyposażone, ale nie, gdy jest zdjęte.
Twoja animacja przeładowania jest teraz gotowa - dla dodatkowego wyzwania spróbuj odliczać licznik amunicji za każdym razem, gdy blaster jest strzelany. Możesz następnie dezaktywować funkcję toolActivated, gdy pistolet nie ma amunicji, a następnie ponownie ją aktywować, gdy animacja przeładowania się zakończy.