- Home /
Mouse orbit.
I wrote this in C# its a simple mouse orbit, I am lost right now. What I need to do move the camera from its spot to its new target with right click. The only thing is my script wont update until i mouse down (0) So it wont focus on the new target until the camera moves.
If you can help me with this I would apreacheate it.
using UnityEngine;
using System.Collections;
public class MouseOrbit : MonoBehaviour
{
public KeyCode UserOrbitButton;
public Transform target;
public float distance = 10.0f;
public float xSpeed = 250.0f;
public float ySpeed = 120.0f;
public float yMinLimit = -90;
public float yMaxLimit = 90;
private float x = 0.0f;
private float y = 0.0f;
public Ray ray;
void Start()
{
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
// Make the rigid body not change rotation
if (rigidbody)
rigidbody.freezeRotation = true;
}
void Update()
{
if (target && Input.GetMouseButton(0))
{
x += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime;
y -= Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime;
y = ClampAngle(y, yMinLimit, yMaxLimit);
transform.rotation = Quaternion.Euler(y, x, 0);
transform.position = (Quaternion.Euler(y, x, 0)) * new Vector3(0.0f, 0.0f, -distance) + target.position;
}
if (target && Input.GetMouseButton(1))
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 2000))
{
target = hit.transform;
}
}
}
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);
}
}
I am just replying to this comment because I have this exact same problem too.
Answer by AlucardJay · Feb 23, 2013 at 06:40 AM
The only thing is my script wont update until i mouse down (0) : Look at your code ....
if (target && Input.GetMouseButton(0))
change this if you want the camera to update all the time.
You may need to organize your logic better too :
void Update()
{
if (target)
{
if (Input.GetMouseButton(1))
{
// Get new target
}
else
{
// Move the camera normally with current target
}
}
}
I am curious if there is a way to add specific starting points to the script? For example, I have an animated character that generally stays in one spot and I use the mouse orbit script to 360 view and zoom but I would also like to be able to set buttons or keyboard triggers that move the camera to side view, top view, back view, etc. and then either stay there or be able to continue orbiting as needed. Thoughts?
Answer by deadshot · Oct 17, 2014 at 09:43 AM
using UnityEngine; using System.Collections;
public class rotateonmouse : MonoBehaviour { public float speed = 5.0f; public Transform target ; public float Distance = 5.0f; public float xSpeed = 250.0f; public float ySpeed = 120.0f; public float yMinLimit = -20.0f; public float yMaxLimit = 80.0f;
private float x;
private float y;
void Awake()
{
Vector3 angles = transform.eulerAngles;
x = angles.x;
y = angles.y;
if(GetComponent<Rigidbody>() != null)
{
rigidbody.freezeRotation = true;
}
}
void LateUpdate()
{
if (Input.GetMouseButton(1)) {
transform.LookAt(target);
transform.RotateAround(target.position, Vector3.up, Input.GetAxis("Mouse X")*speed);
if(target != null)
{
x += (float)(Input.GetAxis("Mouse X") * xSpeed * 0.02f);
y -= (float)(Input.GetAxis("Mouse Y") * ySpeed * 0.02f);
y = ClampAngle(y, yMinLimit, yMaxLimit);
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;
}
}
}
private float ClampAngle(float angle, float min, float max)
{
if(angle < -360)
{
angle += 360;
}
if(angle > 360)
{
angle -= 360;
}
return Mathf.Clamp (angle, min, max);
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
} }