精简好用的u3d摄像机控制脚本代码
2015年03月19日 11:27
0 点赞
0 评论
更新于 2025-11-21 17:42
以下是完整的U3D(Unity 3D)摄像机控制脚本代码,该脚本可实现摄像机的缩放和环绕视角功能。
private Transform player;
public float scrollSpeed = 6.0f;
public float roundSpeed = 4.2f;
public float _vMinLimit = 15f; // y轴最小限制
public float _vMaxLimit = 55f; // y轴最大限制
public float zoomMin = 3f; // 最小缩放距离
public float zoomMax = 8f; // 最大缩放距离
float hh;
float vv;
float distance;
// Update方法在每一帧被调用
void Update()
{
if (!player)
{
getPlayer();
}
calPos(aroundView(), scrollView());
}
// 处理鼠标滚轮缩放视图的方法
float scrollView()
{
// 获取鼠标滚轮的输入值
float wheel = Input.GetAxis("Mouse ScrollWheel");
// 计算摄像机与玩家之间的距离
float dis = Vector3.Distance(transform.position, player.position);
// 根据鼠标滚轮输入调整距离
dis -= wheel * scrollSpeed;
// 将距离限制在最小和最大缩放距离之间
distance = Mathf.Clamp(dis, zoomMin, zoomMax);
return distance;
}
// 处理鼠标右键拖动环绕视图的方法
Quaternion aroundView()
{
// 获取鼠标水平和垂直移动的输入值
float h = Input.GetAxis("Mouse X");
float v = Input.GetAxis("Mouse Y");
// 获取当前摄像机的旋转角度
Quaternion rt = Quaternion.Euler(transform.eulerAngles);
// 判断鼠标右键是否按下
bool rightMouseDown = Input.GetMouseButton(1);
if (rightMouseDown)
{
// 计算水平旋转角度
hh += h * roundSpeed;
// 计算垂直旋转角度
vv -= v;
// 将垂直旋转角度限制在最小和最大垂直角度之间
vv = Mathf.Clamp(vv, _vMinLimit, _vMaxLimit);
// 根据计算得到的角度更新旋转
rt = Quaternion.Euler(vv, hh, 0f);
}
return rt;
}
// 核心方法,根据旋转角度和距离计算摄像机的位置和旋转
void calPos(Quaternion angle, float distance)
{
// 根据旋转角度和距离计算摄像机的位置
Vector3 pos = angle * new Vector3(0f, 0f, -distance) + player.position;
// 设置摄像机的位置
transform.position = pos;
// 设置摄像机的旋转
transform.rotation = angle;
// 或者使用下面的方法让摄像机始终看向玩家
// transform.LookAt(player.position);
}
// 获取玩家对象的方法
void getPlayer()
{
// 通过标签查找玩家对象并获取其Transform组件
player = GameObject.FindGameObjectWithTag(TagsEnum.Player.ToString()).transform;
// 初始化水平旋转角度
hh = transform.eulerAngles.y;
// 初始化垂直旋转角度
vv = transform.eulerAngles.x;
// 初始化摄像机与玩家的距离为最大缩放距离
distance = zoomMax;
}
代码说明
变量定义:
player:存储玩家对象的Transform组件,用于定位玩家的位置。scrollSpeed:鼠标滚轮缩放的速度。roundSpeed:鼠标右键拖动环绕视角的速度。_vMinLimit和_vMaxLimit:垂直旋转角度的最小和最大限制。zoomMin和zoomMax:缩放距离的最小和最大限制。hh和vv:分别存储水平和垂直旋转的角度。distance:存储摄像机与玩家之间的距离。
Update方法:- 每帧检查是否已经获取到玩家对象,如果没有则调用
getPlayer方法获取。 - 调用
aroundView和scrollView方法计算旋转角度和缩放距离,并将结果传递给calPos方法。
- 每帧检查是否已经获取到玩家对象,如果没有则调用
scrollView方法:- 获取鼠标滚轮的输入值,根据输入值调整摄像机与玩家之间的距离。
- 使用
Mathf.Clamp方法将距离限制在最小和最大缩放距离之间。
aroundView方法:- 获取鼠标水平和垂直移动的输入值,当鼠标右键按下时,根据输入值计算水平和垂直旋转的角度。
- 使用
Mathf.Clamp方法将垂直旋转角度限制在最小和最大垂直角度之间。
calPos方法:- 根据旋转角度和距离计算摄像机的位置,并设置摄像机的位置和旋转。
- 可以选择使用
transform.LookAt方法让摄像机始终看向玩家。
getPlayer方法:- 通过标签查找玩家对象并获取其
Transform组件。 - 初始化水平和垂直旋转角度以及摄像机与玩家之间的距离。
- 通过标签查找玩家对象并获取其