157 lines
4.1 KiB
C#
157 lines
4.1 KiB
C#
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
|
|
public class MouseFollowRotation : MonoBehaviour
|
|
{
|
|
public Transform target;
|
|
public float xSpeed = 200;
|
|
public float ySpeed = 200;
|
|
public float mSpeed = 10;
|
|
public float moveSpeed = 30f;
|
|
public float dragPanSpeed = 1f;
|
|
public float yMinLimit = -50;
|
|
public float yMaxLimit = 50;
|
|
public float xPosMinLimit = -20;
|
|
public float xPosMaxLimit = 20;
|
|
public float zPosMinLimit = -20;
|
|
public float zPosMaxLimit = 20;
|
|
public float distance = 2;
|
|
public float minDistance = 2;
|
|
public float maxDistance = 30;
|
|
|
|
private bool dragPanMoveActive;
|
|
private Vector2 lastMousePosition;
|
|
public bool OnUI = false;
|
|
public bool OnOffUI = false;
|
|
public bool move = false;
|
|
|
|
public bool needDamping = false;
|
|
float damping = 5.0f;
|
|
|
|
public float x = 0.0f;
|
|
public float y = 0.0f;
|
|
|
|
// Use this for initialization
|
|
void Start()
|
|
{
|
|
Vector3 angles = transform.eulerAngles;
|
|
x = angles.y;
|
|
y = angles.x;
|
|
|
|
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void LateUpdate()
|
|
{
|
|
|
|
onoffUI();
|
|
/* if (EventSystem.current.IsPointerOverGameObject())
|
|
{
|
|
OnUI = true;
|
|
|
|
}
|
|
else
|
|
{
|
|
OnUI = false;
|
|
if (move == true)
|
|
{
|
|
MovementView();
|
|
}
|
|
Rotate();
|
|
}*/
|
|
}
|
|
|
|
void onoffUI()
|
|
{
|
|
if (EventSystem.current.IsPointerOverGameObject() && OnOffUI)
|
|
{
|
|
OnUI = true;
|
|
|
|
}
|
|
else
|
|
{
|
|
OnUI = false;
|
|
if (move == true)
|
|
{
|
|
MovementView();
|
|
}
|
|
Rotate();
|
|
}
|
|
}
|
|
void Rotate()
|
|
{
|
|
if (target)
|
|
{
|
|
//use the light button of mouse to rotate the camera
|
|
if (Input.GetMouseButton(1))
|
|
{
|
|
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
|
|
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
|
|
|
|
y = ClampAngle(y, yMinLimit, yMaxLimit);
|
|
}
|
|
distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;
|
|
distance = Mathf.Clamp(distance, minDistance, maxDistance);
|
|
Quaternion rotation = Quaternion.Euler(y, x, 0.0f);
|
|
Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
|
|
Vector3 position = rotation * disVector + target.position;
|
|
//adjust the camera
|
|
if (needDamping)
|
|
{
|
|
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
|
|
transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
|
|
}
|
|
else
|
|
{
|
|
transform.rotation = rotation;
|
|
transform.position = position;
|
|
target.rotation = rotation;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void MovementView()
|
|
{
|
|
Vector3 inputDir = new Vector3(0, 0, 0);
|
|
|
|
if (Input.GetMouseButtonDown(0))
|
|
{
|
|
dragPanMoveActive = true;
|
|
lastMousePosition = Input.mousePosition;
|
|
}
|
|
if (Input.GetMouseButtonUp(0))
|
|
{
|
|
dragPanMoveActive = false;
|
|
}
|
|
|
|
if (dragPanMoveActive)
|
|
{
|
|
Vector2 mouseMovementDelta = (Vector2)Input.mousePosition - lastMousePosition;
|
|
|
|
// float dragPanSpeed = 1f;
|
|
inputDir.x = mouseMovementDelta.x * dragPanSpeed;
|
|
inputDir.z = mouseMovementDelta.y * dragPanSpeed;
|
|
|
|
lastMousePosition = Input.mousePosition;
|
|
}
|
|
|
|
Vector3 moveDir = target.forward * -inputDir.z + target.right * -inputDir.x;
|
|
|
|
target.position += moveDir * moveSpeed * Time.deltaTime;
|
|
target.position = new Vector3(Mathf.Clamp(target.position.x, xPosMinLimit, xPosMaxLimit), 0, Mathf.Clamp(target.position.z, zPosMinLimit, zPosMaxLimit));
|
|
|
|
}
|
|
|
|
|
|
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);
|
|
}
|
|
|
|
} |