代码运行,是可行的,在github上找的,侵权请告知,忘记在哪下的了。
using UnityEngine;
using System.Collections;
public class CameraController : MonoBehaviour
{
/// <summary>
/// 视角类型.
/// </summary>
private enum ViewType
{
_2D = 0,
_3D
}
/// <summary>
/// 鼠标按键.
/// </summary>
private enum MouseButton
{
/// <summary>
/// 鼠标左键.
/// </summary>
LEFT = 0,
/// <summary>
/// 鼠标右键.
/// </summary>
RIGHT,
/// <summary>
/// 鼠标中键.
/// </summary>
MIDDLE
}
/// <summary>
/// 指针样式.
/// </summary>
private enum CursorType
{
/// <summary>
/// 默认样式.
/// </summary>
DEFAULT = 0,
/// <summary>
/// 小手.
/// </summary>
HAND,
/// <summary>
/// 眼睛.
/// </summary>
EYE,
/// <summary>
/// 放大镜.
/// </summary>
MAGNIFIER
}
#region 字段
private const string MOUSESCROLLWHEEL = "Mouse ScrollWheel"; // 鼠标滚轮.
private const string MOUSEX = "Mouse X";
private const string MOUSEY = "Mouse Y";
#region 输入
private bool leftAltKeyDown; // 左Alt键-按下.
private bool rightAltKeyDown; // 右Alt键-按下.
private bool leftAltKey; // 左Alt键-长按.
private bool rightAltKey; // 右Alt键-长按.
private bool leftAltKeyUp; // 左Alt键-抬起.
private bool rightAltKeyUp; // 右Alt键-抬起.
private bool leftMouseButtonDown; // 鼠标左键-按下.
private bool rightMouseButtonDown; // 鼠标右键-按下.
private bool leftMouseButton; // 鼠标左键-长按.
private bool rightMouseButton; // 鼠标右键-长按.
private bool rightMouseButtonUp; // 鼠标右键-抬起.
private bool middleMouseButton; // 鼠标中键-长按.
private bool middleMouseButtonUp; // 鼠标中键-抬起.
#endregion
private Camera m_Camera; // 相机.
private Texture2D handCursorTexture; // 小手.
private Texture2D eyeCursorTexture; // 眼睛.
private Texture2D magnifierCursorTexture; // 放大镜.
private Vector2 hotSpot = Vector2.zero;
private CursorMode cursorMode = CursorMode.Auto;
private float angle_X; // 水平方向的角度值,绕Transform的y轴旋转(左右)
private float angle_Y; // 竖直方向的角度值,绕Transform的x轴旋转(上下)
private float angle_Z;
// 切换视角
private Matrix4x4 defaultOrthProjMat; // 相机默认的正交投影矩阵.
private Matrix4x4 defaultPersProjMat; // 相机默认的透视投影矩阵.
private Matrix4x4 currentProjMat; // 相机当前的投影矩阵.
private bool isChangingViewType = false; // 正在切换视角.
private float viewTypeLerpTime = 0f; // 插值时间.
private ViewType viewType; // 当前视角.
[Header("Zoom")]
// 相机拉近拉远 Zoom
[SerializeField]
private float distance = 20f; // 相机与lookAroudPos点的距离.
[SerializeField, Range(1f, 20f)]
private float zoomSpeed = 10f; // 滚轮缩放速度.
[SerializeField]
private float maxDistance = 100f; // 相机最远距离.
[SerializeField]
private float minDistance = 1f; // 相机最近距离.
[Header("360° Rotate")]
// Alt+鼠标拖动, 360度观察
[SerializeField, Range(2f, 10f)]
private float rotateSensitivity = 5f; // 旋转灵敏度.
private Vector3 lookAroundPos = Vector3.zero;
// Alt+鼠标右键 放大缩小
[Header("Field Of View")]
private float minFov = 20f; // 最小视角.
private float maxFov = 135f; // 最大视角.
private Vector3 lastMousePosFov = Vector3.zero;
[SerializeField, Range(0.01f, 0.1f)]
private float fovSensitivity = 0.05f; // 视角灵敏度.
// 选中物体聚焦
private GameObject selectedObj = null; // 选中的物体.
private float raycastMaxDistance = 1000f;
private LayerMask raycastLayerMask;
private RaycastHit raycastHit;
[Header("Focus")]
[SerializeField, Range(0.1f, 5f)]
private float focusSpeed = 3.0f; // 聚焦的速度.
[SerializeField]
private float focusDistance = 3f; // 聚焦时与物体的距离.
private bool isFocusing = false; // 相机正看向物体中.
private float focusTime = 0f; // 聚焦时间.
private Vector3 cameraInitForward; // 相机最初的前方.
private Vector3 focusTargetForward; // 聚焦目标前方.
private Vector3 focusInitPos; // 聚焦前相机初始位置.
private Vector3 focusTargetPos; // 聚焦目标位置.
#