Unity控制相机旋转、移动、缩放等功能
提示: 该脚本允许你以指定的速度和角度围绕模型进行相机旋转,并可以控制相机的移动和缩放
操作说明
将该脚本添加到一个游戏对象上,并将其作为主摄像机。
1、在Unity编辑器中,你可以在脚本的参数变量部分调整相机的速度、缩放和移动等设置。根据需求,修改各个参数的值。
2、如果需要使相机跳转到指定的模型位置,可以使用MoveToMod(string modName)方法。在调用该方法时,传入目标模型的名称作为参数。相机将会立即跳转到该模型的位置。
3、如果想让相机围绕指定模型以指定速度旋转一定角度,可以使用CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow)方法。在调用该方法时,传入目标模型的名称、x轴旋转角度、y轴旋转角度、z轴旋转角度、旋转速度和是否跟随模型旋转的参数。相机将会以指定的速度逐渐旋转至目标角度。
4、如果需要限制相机的移动范围,可以根据参数变量部分的移动限制设置来调整xMaxMove、xMinMove、yMaxMove、yMinMove、zMaxMove和zMinMove的值。相机将不能超出这些范围进行移动。
参数变量
xSpeed和ySpeed:相机旋转的速度。
wheelSpeed:相机缩放的速度。
xMoveSpeed和yMoveSpeed:相机移动的速度。
isUnlimitedScale:是否无限制放大,但仍受移动限制所规定的范围影响。
distance:镜头与中心点之间的距离,在isUnlimitedScale为true时有效。
isCameraMovementAllowed、isCameraRotationAllowed和isCameraZoomAllowed:是否允许移动、旋转和缩放相机。
isPositionLimitEnabled:是否开启位置限制。
maxZoom和minZoom:缩放的最大和最小限制。
xMaxMove、xMinMove、yMaxMove、yMinMove、zMaxMove和zMinMove:移动的限制。
公共方法
MoveToMod(string modName):使相机跳转到指定模型。
CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow):使相机以指定速度围绕指定模型旋转一定角度。
私有方法
AnimateCameraRotation(float targetX, float targetY, float targetZ, float velocity, bool follow):执行相机旋转动画的协程。
UpdateCameraPosition():更新相机的位置。
MoveCameraSideways(float mouseX):更新相机的横向平移。
MoveCameraUpwards(float mouseY):更新相机的纵向平移。
UpdateCameraRotation():更新相机的旋转。
UpdateCameraZoom():更新相机的缩放。
Unity回调方法
Start():在脚本开始时获取当前物体的Transform作为中心点物体。
Update():每帧更新相机的位置、旋转和缩放。文章来源:https://www.toymoban.com/news/detail-761805.html
操作:
按住鼠标右键并拖动鼠标来旋转相机。
按住鼠标中键并拖动鼠标来移动相机。
使用鼠标滚轮来缩放相机。
长按shift镜头上移
长按ctrl镜头下移文章来源地址https://www.toymoban.com/news/detail-761805.html
using UnityEngine;
public class Rotation : MonoBehaviour
{
// ----- 参数变量 -----
[Header("旋转速度")]
public float xSpeed = 125.0f;
public float ySpeed = 60.0f;
[Header("缩放速度")]
public float wheelSpeed = 50;
[Header("移动速度")]
public float xMoveSpeed = 200;
public float yMoveSpeed = 200;
[Header("是否无限制放大,但仍旧会受移动限制所规定的范围")]
public bool isUnlimitedScale = true;
[Header("镜头与中心点距离,在 isUnlimitedScale 变量为 true 时有效")]
public float distance = 30;
[Header("是否允许移动相机")]
public bool isCameraMovementAllowed = true;
[Header("是否允许旋转相机")]
public bool isCameraRotationAllowed = true;
[Header("是否允许缩放相机")]
public bool isCameraZoomAllowed = true;
[Header("是否开启位置限制")]
public bool isPositionLimitEnabled = true;
[Header("缩放限制,最大,最小")]
public float maxZoom = 300;
public float minZoom = 8;
[Header("移动限制")]
public float xMaxMove = 94;
public float xMinMove = -94;
public float yMaxMove = 58;
public float yMinMove = 1;
public float zMaxMove = 44;
public float zMinMove = -44;
// ----- 内部变量 -----
private Transform tanks; // 中心点物体
private Quaternion rotation; // 角度控制
// ----- 公共方法 -----
// 使相机跳转到模型
public bool MoveToMod(string modName)
{
if (string.IsNullOrEmpty(modName))
return false;
Transform newTransform = GameObject.Find(modName)?.transform;
if (newTransform != null)
{
tanks.position = newTransform.position;
return true;
}
else
{
return false;
}
}
// 使相机以指定速度围绕指定模型旋转一定角度
public void CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow)
{
MoveToMod(modName);
// 设置旋转角度
float targetX = transform.eulerAngles.x + xAngle;
float targetY = transform.eulerAngles.y + yAngle;
float targetZ = transform.eulerAngles.z + zAngle;
// 开启协程执行动画
StartCoroutine(AnimateCameraRotation(targetX, targetY, targetZ, velocity, follow));
}
// ----- 私有方法 -----
// 协程,执行相机旋转动画
private System.Collections.IEnumerator AnimateCameraRotation(float targetX, float targetY, float targetZ, float velocity, bool follow)
{
float animationSpeed = velocity;
while (true)
{
float step = animationSpeed * Time.deltaTime;
// 逐渐旋转至目标角度
transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(targetX, targetY, targetZ), step);
if (follow)
tanks.rotation = transform.rotation;
yield return null;
}
}
// 更新相机的位置
private void UpdateCameraPosition()
{
if (!isCameraMovementAllowed || !Input.GetMouseButton(2))
return;
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
// 横向平移
MoveCameraSideways(mouseX);
// 纵向平移,若相机垂直地面则向前平移
MoveCameraUpwards(mouseY);
}
// 更新相机的横向平移
private void MoveCameraSideways(float mouseX)
{
transform.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -mouseX);
tanks.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -mouseX);
}
// 更新相机的纵向平移
private void MoveCameraUpwards(float mouseY)
{
transform.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -mouseY);
tanks.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -mouseY);
}
// 更新相机的旋转
private void UpdateCameraRotation()
{
if (!isCameraRotationAllowed || !Input.GetMouseButton(1))
return;
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
// 设置横向旋转距离
float x = transform.eulerAngles.x + mouseY * xSpeed * 0.02f;
// 设置纵向旋转距离
float y = transform.eulerAngles.y + mouseX * ySpeed * 0.02f;
rotation = Quaternion.Euler(y, x, transform.eulerAngles.z);
transform.rotation = rotation;
}
// 更新相机的缩放
private void UpdateCameraZoom()
{
if (!isCameraZoomAllowed)
return;
if (isUnlimitedScale)
{
float scrollDelta = Input.GetAxis("Mouse ScrollWheel");
// 方块与相机保持相应距离
distance += scrollDelta * wheelSpeed;
}
else
{
float scrollDelta = Input.GetAxis("Mouse ScrollWheel");
if ((scrollDelta < 0 || distance > minZoom) && (scrollDelta > 0 || distance < maxZoom) || !isPositionLimitEnabled)
{
distance += scrollDelta * wheelSpeed;
}
}
rotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, 0);
transform.position = rotation * new Vector3(0.0f, 0.0f, -distance) + tanks.position;
}
// ----- Unity 回调方法 -----
private void Start()
{
tanks = transform; // 使用当前物体的 Transform,而不是寻找名为 "Main Camera" 的对象
}
private void Update()
{
UpdateCameraPosition();
UpdateCameraRotation();
UpdateCameraZoom();
}
}
到了这里,关于Unity控制相机旋转、移动、缩放等功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!