MouseOrbitImproved

From Unify Community Wiki
(Difference between revisions)
Jump to: navigation, search
m (Added component menu decorator(of sorts))
(Code C#)
 
Line 98: Line 98:
 
     public float distanceMin = .5f;
 
     public float distanceMin = .5f;
 
     public float distanceMax = 15f;
 
     public float distanceMax = 15f;
 +
 +
    private Rigidbody rigidbody;
 
      
 
      
 
     float x = 0.0f;
 
     float x = 0.0f;
 
     float y = 0.0f;
 
     float y = 0.0f;
  
// Use this for initialization
+
    // Use this for initialization
void Start () {
+
    void Start ()  
 +
    {
 
         Vector3 angles = transform.eulerAngles;
 
         Vector3 angles = transform.eulerAngles;
 
         x = angles.y;
 
         x = angles.y;
 
         y = angles.x;
 
         y = angles.x;
 
+
       
 +
        rigidbody = GetComponent<Rigidbody>();
 +
       
 
         // Make the rigid body not change rotation
 
         // Make the rigid body not change rotation
         if (rigidbody)
+
         if (rigidbody != null)
 +
        {
 
             rigidbody.freezeRotation = true;
 
             rigidbody.freezeRotation = true;
}
+
        }
 +
    }
 
 
     void LateUpdate () {
+
     void LateUpdate ()  
     if (target) {
+
     {
         x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;
+
        if (target)  
        y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
+
         {
 +
            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);
 
   
 
   
        y = ClampAngle(y, yMinLimit, yMaxLimit);
+
            distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);
       
+
 
        Quaternion rotation = Quaternion.Euler(y, x, 0);
+
            RaycastHit hit;
+
            if (Physics.Linecast (target.position, transform.position, out hit))  
        distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);
+
            {
       
+
        RaycastHit hit;
+
        if (Physics.Linecast (target.position, transform.position, out hit)) {
+
 
                 distance -=  hit.distance;
 
                 distance -=  hit.distance;
 +
            }
 +
            Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
 +
            Vector3 position = rotation * negDistance + target.position;
 +
 +
            transform.rotation = rotation;
 +
            transform.position = position;
 
         }
 
         }
        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)
 
     public static float ClampAngle(float angle, float min, float max)
Line 146: Line 154:
 
         return Mathf.Clamp(angle, min, max);
 
         return Mathf.Clamp(angle, min, max);
 
     }
 
     }
 
 
 
}
 
}
  

Latest revision as of 09:11, 14 April 2015


Author: Veli V Author Boo: [highway900]

Contents

[edit] 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!

[edit] Code 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;
 
 
@script AddComponentMenu("Camera-Control/Mouse Orbit")
 
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 (target.position, transform.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);
}

[edit] Code C#

using UnityEngine;
using System.Collections;
 
[AddComponentMenu("Camera-Control/Mouse Orbit with zoom")]
public class MouseOrbitImproved : MonoBehaviour {
 
    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;
 
    private Rigidbody rigidbody;
 
    float x = 0.0f;
    float y = 0.0f;
 
    // Use this for initialization
    void Start () 
    {
        Vector3 angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
 
        rigidbody = GetComponent<Rigidbody>();
 
        // Make the rigid body not change rotation
        if (rigidbody != null)
        {
            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 (target.position, transform.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);
    }
}

[edit] Code Boo

import UnityEngine
 
[AddComponentMenu("Camera-Control/Mouse Orbit")]
class MouseOribitImproved (MonoBehaviour): 
 
    public target as Transform
    public distance as single = 5.0
    public xSpeed as single = 120.0
    public ySpeed as single= 120.0
 
    public yMinLimit as single = -80.0
    public yMaxLimit as single = 120.0
 
    public distanceMin as single = 0.5
    public distanceMax as single = 15.0
 
    private x as single  = 0.0
    private y as single  = 0.0
 
    def Start ():
        angles as Vector3 = transform.eulerAngles
        x = angles.y
        y = angles.x
 
        // Make the rigid body not change rotation
        if (rigidbody):
            rigidbody.freezeRotation = true
 
    def LateUpdate ():
 
        if Input.GetMouseButton(2):
            x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f
            y -= Input.GetAxis("Mouse Y") * ySpeed * distance * 0.02f
 
        if target:
            y = ClampAngle(y, yMinLimit, yMaxLimit)
 
            rotation as Quaternion = Quaternion.Euler(y, x, 0)
 
            distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax)
 
            negDistance as Vector3 = Vector3(0.0f, 0.0f, -distance)
            position as Vector3 = rotation * negDistance + target.position
 
            transform.rotation = rotation
            transform.position = position
 
    def ClampAngle(angle as single, min as single, max as single):
        if (angle < -360.0f):
            angle += 360.0f
        if (angle > 360.0f):
            angle -= 360f
        return Mathf.Clamp(angle, min, max)
Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox