[TASK] Added content + camera controller
This commit is contained in:
110
Assets/PlayerCameraController.cs
Normal file
110
Assets/PlayerCameraController.cs
Normal file
@@ -0,0 +1,110 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user