I'm attempting to set the camera position in Unity through code. I have a simple 2D game and there's not much programming so far. I've attached a script to the camera, and in that script I've added this function:

  void Update()
    Transform transform = gameObject.GetComponent<Transform>();
    Vector3 position = transform.position;
    transform.position.Set(position.x + 1, position.y + 1, position.z);

My expectation is that this would create a smooth scrolling toward the bottom right corner. However, after checking via breakpoints, the transform.position always reports (0, 0, -10), even after setting it. The camera object is a stand alone and not a child of anything else in the scene. Am I setting the position wrong or getting the camera's GameObject wrong?

I've also tried:

  • transform.SetPosition(); - doesn't exist
  • transform.SetPositionAndRotation(); - no effect
  • transform.position.x = 0; - not allowed
  • transform.position = new Vector3(position.x + 1, position.y + 1, position.z) - no effect
  • 1
    \$\begingroup\$ Have you tried not to create a local variable called transform but use transform directly? \$\endgroup\$
    – Zibelas
    Jan 17 at 14:39

2 Answers 2


There are several misconceptions here.

First off, every Component and GameObject already has a pre-cached transform, property, so you never have to write GetComponent<Transform>(). Deleting this line changes nothing, since all it does is shadow the existing transform property that gives the same value:

Transform transform = gameObject.GetComponent<Transform>();

Next, transform.position is a getter/setter property. When you read or write to it, you're really calling a function. The getter you call on a read...

  1. Takes the transform's internally stored local position...

  2. Gets the corresponding world position by transforming it by any transformations higher up in the hierarchy...

  3. Returns to you a copy of that value.

Calling position.Set() on a copy of the data does not make the change propagate back to the original transform: it has no idea you changed anything, because you didn't ask it to change.

Thirdly, you never want to add a constant offset to a position in Update(), because that function is called at a variable framerate. To get smooth motion, you should scale the movement by the amount of time elapsed since the previous Update() frame.

Lastly, moving +1 in y is moving up, not down, in Unity's coordinate system. If you want to move down, decrease y.

Putting these together:

public float movementSpeed = 1f;

void Update() {
    Vector3 position = transform.position;
    Vector3 shift = new Vector3(1, -1, 0) * movementSpeed * Time.deltaTime;
    transform.position = position + shift;

    // Or, as another answer notes,
    // transform.Translate(shift, Space.World)
    // accomplishes the same thing.

Try: transform.Translate(movement_dir) where movement_dir is a vector you can define outside of Update if it's going to be a constant.

However you might want to multiply movement_dir by Time.deltaTime, otherwise it might not be as smooth as you'd like due to variations in FPS

see this


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .