把脚本挂到摄像机上即可,设置一下需要限制角度的区间值。此脚本中有加入滑动条来显示摄像机缩放,如不需要可删除。
注:需要引入DoTween插件,如不需要相机复位功能,可删除代码段,不引入DoTween
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;
public class ExperimentalCameraController : MonoBehaviour
{
public static ExperimentalCameraController Instance;
public Camera mainCamera; //主相机
public Camera shotCamera; //拍照相机
public Slider zoomSlider; //相机缩放滑动条
private float _speed = 20f;
[HideInInspector] public bool onOff;
//限制拖动范围的区间值
public float xValue, yValue;
//记录当前相机的X轴和Y轴的坐标
public float cameraX;
public float cameraY;
private void Awake()
{
Instance = this;
}
// Update is called once per frame
private void LateUpdate()
{
if (onOff)
{
//鼠标滚轮控制相机缩放 最大值100 最小值20
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
if (zoomSlider.value < 1f)
zoomSlider.value += 0.02f;
}
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
if (zoomSlider.value > 0.2f)
zoomSlider.value -= 0.02f;
}
if (zoomSlider.value < 0.2f)
{
zoomSlider.value = 0.2f;
}
//方向键左右,控制左右旋转
if (Input.GetAxis("Horizontal") != 0)
{
mainCamera.transform.Rotate(0, Input.GetAxis("Horizontal") * _speed * Time.deltaTime, 0, Space.Self);
}
//方向键上下,控制上下的旋转(俯仰)
if (Input.GetAxis("Vertical") != 0)
{
mainCamera.transform.Rotate(Input.GetAxis("Vertical") * -_speed * Time.deltaTime, 0, 0, Space.Self);
}
//按R键使摄像机复位
if (Input.GetKeyDown(KeyCode.R))
{
mainCamera.transform.DOLocalRotate(new Vector3(0, cameraY, 0), 1);
}
//限制相机视角移动范围
var eulerAngles = gameObject.transform.localEulerAngles;
eulerAngles.x = CheckAngle(eulerAngles.x);
eulerAngles.y = CheckAngle(eulerAngles.y);
cameraX = CheckAngle(cameraX);
cameraY = CheckAngle(cameraY);
eulerAngles = new Vector3(Mathf.Clamp(eulerAngles.x, cameraX - xValue, cameraX + xValue),
Mathf.Clamp(eulerAngles.y, cameraY - yValue, cameraY + yValue),
0f);
gameObject.transform.localEulerAngles = eulerAngles;
}
//相机焦距同步Slider
mainCamera.fieldOfView = zoomSlider.value * 100;
shotCamera.fieldOfView = zoomSlider.value * 100;
}
/// <summary>
/// 万向锁
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public float CheckAngle(float value)
{
value -= 180;
if (value < 0)
{
return value + 180;
}
else
{
return value - 180;
}
}
}
版权声明:本文为qq_38859767原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。