Replacing the default character with a custom character

#1
2015 Method (outdated, advise using the method above)

I know I’m not the only one who wants to replace the default ROBLOX character with a custom one, so today I’ll be a nice little guest and put away my destructive exploding hammer and teach you how to replace the default character with a custom one, for this tutorial I will use my cute and adorable lizard, Albet Lizinstien.

Step 1.) Create the custom character you wish to replace the default character with. Keep in mind the character will need to have a two parts named “Torso” and “Head” the Head part must be jointed to the Torso part and the joint must be called “Neck”, insert a humanoid into the model and parent the model to the ServerStorage.

Step 2.) Disable game.Players.CharacterAutoLoads

Step 3.) Insert a script into ServerScriptService, inside that script you will need to create a function that will basically do what CharacterAutoLoads will do, except slightly modified.

local function CharacterLoop(Player)
Player:LoadCharacter()
local Character = Player.Character

local NewCharacter = game:GetService("ServerStorage"):WaitForChild("Lizard"):Clone()
NewCharacter.Parent = game.Workspace
NewCharacter.Name = Player.Name
Player.Character = NewCharacter

Character = Player.Character

Character.ChildAdded:connect(function(v) 
	if v:IsA("BasePart") or v:IsA("UnionOperation") or v:IsA("Script") or v:IsA("LocalScript") or v:IsA("Humanoid") then 
		return		
	elseif v:IsA("BodyColor") then
		wait()
		for i,v in pairs({"Head", "Torso", "Left Arm", "Right Arm", "Left Leg", "Right Leg"}) do
			if Character:FindFirstChild(v) ~= nil then
				Character[v].BrickColor = BrickColor.new("Camo")
			end
		end
		v:Destroy()
	else
		wait()
		v:Destroy()
	end
	for i,v in pairs({"Head", "Torso", "Left Arm", "Right Arm", "Left Leg", "Right Leg"}) do
			if Character:FindFirstChild(v) ~= nil then
				Character[v].BrickColor = BrickColor.new("Camo")
			end
		end
end)

local CameraFixer = script.CameraFixer:Clone()
CameraFixer.Disabled = false
CameraFixer.Parent = Player:WaitForChild("PlayerGui")

local Humanoid = Character:WaitForChild("Humanoid")

Character.Animation.Disabled = false	

Humanoid.Died:connect(function()
	wait(2)
	CharacterLoop(Player)
end)
end

local function OnPlayerAdded(Player)
CharacterLoop(Player)
end

game.Players.PlayerAdded:connect(OnPlayerAdded)
for _,Player in pairs(game.Players:GetPlayers()) do OnPlayerAdded(Player) end

Step 4.) Next you will want to create a LocalScript inside that script and name it “CameraFixer”, and inside this script you will want to put in:

local Player = game:GetService("Players").LocalPlayer
local Character = Player.Character or Player.CharacterAdded:wait() Character = Player.Character
local Humanoid = Character:WaitForChild("Humanoid")

local Camera = game.Workspace.CurrentCamera
Camera.CameraSubject = Humanoid
Camera.CameraType = Enum.CameraType.Custom

This script will ensure that your camera is properly attached to your new character.

Step 5.) ???

Step 6.) Profit.

See? Not that hard to do, have fun and remember. Guests are friends, not enemies.


And for those who want to replace the default character with a custom cute lizard or are just too lazy to read all of this:
http://www.roblox.com/Custom-Character-item?id=314434305

38 Likes
Removing existing Body bundles?
#2

Thanks! Pretty useful for creating custom characters instead of being stuck with a boring robloxian. (Not necessarily boring, but oh well!)

-Libby

2 Likes
#3

Instead of removing assets that get loaded, you can simply do

player.CanLoadCharacterAppearance = false

how 2 lua highlighting

6 Likes
#4

You should replace

Humanoid.Died:connect(function()
    wait(2)
    CharacterLoop(Player)
end)

With

Humanoid.Died:wait()
wait(2)
CharacterLoop(Player)
2 Likes
#5

If you use Github-style markdown then you can do something like this:

 ```lua
 print("hi")

And it'll automatically highlight it. Like this:

```lua
print("Hello, world!")
3 Likes
#6

Completely forgot about that property, thanks!

2 Likes
#7

Does this work with multijointed characters?

1 Like
#8

Yes, it will replace the default character with whatever you want.

1 Like
#9

Just bumping this for others to find easier. (Could this also be made public for non-RBXDev members to see?)

2 Likes
#10

@Nightgaladeld thanks for the repost.

2 Likes
#11

Now, this thread was made quite some years ago - regardless…

If we look at this page http://wiki.roblox.com/index.php?title=API:Class/StarterPlayer
We can see that it is now as simple as adding a Model named StarterCharacter into the StarterPlayer service, after which the default character loading is disabled, and your overridden character style applies instead.

StarterCharacterExample.rbxl (17.7 KB)
Here’s an example of a place using StarterCharacter (replaces the default character with an R15 rig without a left arm).
Note that scripts are still made to the rig unless overridden from StarterCharacterScripts.

9 Likes
#12

Since this post was bumped, you should probably mention your method is obsolete and a new method as replaced it.

2 Likes
#13

Hello. The method stated in the wiki can’t be replicated by me. I do not have access to the example. Did roblox change the way we load customize characters?

2 Likes
#14

I don’t think Roblox would change something like this without any notice, besides, the method still works for me. Make sure you put the Humanoid inside the StarterCharacter and named it correctly

#15

Thank you for answering. Is there a way you can share the rbxl file. It seems like an cannot access it. I am very certain that I have named it StarterCharacter and have a valid Humanoid inside. The problem is I cannot seem to make it work. It is parented to StarterPlayerScripts. There are no scripts in the place. I remember I was able to do this before about a month ago. Now when I am using the same method I cannot replace the default character. I wonder if there are any settings that overwrites it.

#16

Here’s my StarterCharacter model, it works for me
StarterCharacter.rbxm (12.5 KB)

#17

Thank you. I realized my mistake. I added the model to StarterPlayerScripts instead of StarterPlayer.