edx/assignment10final/Assets/ProCore/ProBuilder/API Examples/Icosphere FFT/Scripts/CameraControls.cs

77 lines
2.0 KiB
C#

/**
* Camera orbit controls.
*/
using UnityEngine;
using System.Collections;
namespace ProBuilder2.Examples
{
public class CameraControls : MonoBehaviour
{
const string INPUT_MOUSE_SCROLLWHEEL = "Mouse ScrollWheel";
const string INPUT_MOUSE_X = "Mouse X";
const string INPUT_MOUSE_Y = "Mouse Y";
const float MIN_CAM_DISTANCE = 10f;
const float MAX_CAM_DISTANCE = 40f;
// how fast the camera orbits
[Range(2f, 15f)]
public float orbitSpeed = 6f;
// how fast the camera zooms in and out
[Range(.3f,2f)]
public float zoomSpeed = .8f;
// the current distance from pivot point (locked to Vector3.zero)
float distance = 0f;
// how fast the idle camera movement is
public float idleRotation = 1f;
private Vector2 dir = new Vector2(.8f, .2f);
void Start()
{
distance = Vector3.Distance(transform.position, Vector3.zero);
}
void LateUpdate()
{
Vector3 eulerRotation = transform.localRotation.eulerAngles;
eulerRotation.z = 0f;
// orbits
if( Input.GetMouseButton(0) )
{
float rot_x = Input.GetAxis(INPUT_MOUSE_X);
float rot_y = -Input.GetAxis(INPUT_MOUSE_Y);
eulerRotation.x += rot_y * orbitSpeed;
eulerRotation.y += rot_x * orbitSpeed;
// idle direction is derived from last user input.
dir.x = rot_x;
dir.y = rot_y;
dir.Normalize();
}
else
{
eulerRotation.y += Time.deltaTime * idleRotation * dir.x;
eulerRotation.x += Time.deltaTime * Mathf.PerlinNoise(Time.time, 0f) * idleRotation * dir.y;
}
transform.localRotation = Quaternion.Euler( eulerRotation );
transform.position = transform.localRotation * (Vector3.forward * -distance);
if( Input.GetAxis(INPUT_MOUSE_SCROLLWHEEL) != 0f )
{
float delta = Input.GetAxis(INPUT_MOUSE_SCROLLWHEEL);
distance -= delta * (distance/MAX_CAM_DISTANCE) * (zoomSpeed * 1000) * Time.deltaTime;
distance = Mathf.Clamp(distance, MIN_CAM_DISTANCE, MAX_CAM_DISTANCE);
transform.position = transform.localRotation * (Vector3.forward * -distance);
}
}
}
}