Why is :GetPlayerFromCharacter() returning nil?

I made this script:

local debounce = false

script.Parent.Touched:Connect(function(hit)
	if hit.Parent:FindFirstChildWhichIsA("Humanoid") then
		local player = game.Players:GetPlayerFromCharacter(hit.Parent)
		if debounce == false then
			debounce = true
			script.Parent.EnteredZone:FireClient(player)
		end
	end
end)

It’s to detect if a player enters a zone, and then I want to use a remote event. The problem is that I can’t fire the remote event because I can’t get the player object without :GetPlayerFromCharacter(), which returns nil.

I’ve seen a post asking this exact same question, but it had no solution, and I’d also like to know if there’s any alternative to get the player object from a .Touched function.

GetPlayerFromCharacter returns nil when a player can’t be retrieved from the argument. You should look into debugging your code, such as printing what parts are being sent to the touched event.

If you’re looking for an alternative, my personal recommendation has always been raycasting downwards to a zone assuming you have multiple zones you need to check over. Raycasts are inexpensive when short so they’re often my go-to solution for any zone work.

In this case you’d already have the player and/or character and you can just determine every frame whether or not they’re in the zone and activate your protection functions accordingly.

1 Like

but it shouldn’t return nil if it’s triggered after the part is touched by a character

You shouldn’t assume that a character touched it. Please debug your code to make sure of what parts are coming into contact with the part and what the parent of the part is. GetPlayerFromCharacter doesn’t return nil if a player can be resolved from the character.

1 Like

Thanks, just realized I had a dummy inside

Yeah, whenever you call “:GetPlayerFromCharacter()” it’s a good idea to proceed the following line with if variable then variable being whatever variable the result was assigned to.