So I have this code which appears to run when the game starts - I didn’t think functions did that and now I’m confused. Here is the output.
I’m at a loss to explain this. Can anyone help me out?
Tabs = {"Boosts","Trails","Coins"}
currently = 1
function changeTab(actionName, state, inputObject)
print("Fired1")
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then return end
print(inputObject.KeyCode)
if inputObject.KeyCode == Enum.KeyCode.ButtonL1 then
print("Hi")
--script.Parent:FindFirstChild(Tabs[currently]).Visible = true
end
end
game:GetService("ContextActionService"):BindAction("changeTab",changeTab,false,Enum.KeyCode.ButtonL1)
An KeyCode has two ‘properties’. Name (string) and Value (int)
Correct code
Tabs = {"Boosts","Trails","Coins"}
currently = 1
function changeTab(actionName, state, inputObject)
print("[Key] The key Fired1 has been pressed.")
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then return end
if inputObject == Enum.KeyCode.ButtonL1 then
print("Hi")
--script.Parent:FindFirstChild(Tabs[currently]).Visible = true
end
end
game:GetService("ContextActionService"):BindAction("changeTab",changeTab,false,Enum.KeyCode.ButtonL1)
I’ve had a lot of problems with ContextActionService, maybe I should use UserInputService instead? Binding actions and unbinding them just so you can press Y to change the shown GUI seems a bit odd.
Nah, ContextActionService is probably the right thing to do for input. Try printing the type (InputObject.UserInputType) - chances are you’re probably getting something different.
My problems with CAS go further than this. Its acting really strangely all the time. I’ve keybound ButtonY to mean “advance” and now it automatically advances for me. Its such a mess
I get “Enum.UserInputType.None” when I print out the UserInputType. gg roblox (although its probably my fault)
Also try printing the UserInputState, because you may be getting Enum.UserInputState.Cancel. Either way, you can add UserInputType.None and UserInputState.None to your if statement to make sure that you’re not getting any ‘invalid’ input.
I’ve just realised the best way to do this is with an auxillary function which checks if its a valid gamepad input (as I also use MouseButton1Click for PC players) and it looks like it is working as intended so far, albeit I haven’t rewritten the code from this question yet.
Hmmm… I’ve managed to code everything in except for my spectate ui. When the player wants to view the next player they can either press R1 or L1 to cycle. However, my code just isn’t working.
The changeCamXbox method just isn’t firing, yet the Spectating.changed function already worked and I’ve just added the Bind and Unbind commands, yet pressing R1 or L1 does nothing. Anyone have any ideas? @digpoe
function changeCamXbox(actionName, actionInputState, actionInputObject)
print(actionName)
if actionInputState == Enum.UserInputState.Begin then
if actionName == "Next" then
increment()
elseif actionName == "Back" then
decrement()
end
end
end
script.Parent.Spectating.Changed:connect(function(value) --player starts spectating
if value == false then
local cam = workspace.CurrentCamera
cam.CameraSubject=game.Players.LocalPlayer.Character.Humanoid
script.Parent.PlrName.Value = ""
script.Parent.Visible = false
game:GetService("ContextActionService"):UnbindAction("Next")
game:GetService("ContextActionService"):UnbindAction("Back")
else
changeCamera()
script.Parent.Visible = true
game:GetService("ContextActionService"):BindAction("Next",changeCamXbox,false,Enum.KeyCode.ButtonR1)
game:GetService("ContextActionService"):BindAction("Back",changeCamXbox,false,Enum.KeyCode.ButtonL1)
end
end)