- Home /
Camera Smooth Follow 2D from JS to C#
I am making a script to be used on the Main Camera object so the camera follows the character in a 2D platformer world.
I tried to translate this from a Javascript script to c#, I am getting an error in line 26: "Cannot modify a value type return value of 'UnityEngine.Transform.position'. Consider storing the value in a temporary variable."
Original Javascript Version
var cameraTarget : GameObject;
var player : GameObject;
var smoothTime : float = 0,1;
var cameraFollowX : boolean = true;
var cameraFollowY : boolean = true;
var cameraFollowHeight : boolean = false;
var cameraHeight : float = 2.5;
var velocity : Vector2;
private var thisTransform : Transform;
function Start ()
{
thisTransform = transform;
}
function Update ()
{
if (cameraFollowX)
{
thisTransform.position.x = Mathf.SmoothDamp (thisTransform.position.x, cameraTarget.transform.position.x, velocity.x, smoothTime);
}
if (cameraFollowY)
{
thisTransform.position.y = Mathf.SmoothDamp (thisTransform.position.y, cameraTarget.transform.position.y, velocity.y, smoothTime);
}
if (!cameraFollowX & cameraFollowHeight)
{
camera.transform.position.y = cameraHeight;
}
}
My C# Version
using UnityEngine;
using System.Collections;
public class CameraSmoothFollow : MonoBehaviour {
public GameObject cameraTarget; // object to look at or follow
public GameObject player; // player object for moving
public float smoothTime = 0.1f; // time for dampen
public bool cameraFollowX = true; // camera follows on horizontal
public bool cameraFollowY = true; // camera follows on vertical
public bool cameraFollowHeight = true; // camera follow CameraTarget object height
public float cameraHeight = 2.5f; // height of camera adjustable
public Vector2 velocity; // speed of camera movement
private Transform thisTransform; // camera Transform
// Use this for initialization
void Start () {
thisTransform = transform;
}
// Update is called once per frame
void Update () {
if (cameraFollowX){
thisTransform.position.x = Mathf.SmoothDamp (thisTransform.position.x, cameraTarget.transform.position.x, ref velocity.x, smoothTime); // Here i get the error
}
if (cameraFollowY) {
// to do
}
if (!cameraFollowX & cameraFollowHeight) {
// to do
}
}
}
Any help will be appreciated.
Answer by Jona-Marklund · Aug 28, 2013 at 01:05 AM
Hello,
using UnityEngine;
using System.Collections;
public class CameraSmoothFollow : MonoBehaviour
{
public GameObject cameraTarget; // object to look at or follow
public GameObject player; // player object for moving
public float smoothTime = 0.1f; // time for dampen
public bool cameraFollowX = true; // camera follows on horizontal
public bool cameraFollowY = true; // camera follows on vertical
public bool cameraFollowHeight = true; // camera follow CameraTarget object height
public float cameraHeight = 2.5f; // height of camera adjustable
public Vector2 velocity; // speed of camera movement
private Transform thisTransform; // camera Transform
// Use this for initialization
void Start()
{
thisTransform = transform;
}
// Update is called once per frame
void Update()
{
if (cameraFollowX)
{
thisTransform.position = new Vector3(Mathf.SmoothDamp(thisTransform.position.x, cameraTarget.transform.position.x, ref velocity.x, smoothTime), thisTransform.position.y, thisTransform.position.z);
}
if (cameraFollowY)
{
// to do
}
if (!cameraFollowX & cameraFollowHeight)
{
// to do
}
}
}
JS does some under the hood magic which C# doesn't.
Answer by itos · Sep 02, 2013 at 11:28 PM
Thanks! Researching a little further I learn that Transform.position
is a struct and when I was trying to access the X property of position I was trying to access the copy and not the real one. This change have fixed my problem and now the camera scrolls with the player as a target.
Your answer
![](https://koobas.hobune.stream/wayback/20220613113114im_/https://answers.unity.com/themes/thub/images/avi.jpg)