# 2D Platformer Camera [Solved]

I’m using the camera script from the Unity Projects: 2D Platformer Asset package as a frame work for my camera however when I start the game the camera does not follow the player and returns an error:

NullReferenceException: Object reference not set to an instance of an object CameraFollow.Awake () (at Assets/Scripts/CameraFollow.cs:20)

which if I’m reading it right is referencing line 20

``````player = GameObject.FindGameObjectWithTag("Player").transform;
``````

However I’ve changed the player’s tag to Player and have even tried creating a new tag and editing the script to match the new tag with no change in behavior. Can anyone point me in the right direction to get this working?

Full Camera Script
using UnityEngine;
using System.Collections;

``````public class CameraFollow : MonoBehaviour
{
public float xMargin = 1f;		// Distance in the x axis the player can move before the camera follows.
public float yMargin = 1f;		// Distance in the y axis the player can move before the camera follows.
public float xSmooth = 8f;		// How smoothly the camera catches up with it's target movement in the x axis.
public float ySmooth = 8f;		// How smoothly the camera catches up with it's target movement in the y axis.
public Vector2 maxXAndY;		// The maximum x and y coordinates the camera can have.
public Vector2 minXAndY;		// The minimum x and y coordinates the camera can have.

private Transform player;		// Reference to the player's transform.

void Awake ()
{
// Setting up the reference.
player = GameObject.FindGameObjectWithTag("Player").transform;
}

bool CheckXMargin()
{
// Returns true if the distance between the camera and the player in the x axis is greater than the x margin.
return Mathf.Abs(transform.position.x - player.position.x) > xMargin;
}

bool CheckYMargin()
{
// Returns true if the distance between the camera and the player in the y axis is greater than the y margin.
return Mathf.Abs(transform.position.y - player.position.y) > yMargin;
}

void FixedUpdate ()
{
TrackPlayer();
}

void TrackPlayer ()
{
// By default the target x and y coordinates of the camera are it's current x and y coordinates.
float targetX = transform.position.x;
float targetY = transform.position.y;

// If the player has moved beyond the x margin...
if(CheckXMargin())
// ... the target x coordinate should be a Lerp between the camera's current x position and the player's current x position.
targetX = Mathf.Lerp(transform.position.x, player.position.x, xSmooth * Time.deltaTime);

// If the player has moved beyond the y margin...
if(CheckYMargin())
// ... the target y coordinate should be a Lerp between the camera's current y position and the player's current y position.
targetY = Mathf.Lerp(transform.position.y, player.position.y, ySmooth * Time.deltaTime);

// The target x and y coordinates should not be larger than the maximum or smaller than the minimum.
targetX = Mathf.Clamp(targetX, minXAndY.x, maxXAndY.x);
targetY = Mathf.Clamp(targetY, minXAndY.y, maxXAndY.y);

// Set the camera's position to the target position with the same z component.
transform.position = new Vector3(targetX, targetY, transform.position.z);
}
}
``````

To get the camera to follow the player the Max X and Y and the Min X and Y must be set, they cannot be left at 0.

And TrackUpdate move to LateUpdate() block