I can’t give you a full implementation of this but you would basically either :Clone() a player’s character or use Humanoid:ApplyDescription(description) to make it look like the target player. Then throughout the game at random times, you would track the player’s character CFrame and apply it to the new clone you’ve created.
It all has to do with the CFrame values of the player’s character, and then applying those on the clones. Probably by using PathfindingService.
As for the looking at you and descending part, you can use CFrame.lookAt() and then position the player X studs underground (where X is a number describing how many studs under the ground you want the clone to be). For smoothness you can use TweenService, CFrame:Lerp() or Vector3:Lerp().
I can’t really give you a whole implementation of what you want, I provided you with links that would help you achieve what you need. If you don’t know how to use those services or how CFrame works, then you should probably spend some time learning the scripting basics before moving on into something like this.
You can find tutorials all over YouTube, or you can just read documentation.
Ok, I’ve created a process where every second a part will appear at your characters position in a folder inside the player, the name of the part depends on the amount of parts already in the folder
(So if there were 10 parts in the folder the newest part would be called 11)
Once the number of parts reaches 10 or higher an npc will spawn at that part but minus 10 (so if the npc spawned at part 20, just minus that by 10 and thats where he would spawn)
The npc will now walk through the parts until it reaches the highest number there was when it spawned
This might sound a bit complicated but I did create a video showcasing this