The error was the wait(0.5) in your script before you connected the .CharacterAdded event. This means that the player was added into the workspace before you connected the function to the event so it did not fire. You should avoid using wait functions except in loops due to this inconsistency.
RootPart is just my own way of getting the “HumanoidRootPart” since it is slightly more efficient. Same with :PivotTo(CFrame) which is recommended for moving anything and can move both parts and models.
It probably errored because you had a :WaitForChild(), Event:Wait(), wait() or something somewhere. Any delays will likely cause the event to not fire when the character is added. Yes, your method works too but it will only fire once and not when the character respawns (assuming this is not under StarterCharacterScripts).