159 lines
5.6 KiB
C#
159 lines
5.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
using ZXK.BYSS;
|
|
/********************************************************************************
|
|
*Create By CG
|
|
*Function 摄像机自身控制控制
|
|
*WSAD:前后左右-QE:上下-鼠标滚轮:镜头远近-按住鼠标右键,拖动鼠标:摄像机上下左右旋转
|
|
*********************************************************************************/
|
|
namespace ZXK.UTility
|
|
{
|
|
public class CameraControl : MonoBehaviour
|
|
{
|
|
public float _RotSpeed = 256;
|
|
public float _MoveSpeed = 10;
|
|
public float _ZoomSpeed = 30;
|
|
|
|
//摄像机三维位移受限,暂时实现上下受限
|
|
private Vector3 _minPos = new Vector3(-15.0f, 0.3f, -23.0f);
|
|
private Vector3 _maxPos = new Vector3(15.0f, 6.0f, 23.0f);
|
|
private float _minZoom = 5.0f;
|
|
private float _maxZoom = 100f;
|
|
|
|
|
|
private Vector3 _translation;
|
|
private float rotX = 0.0f;
|
|
private float rotY = 0.0f;
|
|
|
|
|
|
private void OnEnable()
|
|
{
|
|
Vector3 angles = transform.eulerAngles;
|
|
rotX = angles.y;
|
|
rotY = angles.x;
|
|
}
|
|
private void Update()
|
|
{
|
|
if (!EventSystem.current.IsPointerOverGameObject())
|
|
{
|
|
_translation = GetInputTranslationDirection();
|
|
|
|
SetCamDistance();
|
|
SetCamPostion();
|
|
SetCamRotation();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 设置摄像机镜头远近
|
|
/// </summary>
|
|
private void SetCamDistance()
|
|
{
|
|
//transform.localPosition += transform.forward * Input.mouseScrollDelta.y * Time.deltaTime * _ZoomSpeed;
|
|
float zoom = transform.GetComponent<Camera>().fieldOfView;
|
|
if (zoom < _minZoom&& Input.mouseScrollDelta.y>0 || zoom > _maxZoom && Input.mouseScrollDelta.y < 0)
|
|
{
|
|
return;
|
|
}
|
|
transform.GetComponent<Camera>().fieldOfView-= Input.mouseScrollDelta.y * Time.deltaTime * _ZoomSpeed;
|
|
}
|
|
/// <summary>
|
|
/// 设置摄像机位移
|
|
/// </summary>
|
|
private void SetCamPostion()
|
|
{
|
|
transform.position += _translation * Time.deltaTime * _MoveSpeed;
|
|
}
|
|
/// <summary>
|
|
/// 设置摄像机旋转
|
|
/// </summary>
|
|
private void SetCamRotation()
|
|
{
|
|
|
|
|
|
if (Input.GetKey(KeyCode.Mouse1))
|
|
{
|
|
float mouse_x = Input.GetAxis("Mouse X");
|
|
float mouse_y = Input.GetAxis("Mouse Y");
|
|
rotX += mouse_x * _RotSpeed * Time.deltaTime;
|
|
rotY -= mouse_y * _RotSpeed * Time.deltaTime;
|
|
rotY = Mathf.Clamp(rotY, -90, 90);//防止翻跟头
|
|
|
|
|
|
|
|
|
|
//Quaternion rotation = Quaternion.Euler(rotY, rotX, 0);//利用欧拉角防止万向锁
|
|
//transform.rotation = rotation;
|
|
transform.localEulerAngles = new Vector3(rotY, rotX);
|
|
}
|
|
}
|
|
|
|
Vector3 GetInputTranslationDirection()
|
|
{
|
|
Vector3 direction = new Vector3();
|
|
if (Input.GetKey(KeyCode.W))
|
|
{
|
|
//direction += Vector3.forward;
|
|
|
|
if (AppManagement.Instance._CurModel == EnumCtrl.Model.Train ||
|
|
AppManagement.Instance._CurModel == EnumCtrl.Model.Exam)
|
|
{
|
|
//不让摄像机有实际前进位移,方便拖拽出来的物体可以被看到
|
|
float zoom = transform.GetComponent<Camera>().fieldOfView;
|
|
if (zoom > _minZoom)
|
|
{
|
|
transform.GetComponent<Camera>().fieldOfView -= 1 * Time.deltaTime * _ZoomSpeed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Vector3 forward = new Vector3(transform.forward.x, 0, transform.forward.z);
|
|
direction += forward.normalized;
|
|
}
|
|
}
|
|
if (Input.GetKey(KeyCode.S))
|
|
{
|
|
//direction += Vector3.back;
|
|
|
|
|
|
if (AppManagement.Instance._CurModel == EnumCtrl.Model.Train ||
|
|
AppManagement.Instance._CurModel == EnumCtrl.Model.Exam)
|
|
{
|
|
float zoom = transform.GetComponent<Camera>().fieldOfView;
|
|
if (zoom < _maxZoom)
|
|
{
|
|
transform.GetComponent<Camera>().fieldOfView -= -1 * Time.deltaTime * _ZoomSpeed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Vector3 forward = new Vector3(transform.forward.x, 0, transform.forward.z);
|
|
direction -= forward.normalized;
|
|
}
|
|
}
|
|
if (Input.GetKey(KeyCode.A))
|
|
{
|
|
//direction += Vector3.left;
|
|
Vector3 right = new Vector3(transform.right.x, 0, transform.right.z);
|
|
direction -= right;
|
|
}
|
|
if (Input.GetKey(KeyCode.D))
|
|
{
|
|
//direction += Vector3.right;
|
|
Vector3 right = new Vector3(transform.right.x, 0, transform.right.z);
|
|
direction += right;
|
|
}
|
|
if (transform.position.y < _maxPos.y && Input.GetKey(KeyCode.Q))
|
|
{
|
|
direction += Vector3.up;
|
|
}
|
|
if (transform.position.y> _minPos.y && Input.GetKey(KeyCode.E))
|
|
{
|
|
direction += Vector3.down;
|
|
}
|
|
return direction;
|
|
}
|
|
}
|
|
}
|