✓ Accepted answer
The issue is that you're searching the Players service for the actual otherCharacter object. If you simply used otherCharacter.Name in your :FindFirstChild(), it would work just fine. However, I would suggest using :GetPlayerFromCharacter(), instead, as shown below.
local Players = game:GetService("Players")
local Tool = script.Parent
Tool:WaitForChild("Handle").Touched:Connect(function(part)
local Player = Players:GetPlayerFromCharacter(part.Parent)
if Player then
print(Player.Name)
end
end)
Also, notice how I changed your function a bit. Instead of having a named function, like you did, I turned it into a silent function. Truthfully, the only reason I do this is when I know I'm not going to call the function in the future. In your case, the function is bound to an event, so you probably won't be calling it again. This keeps one less variable out of the stack, keeping your namespace tidy and improving efficiency.