传统的moba游戏中对相机的控制为:
1、鼠标移动到屏幕边缘时,移动相机
2、按下鼠标会拖动相机
3、按下对应按键(WASD)会移动相机
4、滑动鼠标滚轮时,会改变相机视野范围
4、相机在移动过程中会有范围限制
实现以上功能的相机代码为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
/// <summary>
/// 相机当前是否可交互
/// </summary>
public bool IsInteracte = true;
public float moveSpeed = 0.1f;// 相机移动速度
public float dragSpeed = 0.02f;// 拖动速度
[Header("相机视野范围")]
public float minSize = 6;
public float maxSize = 12;
public float zoomSpeed = 0.5f;
[Header("相机活动范围(上下左右边界——做坐标值)")]
/// <summary>
/// 相机最小视野时 活动范围
/// </summary>
public float[] minSizeBound = new float[4];
/// <summary>
/// 相机最大视野时 活动范围
/// </summary>
public float[] maxSizeBound = new float[4];
/// <summary>
/// 记录鼠标滚轮当前值
/// </summary>
private float mouseWheel;
/// <summary>
/// 鼠标移动到屏幕边缘的差值
/// </summary>
private float mouseOffset = 0.01f;
private bool mouseIsDrag = false;
private Vector3 mouseEndPos;
private Camera cam;
private Transform myCamera;
private float topPar;
private float bottomPar;
private float leftPar;
private float rightPar;
private void Awake()
{
cam = GetComponent<Camera>();
myCamera = cam.transform;
setCameraMoveParam();
SetCameraInitPos(Vector3.zero);
}
private void Update()
{
if (IsInteracte)
{
if (!mouseIsDrag)
{
mouseInScreenBound();
}
keyCodeMoveCamera();
mouseDragCameraMove();
mouseScrollWheelChangeView();
restrictCameraPosition();
}
else
{
if (mouseIsDrag) mouseIsDrag = false;
}
}
/// <summary>
/// 设置相机位置
/// </summary>
public void SetCameraInitPos(Vector3 pos)
{
myCamera.position = new Vector3(pos.x, pos.y, myCamera.position.z);
}
/// <summary>
/// 设置相机移动的系数
/// </summary>
private void setCameraMoveParam()
{
float sizeRange = maxSize - minSize;
float shangRange = maxSizeBound[0] - minSizeBound[0];
float xiaRange = maxSizeBound[1] - minSizeBound[1];
float zuoRange = maxSizeBound[2] - minSizeBound[2];
float youRange = maxSizeBound[3] - minSizeBound[3];
topPar = shangRange / sizeRange;
bottomPar = xiaRange / sizeRange;
leftPar = zuoRange / sizeRange;
rightPar = youRange / sizeRange;
}
/// <summary>
/// 鼠标在屏幕边缘时,移动相机
/// </summary>
private void mouseInScreenBound()
{
Vector3 v1 = Camera.main.ScreenToViewportPoint(Input.mousePosition);
//上移
if (v1.y >= 1 - mouseOffset)
{
myCamera.Translate(Vector2.up * moveSpeed);
}
//下移
if (v1.y <= mouseOffset)
{
myCamera.Translate(Vector2.down * moveSpeed);
}
//左移
if (v1.x <= mouseOffset)
{
myCamera.Translate(Vector2.left * moveSpeed);
}
//右移
if (v1.x >= 1 - mouseOffset)
{
myCamera.Translate(Vector2.right * moveSpeed);
}
}
/// <summary>
/// 按下对应键位时,移动相机
/// </summary>
private void keyCodeMoveCamera()
{
if (Input.GetKey(KeyCode.W))
{
myCamera.Translate(Vector2.up * moveSpeed);
}
if (Input.GetKey(KeyCode.S))
{
myCamera.Translate(Vector2.down * moveSpeed);
}
if (Input.GetKey(KeyCode.A))
{
myCamera.Translate(Vector2.left * moveSpeed);
}
if (Input.GetKey(KeyCode.D))
{
myCamera.Translate(Vector2.right * moveSpeed);
}
}
/// <summary>
/// 鼠标拖动相机移动
/// </summary>
private void mouseDragCameraMove()
{
if (!mouseIsDrag && Input.GetMouseButtonDown(0) && Utility.IsMouseOverUI() == false)
{
mouseEndPos = Input.mousePosition;
mouseIsDrag = true;
}
if (mouseIsDrag && Input.GetMouseButton(0) && Utility.IsMouseOverUI() == false)
{
Vector3 curPos = Input.mousePosition;
Vector3 movePos = (curPos - mouseEndPos) * dragSpeed;
myCamera.position -= movePos;
mouseEndPos = curPos;
}
if (mouseIsDrag && Input.GetMouseButtonUp(0))
{
mouseIsDrag = false;
}
}
/// <summary>
/// 鼠标滚轮改变视野范围
/// </summary>
private void mouseScrollWheelChangeView()
{
mouseWheel = Input.GetAxis("Mouse ScrollWheel");//获取滚轮值的改变
//视野放大
if (mouseWheel < 0 && cam.orthographicSize + zoomSpeed <= maxSize)
{
cam.orthographicSize += zoomSpeed;
}
//视野缩小
else if (mouseWheel > 0 && cam.orthographicSize - zoomSpeed >= minSize)
{
cam.orthographicSize -= zoomSpeed;
}
}
/// <summary>
/// 限制相机位置
/// </summary>
private void restrictCameraPosition()
{
float cameraSize = cam.orthographicSize - minSize;
float maxY = cameraSize * topPar + minSizeBound[0];
float minY = cameraSize * bottomPar + minSizeBound[1];
float minX = cameraSize * leftPar + minSizeBound[2];
float maxX = cameraSize * rightPar + minSizeBound[3];
if (myCamera.position.y > maxY)
{
myCamera.position = new Vector3(myCamera.position.x, maxY, myCamera.position.z);
}
if (myCamera.position.y < minY)
{
myCamera.position = new Vector3(myCamera.position.x, minY, myCamera.position.z);
}
if (myCamera.position.x < minX)
{
myCamera.position = new Vector3(minX, myCamera.position.y, myCamera.position.z);
}
if (myCamera.position.x > maxX)
{
myCamera.position = new Vector3(maxX, myCamera.position.y, myCamera.position.z);
}
}
}