using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///
/// Отслеживание объекта
///
public class CameraController : MonoBehaviour
{
public enum RotationAxes { Mouse, TrackMarker }
public RotationAxes axes = RotationAxes.Mouse;
public float movementSpeed = 0.1f;
public int mouseSpeed = 100;
public float smoothness = 0.85f;
public Button ButtonCameraCenter;
Vector3 targetPosition;
private Vector3 dragOrigin;
public Transform target;
public GameObject location;
public Toggle Toggle_projection;
void Start()
{
targetPosition = transform.position;
yaw = transform.eulerAngles.y;
pitch = transform.eulerAngles.x;
ButtonCameraCenter.onClick.AddListener(CameraCenter);
}
void Update()
{
if (!EventSystem.current.IsPointerOverGameObject())
{
switch (axes)
{
case RotationAxes.Mouse:
//MouseCommands();
MovementMouse();
break;
case RotationAxes.TrackMarker:
TrackMarker();
break;
}
}
Camera.main.orthographic = Toggle_projection.isOn;
}
void ShowAndUnlockCursor()
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
void HideAndLockCursor()
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
private void MouseCommands()
{
//if (Input.GetKey(KeyCode.W))
//{
// targetPosition += transform.forward * movementSpeed;
// Camera.main.orthographicSize++;
//}
if (Input.GetKey(KeyCode.LeftArrow))
targetPosition -= transform.right * movementSpeed;
//if (Input.GetKey(KeyCode.S))
//{
// targetPosition -= transform.forward * movementSpeed;
// if (Camera.main.orthographicSize > 1) Camera.main.orthographicSize--;
//}
if (Input.GetKey(KeyCode.RightArrow))
targetPosition += transform.right * movementSpeed;
if (Input.GetKey(KeyCode.DownArrow))
targetPosition -= transform.up * movementSpeed;
if (Input.GetKey(KeyCode.UpArrow))
targetPosition += transform.up * movementSpeed;
if (Input.GetMouseButtonDown(2))
{
dragOrigin = Input.mousePosition;
}
if (Input.GetMouseButton(1))
{
Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - dragOrigin);
if (pos.x < 0)
targetPosition -= transform.right * movementSpeed * 0.1f;
if (pos.x > 0)
targetPosition += transform.right * movementSpeed * 0.1f;
if (pos.y < 0)
targetPosition -= transform.up * movementSpeed * 0.1f;
if (pos.y > 0)
targetPosition += transform.up * movementSpeed * 0.1f;
}
if (Input.GetAxis("Mouse ScrollWheel") > 0 && !EventSystem.current.IsPointerOverGameObject())
{
targetPosition += transform.forward * movementSpeed* mouseSpeed;
if (Camera.main.orthographicSize > 1) Camera.main.orthographicSize--;
}
else if (Input.GetAxis("Mouse ScrollWheel") < 0 && !EventSystem.current.IsPointerOverGameObject())
{
targetPosition -= transform.forward * movementSpeed*mouseSpeed;
Camera.main.orthographicSize++;
}
transform.position = Vector3.Lerp(transform.position, targetPosition, (1.0f - smoothness));
}
private Vector3 screenPoint;
private Vector3 offset;
private Vector3 curScreenPoint;
private Vector3 curPosition;
void OnMouseDown()
{
//Debug.Log(StagesEditorController.indexCursor);
screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
}
private void OnMouseDrag()
{
switch (axes)
{
case RotationAxes.Mouse:
curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
transform.position = curPosition;
break;
}
}
void TrackMarker()
{
transform.Translate(0, 0, Input.GetAxis("Mouse ScrollWheel") * zoomSpeed, Space.Self);
var marker_offset = new Vector3(target.position.x, targetPosition.y, target.position.z);
if(!target.GetComponent().enabled) target.GetComponent().enabled = true;
targetPosition =Vector3.Lerp(transform.position, /*targetPosition + target.position - */marker_offset, (1.0f - smoothness));
transform.position = targetPosition;
if (Input.GetMouseButton(1))
{
target.GetComponent().enabled = false;
axes = RotationAxes.Mouse;
var player = PlayerController.instance;
if (player.UserInfo.activeSelf)
{
var client = Client.instance;
client.ImageStreamStopSend(player.user_broadcast.Value);
player.user_broadcast = null;
player.UserInfo.SetActive(false);
}
}
}
public float lookSpeedH = 2f;
public float lookSpeedV = 2f;
public float zoomSpeed = 2f;
public float dragSpeed = 1f;
public float dragKeySpeed = 0.1f;
private float yaw = 0f;
private float pitch = 0f;
void MovementMouse()
{
//Look around with Right Mouse
if (Input.GetMouseButton(1))
{
yaw += lookSpeedH * Input.GetAxis("Mouse X");
pitch -= lookSpeedV * Input.GetAxis("Mouse Y");
transform.eulerAngles = new Vector3(pitch, yaw, 0f);
}
//drag camera around with Middle Mouse
if (Input.GetMouseButton(2))
{
transform.Translate(-Input.GetAxisRaw("Mouse X") * dragSpeed, -Input.GetAxisRaw("Mouse Y") * dragSpeed, 0);
}
if (Toggle_projection.isOn)
{
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
if (Camera.main.orthographicSize > 1) Camera.main.orthographicSize--;
}
if (Input.GetAxis("Mouse ScrollWheel") > 0) Camera.main.orthographicSize++;
}
else
//Zoom in and out with Mouse Wheel
transform.Translate(0, 0, Input.GetAxis("Mouse ScrollWheel") * zoomSpeed, Space.Self);
if (Input.GetKey(KeyCode.LeftArrow))
//targetPosition -= transform.right * movementSpeed;
transform.Translate(-dragKeySpeed, 0, 0);
if (Input.GetKey(KeyCode.RightArrow))
transform.Translate(dragKeySpeed, 0, 0);
if (Input.GetKey(KeyCode.DownArrow))
transform.Translate(0, -dragKeySpeed, 0);
if (Input.GetKey(KeyCode.UpArrow))
transform.Translate(0, dragKeySpeed, 0);
}
public void CameraCenter()
{
if (location != null)
{
var pos = location.transform.position;
var scale = location.transform.localScale;
var x = pos.x - scale.x / 2;
float y;
var z = pos.z - scale.z / 2;
if (x >= z)
y = scale.x * 8;
else y = scale.z * 8;
transform.position = new Vector3(x, y, z);
}
else
transform.position = new Vector3(5, 12, 5);
transform.rotation = Quaternion.Euler(90, 0, 0);
targetPosition = transform.position;
yaw = transform.eulerAngles.y;
pitch = transform.eulerAngles.x;
}
}