# MouseOrbitImproved

Author: Veli V

## Description

Improved version of the original MouseOrbit script. Zooms with the mousewheel and uses linecast to make sure that object isn't behind anything.

Feel free to improve it further!

## Code Javascript

<javascript> var target : Transform; var distance = 10.0;

var xSpeed = 250.0; var ySpeed = 120.0;

var yMinLimit = -20; var yMaxLimit = 80;

var distanceMin = 3; var distanceMax = 15;

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

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) {
x += Input.GetAxis("Mouse X") * xSpeed * distance* 0.02;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;

y = ClampAngle(y, yMinLimit, yMaxLimit);
```

var rotation = Quaternion.Euler(y, x, 0);

distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);

var hit : RaycastHit; if (Physics.Linecast (transform.position, target.position, hit)) { distance -= hit.distance; }

```       var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;

transform.rotation = rotation;
transform.position = position;
```

}

}

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); } </javascript>

## Code C#

<csharp>

using UnityEngine; using System.Collections;

```   public Transform target;
public float distance = 5.0f;
public float xSpeed = 120.0f;
public float ySpeed = 120.0f;
```
```   public float yMinLimit = -20f;
public float yMaxLimit = 80f;

public float distanceMin = .5f;
public float distanceMax = 15f;

float x = 0.0f;
float y = 0.0f;
```

// Use this for initialization 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) {
x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

y = ClampAngle(y, yMinLimit, yMaxLimit);

Quaternion rotation = Quaternion.Euler(y, x, 0);

distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);

RaycastHit hit;
if (Physics.Linecast (transform.position, target.position, out hit)) {
distance -=  hit.distance;
}
Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
Vector3 position = rotation * negDistance + target.position;

transform.rotation = rotation;
transform.position = position;

}
```

}

```   public static float ClampAngle(float angle, float min, float max)
{
if (angle < -360F)
angle += 360F;
if (angle > 360F)
angle -= 360F;
return Mathf.Clamp(angle, min, max);
}
```

}

</csharp>