The First Person Element Of A First Person Shooter

This guide was originally written for scriptinghelpers. The original can be found here.

In this post we will be talking about creating our very own filtering enabled friendly first person shooter (FPS) game. I do want to make clear though that I won’t be covering how to actually make the weapon shoot in this article. All we are going to be covering is the visuals meaning having the character aim down sights, look up and down, etc. Maybe we’ll talk about shooting another day.

Things to take note of

FPSs can get messy. Our goal of course is to keep things as straightforward as possible, but that can be difficult when we’re dealing with the client server model. This is especially true for FPS games because in order to keep bandwidth low and games lag free a lot of tricks are used on the player. We’ll talk about what some of those tricks are later on, but to make things simple we’ll start off by focusing purely on the client and then we’ll move to the server.

Client

The only thing I’m going into this with is a simple weapon I had a friend make me. You should take note of a few small invisible parts that I’ve put in the model. The part Handle will be used to offset the weapon from our view and the parts Right and Left will be used to mark hand placement later. These parts all have their front face facing forward and their up face facing up. This helps ensure later on that we won’t have our weapon rotated in some odd way.

img1

Setting up the view model

When a player is fully zoomed into first person mode any BaseParts in their character model are invisible to them. This includes their arms, head, any non-tools, etc. To get around this we will create a view model that includes arms and a weapon. This view model will not actually be attached to the character, but rather to the camera.

I created the view model by adjusting the scale properties of my character for skinnier arms, creating a copy of it, and then removing everything inside except for the arms, the upper torso, and the head (and the connecting joints). I then made sure that the parts were all set to smooth plastic and the head and upper torso had their transparency set to 1. The only part that is anchored is the head which will allow us to accurately set the CFrame later.

img2

Attaching the view model to the camera

Now that we have our view model we need to attach it to the camera. This is relatively simple because in first person the head and camera have the same CFrame. Thus, all we need to do is write an update loop that places our view model’s head right where the camera is. We’ll also be sure to remove the view model when the player dies.

local camera = game.Workspace.CurrentCamera;
local humanoid = game.Players.LocalPlayer.CharacterAdded:Wait():WaitForChild("Humanoid");

local viewModel = game.ReplicatedStorage:WaitForChild("viewModel"):Clone();

local function onDied()
	viewModel.Parent = nil;
end

local function onUpdate(dt)
	viewModel.Head.CFrame = camera.CFrame;
end

humanoid.Died:Connect(onDied);
game:GetService("RunService").RenderStepped:Connect(onUpdate);

Attaching the weapon to the view model

We can also take this opportunity to use a joint to attach the weapon to the viewl model’s head which will ensure it stays relative to the camera as we rotate. You will have to play around with the C0 value to properly offset the weapon. You will likely have to do this for every unique weapon you use due to varying sizes and what looks best in relation to your camera.

local repWeapon = game.ReplicatedStorage:WaitForChild("M249");
local weapon = repWeapon:Clone();

weapon.Parent = viewModel;
viewModel.Parent = camera;

local joint = Instance.new("Motor6D");
joint.C0 = CFrame.new(1, -1.5, -2); -- what I found fit best
joint.Part0 = viewModel.Head;
joint.Part1 = weapon.Handle;
joint.Parent = viewModel.Head;

Aiming down sights

To get our weapon to aim down the sights we will add a small invisible part to our weapon called Aim . We will use this part as a reference to where the weapon should be attached to the head when the player is aiming. Again, we’ll make sure the front face is facing forward and the up face is facing up.

img3

Since we adjusted the C0 value earlier we will make this adjustment in it’s entirety with C1 to avoid overlap.

To start we use the basic equality of joints we can figure out how to pick C1 given that weapon.Handle = joint.Part1 and we’re setting joint.Part1.CFrame = camera.CFrame .

joint.Part0.CFrame * joint.C0 == joint.Part1.CFrame * joint.C1
joint.C1 = joint.Part1.CFrame:inverse() * joint.Part0.CFrame * joint.C0
-- recall though that joint.Part0.CFrame == camera.CFrame, thus:
joint.C1 = joint.C0

Of course we want to further adjust this so the camera focuses on the Aim part, not Handle . So using inverses we can find the offset that would be needed to move from the Handle.CFrame to the Aim.CFrame .

Handle.CFrame * offset = Aim.CFrame
offset = Handle.CFrame:inverse() * Aim.CFrame;

Putting this all together we get:

local aimCount = 0;
local offset = weapon.Handle.CFrame:inverse() * weapon.Aim.CFrame;

local function aimDownSights(aiming)
	local start = joint.C1;
	local goal = aiming and joint.C0 * offset or CFrame.new();
	
	aimCount = aimCount + 1;
	local current = aimCount;
	for t = 0, 101, 10 do
		if (current ~= aimCount) then break; end
		game:GetService("RunService").RenderStepped:Wait();
		joint.C1 = start:Lerp(goal, t/100);
	end
end

local function onInputBegan(input, process)
	if (process) then return; end
	if (input.UserInputType == Enum.UserInputType.MouseButton2) then
		aimDownSights(true);
	end
end

local function onInputEnded(input, process)
	if (process) then return; end
	if (input.UserInputType == Enum.UserInputType.MouseButton2) then
		aimDownSights(false);
	end
end

game:GetService("UserInputService").InputBegan:Connect(onInputBegan);
game:GetService("UserInputService").InputEnded:Connect(onInputEnded);

gif2

Arm placement

Now that we have the weapon in place we need to attach the arms to it by using the shoulder and elbow joints. We could manually figure out these values, but to keep things interesting and hassle free for other weapons we will use the Right and Left parts to calculate a C1 for our shoulder joints.

local function updateArm(key)
	-- get shoulder we are rotating
	local shoulder = viewModel[key.."UpperArm"][key.."Shoulder"];
	-- calculate worldspace arm cframe from Right or Left part in the weapon model
	local cf = weapon[key].CFrame * CFrame.Angles(math.pi/2, 0, 0) * CFrame.new(0, 1.5, 0);
	-- update the C1 value needed to for the arm to be at cf (do this by rearranging the joint equality from before)
	shoulder.C1 = cf:inverse() * shoulder.Part0.CFrame * shoulder.C0;
end

local function onUpdate(dt)
	viewModel.Head.CFrame = camera.CFrame;
	-- update every frame so the arms stay in place when the player aims down sights
	updateArm("Right");
	updateArm("Left");
end

gif3

Server

So that takes care of the purely client side of things, from here on out everything we are dealing with is either going to be purely on the server, or a mix of the server and client.

Replicating weapon movement

So far things look good from the player perspective, but if we run a quick multiplayer game we’ll notice that none of the hard work we just did is visible to the other players!

img4

Here’s where one of those tricks I talked about earlier is going to come into play. Since we can’t see our actual character in first person mode we’re going to use it to replicate all our gun movements. This is pretty handy because what we replicate will have a slight delay from any player input and because we can’t see it nobody will be any the wiser.

The first thing we will want to replicate is the player looking up and down. We’ll do this by finding out the vertical angle the player’s looking at, sending it to the server, and having the server rotate the waist and neck joints by half the angle to spread out the rotation.

-- in server script
local remoteEvents = game.ReplicatedStorage:WaitForChild("RemoteEvents");

local neckC0 = CFrame.new(0, 0.8, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);
local waistC0 = CFrame.new(0, 0.2, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);

remoteEvents.tiltAt.OnServerEvent:Connect(function(player, theta)
	local neck = player.Character.Head.Neck;
	local waist = player.Character.UpperTorso.Waist;
	
	neck.C0 = neckC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
	waist.C0 = waistC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
end)

-- back in the client script
local remoteEvents = game.ReplicatedStorage:WaitForChild("RemoteEvents");

local function onUpdate(dt)
	viewModel.Head.CFrame = camera.CFrame;
	updateArm("Right");
	updateArm("Left");
	remoteEvents.tiltAt:FireServer(math.asin(camera.CFrame.LookVector.y));
end

gif4

That’s looking a bit better!

In order to get the character to hold the weapon we’ll use a Motor6D to connect the Handle to the RightHand .

-- in server script
remoteEvents.setup.OnServerEvent:Connect(function(player, weapon)
	local weapon = weapon:Clone();
	local joint = Instance.new("Motor6D")
	joint.Part0 = player.Character.RightHand;
	joint.Part1 = weapon.Handle;
	joint.Parent = weapon.Handle;
	weapon.Parent = player.Character;
end)

-- back in the client script
remoteEvents.setup:FireServer(repWeapon);

This will allow us to create an animation for when the player is just holding the weapon, and an animation when they player is aiming the weapon.

img5

Using animations for this purpose is nice for two reasons. The first is that animations will automatically replicate, thus we don’t need to worry about a RemoteEvent . The second is that by default animations will interpolate between each other which means we don’t have to worry about smooth transitions.

-- client
wait();
local holdAnim = humanoid:LoadAnimation(repWeapon.HoldAnim);
local aimAnim = humanoid:LoadAnimation(repWeapon.AimAnim);
local lastAnim = holdAnim;
lastAnim:Play();

local function aimDownSights(aiming)
	local start = joint.C1;
	local goal = aiming and joint.C0 * offset or CFrame.new();
	
	lastAnim:Stop();
	lastAnim = aiming and aimAnim or holdAnim;
	lastAnim:Play();
	
	aimCount = aimCount + 1;
	local current = aimCount;
	for t = 0, 101, 10 do
		if (current ~= aimCount) then break; end
		game:GetService("RunService").RenderStepped:Wait();
		joint.C1 = start:Lerp(goal, t/100);
	end
end

The one downside to animations is that Roblox doesn’t like users sharing them. As a result you’ll notice that if you load up the place I linked at the end of the post that the animations won’t load. As a result if you are going to use my exact animations then I’ve saved them in a dummy for use with the animation editor. You’ll have to load them in and export them to your own profile. If you do that remember to change the animation IDs.

The last thing we need to do is tilt the arms. Earlier we only applied the half the vertical tilt to the upper torso which is carried over to the arms, but we want the full rotation in the arms. This is easy enough to add if we just adust the tiltAt remove event.

local neckC0 = CFrame.new(0, 0.8, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);
local waistC0 = CFrame.new(0, 0.2, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);
local rShoulderC0 = CFrame.new(1, 0.5, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);
local lShoulderC0 = CFrame.new(-1, 0.5, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);

remoteEvents.tiltAt.OnServerEvent:Connect(function(player, theta)
	local neck = player.Character.Head.Neck;
	local waist = player.Character.UpperTorso.Waist;
	local rShoulder = player.Character.RightUpperArm.RightShoulder;
	local lShoulder = player.Character.LeftUpperArm.LeftShoulder;
	
	neck.C0 = neckC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
	waist.C0 = waistC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
	rShoulder.C0 = rShoulderC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
	lShoulder.C0 = lShoulderC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
end)

gif5

Edit: A slight ammendment

I had a user leave the following comment on the scripting helpers blog post:

Wouldn’t sending server updates every render step end up using a decent amount of traffic (on the server and on the client) esp. on big servers?

This is correct and was an oversight on my part when writing this post so i’ll quickly cover that now in this section.

The trick to solving this problem is to use something on the server to constantly interpolate some target angle. This way we can send an updated angle every say 1/10th of a second and have the character smoothly look up and down as opposed to suddenly tilting when the server remote event is fired.

There are two objects that are built into Roblox that will do this job for us.

One is a motor6D where we can set the DesiredAngle when we fire the remote event and then use the CurrentAngle to actually update.

-- server
remoteEvents.tiltAt.OnServerEvent:Connect(function(player, theta)	
	local tJoint = player.Character.Head:FindFirstChild("tiltJoint");
	if (tJoint) then
		tJoint.DesiredAngle = theta;
	end
end)

remoteEvents.setup.OnServerEvent:Connect(function(player, weapon)
	-- stuff from before...
	local tiltPart = Instance.new("Part");
	tiltPart.Size = Vector3.new(.1, .1, .1);
	tiltPart.Transparency = 1;
	tiltPart.CanCollide = false;
	tiltPart.Name = "tiltPart";
	tiltPart.Parent = player.Character;
	
	-- could adjust the maxVelocity
	local tJoint = Instance.new("Motor6D");
	tJoint.Name = "tiltJoint"
	tJoint.MaxVelocity = math.pi*2*0.01;
	tJoint.Part0 = player.Character.Head;
	tJoint.Part1 = tiltPart;
	tJoint.Parent = player.Character.Head;
	
	local neck = player.Character.Head.Neck;
	local waist = player.Character.UpperTorso.Waist;
	local rShoulder = player.Character.RightUpperArm.RightShoulder;
	local lShoulder = player.Character.LeftUpperArm.LeftShoulder;
	
	-- the updating happens on the server
	game:GetService("RunService").Heartbeat:Connect(function(dt)
		local theta = tJoint.CurrentAngle
		neck.C0 = neckC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
		waist.C0 = waistC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
		rShoulder.C0 = rShoulderC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
		lShoulder.C0 = lShoulderC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
	end)
end)

-- client (instead of firing in the onUpdate function we just put this at the end)
while (true) do
	wait(0.1);
	remoteEvents.tiltAt:FireServer(math.asin(camera.CFrame.LookVector.y));
end

The other is BodyPosition. We can set BodyPosition.Position = Vector3.new(theta, 0, 0) and then use the Position of the part it’s a child of to find the interpolated angle.

remoteEvents.tiltAt.OnServerEvent:Connect(function(player, theta)	
	local tPart = player.Character:FindFirstChild("tiltPart");
	if (tPart) then
		tPart.BodyPosition.Position = Vector3.new(theta, 0, 0);
	end
end)

remoteEvents.setup.OnServerEvent:Connect(function(player, weapon)
	-- stuff from before...
	local tiltPart = Instance.new("Part");
	tiltPart.Size = Vector3.new(.1, .1, .1);
	tiltPart.Transparency = 1;
	tiltPart.CanCollide = false;
	tiltPart.Name = "tiltPart";
	tiltPart.Parent = player.Character;
	
	-- you could adjust the D, P, and maxForce values
	local bodyPos = Instance.new("BodyPosition");
	bodyPos.Parent = tiltPart;
	
	local neck = player.Character.Head.Neck;
	local waist = player.Character.UpperTorso.Waist;
	local rShoulder = player.Character.RightUpperArm.RightShoulder;
	local lShoulder = player.Character.LeftUpperArm.LeftShoulder;
	
	-- the updating happens on the server
	game:GetService("RunService").Heartbeat:Connect(function(dt)
		local theta = tiltPart.Position.x;
		neck.C0 = neckC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
		waist.C0 = waistC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
		rShoulder.C0 = rShoulderC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
		lShoulder.C0 = lShoulderC0 * CFrame.fromEulerAnglesYXZ(theta*0.5, 0, 0);
	end)
end)

-- client (again, instead of firing in the onUpdate function we just put this at the end)
while (true) do
	wait(0.1);
	remoteEvents.tiltAt:FireServer(math.asin(camera.CFrame.LookVector.y));
end

gif6

It is worth noting that network ownership is something to think about here

Personally I like the BodyPosition method a bit more because it provides a smoother interpolation. I have updated the place file with this method for you convenience.

Conclusion

That about sums up the basics of the first person element of an FPS system. Hopefully having read through this post you can start to see how you might add onto it. For your convince I made the place file I created while writing this post uncopylocked. You can find the place here.

Thanks for reading!

Edit: I’ve had a few people ask me for how you might do this for R6 among other small changes. As a result here’s a placefile that has all those changes. Hopefully they answer any future questions.

fps2.rbxl (55.4 KB)

Edit2: I created yet another place with a bit more polish that hopefully shows how to add a few more details such as weapon sway etc.

778 Likes
How would I make a FPS style camera?
Moving the Character's Real Arms
How could I point an R15 rig's arm to the mouse' position?
Rotating a character's Waist to match the Camera's LookVector
How would I go about aiming down sights based on an aim part?
What do you need to know to make a weapon?
Bullet Drop, Travel Time and Spread
[HELP] Animating in First-Person
Realistic-ish Gun System
How to make a gun sway script?
Really stumped on why first person arms viewmodel not working properly
How Jailbreak gun system works? How to make one like Jailbreak?
Character Rotation
Gun sway issue, Its laggy / Jittery even with BindToRenderStep
How Do I Make R6 View Models?
Any working gun tutorials?
How can I prevent inaccurate Raycasting due to delay from the server?
How do i make a roblox fps viewmodel
Prevent weapon clipping (How does Tunneler do it?)
Animate Tools on viewmodel
How Can I Make My Gun Aim
Questions about First Person Guns
I need help with a sniper
R15 Gun Animation
Help with FPS camera
Attaching a fake arms/head rig to the player (through camera)
How to make a gun
BodyMover Properties not Replicating?
Does anyone know why this is so laggy?
Less hacky way of creating a ViewModel?
How do I go about making an FPS gun system? I'm a new at FPS yet I have a lot of experience scripting other things
Need help with FPS Gun movement
Replicating R6 torso bending to the server
Efficiently "attaching" a part to Camera?
Buggy View model script using :lerp()
Attempting Gun Bobbing (not swaying!)
Animating fps viewmodel arms
How to animate great in Studio?
How can I add aiming to my viewmodel?
FPS Animation Problem
Serverside Waist Movement?
CurrentAngle for Animations are not replicating to the Server or Other Clients
How to make player limbs bigger?
FPS Viewmodel not working
How do I make my FPS gun aim down sights?
Infinite Possible Yield When Calling On M6D
First person arms
How to make tool following camera smoother
Character rotation with camera
Problems with network owner ship on parts that you want to be anchored
Help with cframe
Arm Rotation Having Offset
How do i make my gun point at the players camera
Making third/first person gun engine
How would I go about making a CS:GO shooter?
How do I make guns with hands moving up/down?
How to make first person weapons?
How to make a first person aim system?
FPS Arms stutter and lag behind
Bending player torso on an R6 rig
Bending player torso on an R6 rig
Really stumped on why first person arms viewmodel not working properly
Unable to find anything about rigging/animating viewmodels
How would I make a sniper scope that zooms?
How to Aim Down Sights In Relation to an Animation?
[Not Solved]Rotate Motor6D over animation
Motor6D Transform shakes wierdly in FPS mode (incl. footage)
Torso.CFrame is incorrect when in first person (in RenderStep)
How can I get my gun to have first person arms? CLOSED
How can I make a gun system?
How to make a gun Aim
Why this shotgun looks so small T-T
FPS gun and arms doesn't aligning correctly
How do I rotate a motor6D in world space instead of its part1's space?
Position is not a valid member of Ray
How to make a gun aim
Aiming down sights going back and forth
Rotate arms on character X axis regardless of any other rotation
How to replicate client viewmodel arms to the server?
How Can I Make a Tool With an Animation Move With A Player’s Camera?
Character Torso Bending
How to Make Arms Follow Camera
Why is this character follow mouse not working?
Scripting mouse follow for player
How to tilt the Torso on an R6 RigType so it faces the Camera direction?
Viewmodel bugs | Sway/bobbing (ego's tutorial)
FPS Viewmodel Feedback
Help with Viewmodel
How would you make a gun system?
Substitute for LocalTransparencyModifier?
Third person shooter camera (open sources?)
How does replicating viewModles from one client to the server work?
How can I achieve this?
FPS camera doesn't work
How can I make my FPS gun appear in a viewmodel
How should i make a smooth ADS transition?
Many topics show errors when trying to open
How do you make a simple viewmodel?
Smooth transitions into shift lock
Can I reconnect a disconnected .RenderStepped?
How to make my gun face in the direction of the camera?
How would I make an actually centered FPS ADS system?
How would I make an actually centered FPS ADS system?
Help rotating FakeArms weld to face a part
FakeArms rotation not working
How do I Stop Tools From Swaying When I Move?
How to the make camera keep players tool in frame
View Model/Fake Arms How to play animations
How do i make a gun sway
Start of and FPS. Where should I start?
What is the best way to make arms and weapon follow the camera without the use of viewmodels?
Fps viewmodel help
How to use CFrame.Angles()?
Help with logic behind a third person gun/tool script using raycasting
What technique to use for a gun
How do I make arms move with camera movement (that also animate)?
Help with approach to creating a proper FPS framework
How to connect tool to Fake Arms?
How to add aiming to my fps view model?
Animation not finishing
Can anyone link me resources that can help me learn how to create an FPS gun system?
How it the value of C1 computed in this FPS tutorial by EgoMoose? What's the thinking behind it?
Help with making ViewModels

Thanks!

If you open the dummy in the placefile it has the saved animations in there which you can export from there.

The one downside to animations is that Roblox doesn’t like users sharing them. As a result you’ll notice that if you load up the place I linked at the end of the post that the animations won’t load. As a result if you are going to use my exact animations then I’ve saved them in a dummy for use with the animation editor. You’ll have to load them in and export them to your own profile. If you do that remember to change the animation IDs.

32 Likes

This is great! Some day I’d love to make an FPS

40 Likes

This is awesome. It makes me wonder how cool it would be see a write up for every stage of production of a Roblox game. Maybe even a vlog series that goes through the key points and updates in order.

15 Likes

Great post! Always wondered how this was done.

8 Likes

I have had a friend message me and tell me they are struggling with viewing the images in this post.

Example:

image

Is anybody else having issue with this?

Edit: it’s happening to me now too… I’ll wait a bit to see if it fixes itself and if it doesn’t i’ll re-upload.
Edit 2: Alright, I updated the pictures again.

21 Likes

you used R15 for this is this same tutorial able to be used with R6? I’m guessing it is just thought I’d make sure. Thanks for this, this is something I was wanting to learn how to do, youtube wasn’t helping much

11 Likes

The same concepts would apply yes. You would need to adjust for the different joints in R6 and R15, but that’s about it.

13 Likes

This is amazing!
i’ll try to mix this with Xan_TheDragon’s FastCast Module!
i’ll surely share it when i finish :slight_smile:

8 Likes

Is there any way to make it so the first person is R15 but the third person is being R6?

5 Likes

Yes, just create the viewmodel as R15 and do everything to the character as an R6 model.

10 Likes

I’m sorry if this sounds like quite a dumb question, but would I have to animate the fake arms and real arms individually when I want to add a new animation (such as one for reloading)?

4 Likes

I think you have to, from my observation from the game Arsenal, they have 2 animations for fake arm and the character’s arm.

6 Likes

If you ever need to try and get a 1:1 animation cycle into a Roblox animation, I find that creating a singular rig with both separate ViewModels inside it works wonders. The added benefit is that if you animate in this way, you technically have both your ViewModel and WorldModel animation in a singular file.

5 Likes

I’ve been trying to animate the ViewModel but I haven’t got any idea how I could do this because when I animate the ViewModel the gun stays still could anyone help me?

4 Likes

@redduckxteen @xCurb making custom animations for viewmodels and enhancing them with these requires a different workflow, tho the ADS and the server side replication might be the same, most of the viewmodel setup would be different, in this case, the arms wouldn’t be attached to the weapon, the weapon will be attached to the arms using Motor6D-s they are the bones, the joints that allow for rigging and animating custom models, i put an animation controller that lets you animate them without humanoid properties (like forcing collision with the actual player), and yes they do require 2 different animations as what you see in FPS is usually very different as to what others see attached to the character, it’s possible to work with 1 animations but you’d need to play arround with camera offsets for each weapon for optimal results.

15 Likes

Thank you, this was very useful

4 Likes

Is there a way I can animate the tool in first person?
Currently when I play the reload animation it just does this:

com-video-to-gif%20(1)
The weapon is supposed to go off screen, like this:
com-video-to-gif
I am also playing the animation in the view model as well, and I have tried using a Motor6D, yet it doesn’t do anything.
@EgoMoose

Edit:
I figured out how to fix this issue incase anyone was wondering. It turns out that there is a Motor6D in the head which was putting the weapon in the correct position. This unfortunately does mean I have to remake the Animation to be rigged properly, but at least I figured it out.

14 Likes

How can i play the animation in the view model? Can anyone explain to me how can i add an animation on the view model, i’m trying to figure it out.

6 Likes

I would greatly appreciate it if you explain just a little more how you solved this, I know that there is a motor 6D, but how do i go about rigging the model properly now?
I’ve tried many things, and i already have an Animation Controller, all i need to know is how to rig the model.

4 Likes