Js to c# conversion

I’m trying to convert an old camera script from JS to C# but I’m duing something wrong as the camera behaves very strange. Anyone that can help me fix it?

The scripts can be tested by attach it to a Camera and setting the target transfrom to a sphere or something like that (it will be used as a rotation point).

The JS version:

// Attach this to a Camera and it will be controlled using the following input
//
// W: Move camera forward
// S: Move camera backwards
// A: Strafe camera to the left
// D: Strafe camera to the right
//
// Mouse scroll wheel: Zoom in and out
//
// While pressing Shift and moving the mouse: rotate and pan the camera around the target

var target : Transform; // Is used as a rotation point
var distance = 25;

var xSpeed = 450.0;
var ySpeed = 220.0;

var yMinLimit = 30;
var yMaxLimit = 89;

private var x = 0.0;
private var y = 0.0;

var maxDist : float = 50;
var minDist : float = 5;
var zoomSpeed : float = 2;

var speed : float = 50.0;
var modifier : float=1.0;

// Add this script so that it can be accessed from the Unity3d editor
// It will be under the Component menu
@AddComponentMenu("Camera-Control/Mouse Orbit")
partial class MouseOrbit { }

function Start () 
{
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;

    // Make the rigid body not change rotation
    if (rigidbody)
        rigidbody.freezeRotation = true;
}

function LateUpdate () 
{
    if (target) 
	{
		
		// Mouse pan
		if(Input.GetKey (KeyCode.LeftShift))
		{
			x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
			y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
		}

		y = ClampAngle(y, yMinLimit, yMaxLimit);
		
		// Update target rotation
		target.rotation = Quaternion.Euler(0.0, x, 0.0) ;
		
		// Update camera target position
		// Move forward and backward 
		var forward = target.forward * modifier * Time.deltaTime * speed * Input.GetAxis("Vertical");
		target.position+=forward;
		
		// Strafe right and left
		var right = target.right * modifier * Time.deltaTime * speed * Input.GetAxis("Horizontal");
		target.position+=right;
		
		//var up = Vector3.up * modifier * Time.deltaTime * speed;
		//target.position+=up;
		
		// Zoom in and out
		if (Input.GetAxis("Mouse ScrollWheel") < 0 && distance < maxDist)
		{
			distance += zoomSpeed;                             
			transform.Translate(Vector3.forward * -zoomSpeed); 
		}
		else if (Input.GetAxis("Mouse ScrollWheel") > 0 && distance > minDist)
		{
			distance -= zoomSpeed;                             
			transform.Translate(Vector3.forward * zoomSpeed); 
		}	
		
		// Restrict the target y position to the height of the terrain at the current target position
		target.position.y  = Terrain.activeTerrain.SampleHeight(target.position) + 1;
	
		// Update camera position	
		var rotation = Quaternion.Euler(y, x, 0);
		var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;

		transform.rotation = rotation;
		transform.position = position;
		
		// Restrict the camera y position to the height of the terrain at the current camera position if the camera would be under the ground
		if(transform.position.y <= Terrain.activeTerrain.SampleHeight(transform.position) + 5)
			transform.position.y  = Terrain.activeTerrain.SampleHeight(transform.position) + 5;
    }
}

// Make sure the angle dosn't excede 0 - 360 degrees
static function ClampAngle (angle : float, min : float, max : float) 
{
    if (angle < -360)
        angle += 360;
    if (angle > 360)
        angle -= 360;
    return Mathf.Clamp (angle, min, max);
}

The C# version (that dont’t work):

using UnityEngine;
using System.Collections;

// Add this script so that it can be accessed from the Unity3d editor
// It will be under the Component menu
[AddComponentMenu("Transform/Follow Transform")]
public class MouseOrbit : MonoBehaviour 
{
	// Attach this to a Camera and it will be controlled using the following input
	//
	// W: Move camera forward
	// S: Move camera backwards
	// A: Strafe camera to the left
	// D: Strafe camera to the right
	//
	// Mouse scroll wheel: Zoom in and out
	//
	// While pressing Shift and moving the mouse: rotate and pan the camera around the target
	
	public Transform target; // Is used as a rotation point
	public float distance= 25f;
	
	public float xSpeed= 450.0f;
	public float ySpeed= 220.0f;
	
	public float yMinLimit= 30;
	public float yMaxLimit= 89;
	
	private float x= 0.0f;
	private float y= 0.0f;
	
	public float maxDist = 20;
	public float minDist = 5;
	public float zoomSpeed = 2;
	
	public float speed = 50.0f;
	public float modifier = 1.0f;
	
	void Start ()
	{
	    Vector3 angles= transform.eulerAngles;
	    x = angles.y;
	    y = angles.x;
	
	    // Make the rigid body not change rotation
	    if (rigidbody)
	        rigidbody.freezeRotation = true;
	}
	
	void LateUpdate()
	{
	    if (target) 
		{
			// Mouse pan
			if(Input.GetKey (KeyCode.LeftShift))
			{
				x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
				y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
			}
	
			y = ClampAngle(y, yMinLimit, yMaxLimit);
			
			// Update target rotation
			target.rotation = Quaternion.Euler(0.0f, x, 0.0f) ;
			
			// Update camera target position
			// Move forward and backward 
			Vector3 forward = target.forward * modifier * Time.deltaTime * speed * Input.GetAxis("Vertical");
			target.position += forward;
			
			// Strafe right and left
			Vector3 right = target.right * modifier * Time.deltaTime * speed * Input.GetAxis("Horizontal");
			target.position += right;
			
			//FIXME_VAR_TYPE up= Vector3.up * modifier * Time.deltaTime * speed;
			//target.position+=up;
			
			// Zoom in and out
			if (Input.GetAxis("Mouse ScrollWheel") < 0 && distance < maxDist)
			{
				distance += zoomSpeed;                             
				transform.Translate(Vector3.forward * -zoomSpeed); 
			}
			else if (Input.GetAxis("Mouse ScrollWheel") > 0 && distance > minDist)
			{
				distance -= zoomSpeed;                             
				transform.Translate(Vector3.forward * zoomSpeed); 
			}	
			
			// Restrict the target y position to the height of the terrain at the current target position
			Vector3 pos = target.position;
			
			pos.y = Terrain.activeTerrain.SampleHeight(target.position) + 1;
			target.position = pos;
		
			// Update camera position	
			Quaternion rotation = Quaternion.Euler(y, x, 0);
			
			Vector3 position = rotation * (new Vector3(0.0f, 0.0f, -distance) + target.position);
			
			transform.rotation = rotation;
			transform.position = position;
			
			// Restrict the camera y position to the height of the terrain at the current camera position if the camera would be under the ground
			pos = target.position;
			if(pos.y <= Terrain.activeTerrain.SampleHeight(transform.position) + 5)
				pos.y  = Terrain.activeTerrain.SampleHeight(transform.position) + 5;
			
			target.position = pos;
	    }
	}
	

	//public static Vector3 r operator +(Vector3 a, Vector3 a)
	//{
//   		return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
//	} 

	
	// Make sure the angle dosn't excede 0 - 360 degrees
	static float ClampAngle (float angle, float min, float max)
	{
	    if (angle < -360)
	        angle += 360;
		
	    if (angle > 360)
	        angle -= 360;
		
	    return Mathf.Clamp (angle, min, max);
	}
}

Have you tried this? It may help fix it. Convert unity javascript (unityscript) to C#