- Home /
Smooth Top Down Camera (2D)
Hello,
I'm trying to make a camera that is fixed on the player until the player reaches a certain boundary... then the camera stops following.
I have everything working as it should... except that my player shakes as the camera moves. It's almost like he's running into an invisible wall;
However, when he gets close to the maps edge (camera stops) he looks fine. I'm using the camera follow script from the Unity 2D demo.
I don't really want the delay... but when i remove it, the jerkyness gets worse.
I have interpolate selected on the player's rigidbody as well
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);
}
}
I made the stuttering much better by changing FixedUpdate to LateUpdate, and $$anonymous$$athf.Lerp to $$anonymous$$athf.SmoothStep.
If there is a better solution I'd love to hear it.
I think the problem might be the player movement. Are you using rigidbody.AddForce or transform.Translate
@BattleBooski Did you get rid of that stuttering problem?
@Vickylance Sorry I don't, I ended up switching platforms and going in a different direction... but I did get it perfectly working at one point. So keep trying and you'll figure it out soon enough!!!
Your answer
Follow this Question
Related Questions
Rigidbody 2D loosing velocity 0 Answers
2D collider wont work 1 Answer
Tiling sprite tiles only diagonally 1 Answer
2D Game: Best way to set player's Z? 1 Answer
Which Camera Rotation is Good While Making 2D Game? 0 Answers