# Camera Head Bobbing Effect in Unity 3D

NSDG | Nov 13, 2019 | 0 Comments 128

Head Bobbing effect is widely used in First Person Shooters and plays a key role in increasing the player immersion. In this tutorial I will be showing how to create a head bobbing effect in Unity 3D.

### Step 1: Setting Up Player Controller

First we begin by creating a player controller:

• Create new Game Object (Game Object -> Create Empty) and name it "Player"
• Create new Capsule (Game Object -> 3D Object -> Capsule) and move it inside "Player" Object
• Remove Capsule Collider component from Capsule and change its position to (0, 1, 0)
• Move Main Camera inside "Player" Object and change its position to (0, 1.64, 0)
• Create a new script, name it "SC_CharacterController" and paste the code below inside it:

SC_CharacterController.cs

``````using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_CharacterController : MonoBehaviour
{
public float speed = 7.5f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;
public Camera playerCamera;
public float lookSpeed = 2.0f;
public float lookXLimit = 45.0f;

CharacterController characterController;
[HideInInspector]
public Vector3 moveDirection = Vector3.zero;
Vector2 rotation = Vector2.zero;

[HideInInspector]
public bool canMove = true;

void Start()
{
characterController = GetComponent<CharacterController>();
rotation.y = transform.eulerAngles.y;
}

void Update()
{
if (characterController.isGrounded)
{
// We are grounded, so recalculate move direction based on axes
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 right = transform.TransformDirection(Vector3.right);
float curSpeedX = canMove ? speed * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? speed * Input.GetAxis("Horizontal") : 0;
moveDirection = (forward * curSpeedX) + (right * curSpeedY);

if (Input.GetButton("Jump") && canMove)
{
moveDirection.y = jumpSpeed;
}
}

// Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
// when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
// as an acceleration (ms^-2)
moveDirection.y -= gravity * Time.deltaTime;

// Move the controller
characterController.Move(moveDirection * Time.deltaTime);

// Player and Camera rotation
if (canMove)
{
rotation.y += Input.GetAxis("Mouse X") * lookSpeed;
rotation.x += -Input.GetAxis("Mouse Y") * lookSpeed;
rotation.x = Mathf.Clamp(rotation.x, -lookXLimit, lookXLimit);
playerCamera.transform.localRotation = Quaternion.Euler(rotation.x, 0, 0);
transform.eulerAngles = new Vector2(0, rotation.y);
}
}
}``````
• Attach SC_CharacterController script to "Player" Object (You will notice that it also added another component called Character Controller, change its center value to (0, 1, 0))

The Player controller is now ready: Head Bobbing Effect is done with a help of a script and is working by moving the Camera Up and Down when the player is moving.

• Create new script, name it SC_HeadBobber and paste the code below inside it:

``````using UnityEngine;

{
public float walkingBobbingSpeed = 14f;
public float bobbingAmount = 0.05f;
public SC_CharacterController controller;

float defaultPosY = 0;
float timer = 0;

// Start is called before the first frame update
void Start()
{
defaultPosY = transform.localPosition.y;
}

// Update is called once per frame
void Update()
{
if(Mathf.Abs(controller.moveDirection.x) > 0.1f || Mathf.Abs(controller.moveDirection.z) > 0.1f)
{
//Player is moving
timer += Time.deltaTime * walkingBobbingSpeed;
transform.localPosition = new Vector3(transform.localPosition.x, defaultPosY + Mathf.Sin(timer) * bobbingAmount, transform.localPosition.z);
}
else
{
//Idle
timer = 0;
transform.localPosition = new Vector3(transform.localPosition.x, Mathf.Lerp(transform.localPosition.y, defaultPosY, Time.deltaTime * walkingBobbingSpeed), transform.localPosition.z);
}
}
}
``````
• Attach SC_HeadBobber script to Main Camera
• Assign SC_CharacterController script to "Controller" variable Finally press Play to test it, the Camera bobbing should be activated on player movement.

Search Blog