using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(Image))]
public class CameraRotator : UIBehaviour, IDragHandler
{
public Transform cameraTransform;
public Transform target;
[Header("Position")]
public float distanceMin = 10;
public float distanceMax = 30;
public float yOffset;
public float scrollSensitivityPC = 1000;
public float scrollSensitivity = 1;
public float scrollSmoothing = 10;
[Header("Rotation")]
public float tiltMin = -85;
public float tiltMax = 85;
public float rotationSensitivity = 0.5f;
public float rotationSpeed = 20;
[Header("Zoom")]
private float TwoTouchOldDist;
private float TwoTouchNewDist;
private float OldAndNewTouchDistDelta;
private float ZoomMoveSpeed;
public float ZoomSpeed = 1;
private float distance;
private float scrollDistance;
private float velocity;
private float lookAngle = 45;
private float tiltAngle;
private Quaternion rotation;
protected override void Awake()
{
base.Awake();
tiltAngle = 30;
distance = scrollDistance = (distanceMax + distanceMin) / 2;
if (cameraTransform == null || target == null) return;
cameraTransform.rotation = rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
cameraTransform.position = CalculateCameraPosition();
}
public void ChangeTarget(Transform Island)
{
target = Island;
base.Awake();
tiltAngle = 30;
distance = scrollDistance = (distanceMax + distanceMin) / 2;
if (cameraTransform == null || target == null) return;
cameraTransform.rotation = rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
cameraTransform.position = CalculateCameraPosition();
}
void Update()
{
if (Input.touchCount == 2)
{
if(Input.GetTouch(1).phase == TouchPhase.Began)
{
TwoTouchOldDist = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
}
if(Input.GetTouch(1).phase == TouchPhase.Moved)
{
TwoTouchNewDist = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
OldAndNewTouchDistDelta = TwoTouchNewDist - TwoTouchOldDist;
TwoTouchOldDist = TwoTouchNewDist;
ZoomMoveSpeed = cameraTransform.position.z + (OldAndNewTouchDistDelta * ZoomSpeed);
cameraTransform.localPosition = new Vector3(0, 0, Mathf.Clamp(ZoomMoveSpeed, distanceMin, distanceMax));
}
}
}
private void LateUpdate()
{
if (cameraTransform == null || target == null) return;
if (cameraTransform.rotation != rotation)
{
cameraTransform.rotation = Quaternion.Lerp(cameraTransform.rotation, rotation,
Time.deltaTime * rotationSpeed);
}
float scroll = Input.GetAxis("Mouse ScrollWheel");
if (scroll != 0)
{
scrollDistance -= scroll * Time.deltaTime * scrollSensitivityPC;
scrollDistance = Mathf.Clamp(scrollDistance, distanceMin, distanceMax);
}
if (distance != scrollDistance)
{
distance = Mathf.SmoothDamp(distance, scrollDistance, ref velocity, Time.deltaTime * scrollSmoothing);
}
cameraTransform.position = CalculateCameraPosition();
}
public void OnDrag(PointerEventData eventData)
{
if (Input.touchCount < 2)
{
if (cameraTransform == null || target == null) return;
lookAngle += eventData.delta.x * rotationSensitivity;
tiltAngle -= eventData.delta.y * rotationSensitivity;
tiltAngle = Mathf.Clamp(tiltAngle, tiltMin, tiltMax);
rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
}
}
private Vector3 CalculateCameraPosition()
{
return target.position + cameraTransform.rotation * (Vector3.back * distance) + Vector3.up * yOffset;
}
}