2

I am making a script to be used on the Main Camera object of Unity3D so the camera follows the character in a 2D platformer world.

I tried to translate this from a UnityScript 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 UnityScript 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.

3 Answers 3

3

This error occurs because Transform.position is of a value type (probably a struct). This means that when you access the X property of position, you are accessing a COPY and NOT the real thing. To assign to the position property, you will need to create a new Vector3 and assign it to the position property. Your code will look something like this:

thisTransform.position = new Vector3 (Mathf.SmoothDamp (thisTransform.position.x, cameraTarget.transform.position.x, ref velocity.x, smoothTime), thisTransform.position.y, thisTransform.position.z); 

or perhaps more cleaner:

float tempX = new Vector3 (Mathf.SmoothDamp (thisTransform.position.x, cameraTarget.transform.position.x, ref velocity.x, smoothTime); thisTransform.position = new Vector3 (tempX, thisTransform.position.y, thisTransform.position.z); 
Sign up to request clarification or add additional context in comments.

Comments

1

You can also use this smooth follow script for both 2d and 3d camera and its very simple.

using UnityEngine; using System.Collections; public class FollowCamera : MonoBehaviour { public float interpVelocity; public float minDistance; public float followDistance; public GameObject target; public Vector3 offset; Vector3 targetPos; // Use this for initialization void Start () { targetPos = transform.position; } // Update is called once per frame void FixedUpdate () { if (target) { Vector3 posNoZ = transform.position; posNoZ.z = target.transform.position.z; Vector3 targetDirection = (target.transform.position - posNoZ); interpVelocity = targetDirection.magnitude * 5f; targetPos = transform.position + (targetDirection.normalized * interpVelocity * Time.deltaTime); transform.position = Vector3.Lerp( transform.position, targetPos + offset, 0.25f); } } } 

got it from github here https://gist.github.com/unity3diy/5aa0b098cb06b3ccbe47

2 Comments

It will be more fun if it works with my 3d camera too. let me check it .. by the way thanks :)
This is incorrect, FixedUpdate is for physics, you should have player movement updates in Update() and not FixedUpdate()
1

Use FixedUpdate()

If it's Update() the camera jerking will occur.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.