Połączenie wejścia użytkownika z akcjami zapewnia użytkownikom znacznie lepszą i intuicyjniejszą kontrolę nad funkcjami w Twoim doświadczeniu. W tym poradniku przypiszesz akcję przeładowania do konkretnego klawisza.
Rozpocznij
Ten poradnik wykorzystuje narzędzie Blaster stworzone w Tworzenie narzędzi gracza. Możesz postępować według tych instrukcji, 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 między dowolnymi doświadczeniami. Aby dodać model do swojego doświadczenia:
- W przeglądarce otwórz stronę modelu, kliknij przycisk Pobierz. To doda model do Twojego inwentarza.
- Upewnij się, że rozwijane menu jest ustawione na Moje modele.
- Wybierz model Blaster, aby dodać go do doświadczenia.
Stwó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ą, aby przechować nazwę 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)Stwó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()endWe wnętrzu funkcji sprawdź, czy podana actionName pasuje do nazwy akcji przeładowania i upewnij się, że inputState jest UserInputState.Begin (stan początkowy). To ważne, ponieważ funkcja uruchomi się za każdym razem, gdy zmieni się inputState, ale przeładowanie powinno zachodzić tylko raz.
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thenendendAby było oczywiste, gdy użytkownik wykonuje przeładowanie, zmień TextureId narzędzia na "rbxassetid://6593020923" na chwilę, a następnie zmień go z powrotem do jego pierwotnej wartości "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 konkretnym wejściem za pomocą 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, które reprezentują różne przyciski wejściowe, takie jak klawisze na klawiaturze czy 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 stworzenia 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()endPrzeprowadź testy przez wyposażenie narzędzia i naciśnięcie klawisza R na klawiaturze. Ikona plecaka powinna na chwilę zmienić się w symbol oczekiwania, aby sygnalizować, że broń jest przeładowywana:
Odłącz akcję
Gdy użytkownik zdejmie narzędzie, akcja musi zostać odłączona, aby nie mogli zostawić akcji przeładowania bez posiadania narzędzia.
Stwó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)Podłącz funkcję toolUnequipped do zdarzenia Unequipped, aby funkcja uruchamiała się, gdy zdarzenie rozpocznie.
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)Przeprowadź testy, 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 ukończona - dla dodatkowego wyzwania spróbuj zliczać 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.