Files
badeend-go/Assets/PlayerCameraController.cs

110 lines
3.9 KiB
C#

using UnityEngine;
public class PlayerCameraController : MonoBehaviour
{
public Transform target;
public float distance = 50.0f;
public float xSpeed = 1.0f;
public float ySpeed = 20.0f;
public float yMinLimit = 5;
public float yMaxLimit = 1300f;
public float zoomSpeedDesktop = 20f;
public float zoomSpeedMobile = 20f;
public float distanceMin = 10f;
public float distanceMax = 150f;
public float smoothTime = 2f;
float rotationYAxis = 0.0f;
float rotationXAxis = 0.0f;
float velocityX = 0.0f;
float velocityY = 0.0f;
// Use this for initialization
void Start()
{
Vector3 angles = transform.eulerAngles;
rotationYAxis = angles.y;
rotationXAxis = angles.x;
// Make the rigid body not change rotation
if (GetComponent<Rigidbody>())
{
GetComponent<Rigidbody>().freezeRotation = true;
}
}
void LateUpdate()
{
if (target)
{
if (Input.GetMouseButton(0))
{
velocityX = xSpeed * Input.GetAxis("Mouse X") * distance * 0.02f;
velocityY = ySpeed * Input.GetAxis("Mouse Y") * 0.02f;
}
rotationYAxis += velocityX;
rotationXAxis -= velocityY;
rotationXAxis = ClampAngle(rotationXAxis, yMinLimit, yMaxLimit);
//Quaternion fromRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 0);
Quaternion toRotation = Quaternion.Euler(rotationXAxis, rotationYAxis, 0);
Quaternion rotation = toRotation;
distance = Mathf.Clamp(distance - GetZoomAmount(), 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;
velocityX = Mathf.Lerp(velocityX, 0, Time.deltaTime * smoothTime);
velocityY = Mathf.Lerp(velocityY, 0, Time.deltaTime * smoothTime);
}
}
private float GetZoomAmount()
{
// If this is a handheld, use pinch to zoom
if (SystemInfo.deviceType == DeviceType.Handheld)
{
// If there are two touches on the device...
if (Input.touchCount == 2)
{
// Store both touches.
Touch touchZero = Input.GetTouch(0);
Touch touchOne = Input.GetTouch(1);
// Find the position in the previous frame of each touch.
Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;
// Find the magnitude of the vector (the distance) between the touches in each frame.
float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;
// Find the difference in the distances between each frame.
return (prevTouchDeltaMag - touchDeltaMag) * zoomSpeedMobile;
}
else
{
return 0;
}
}
else
{
// Otherwise, we use the scrollwheel for zooming
return Input.GetAxis("Mouse ScrollWheel") * zoomSpeedDesktop;
}
}
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);
}
}