Unity控制相机旋转、移动、缩放等功能

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():每帧更新相机的位置、旋转和缩放。

操作:
按住鼠标右键并拖动鼠标来旋转相机。
按住鼠标中键并拖动鼠标来移动相机。
使用鼠标滚轮来缩放相机。
长按shift镜头上移
长按ctrl镜头下移

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();
    }
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Unity中,可以通过操作相机来实现地图的缩放效果。首先,需要获取到相机的引用,通过代码获取相机的方式可以是通过Camera.main获取主摄像机,或是在脚本中声明一个public变量,并将相机拖拽到对应的变量中。 一种简单的方式是使用相机的orthographicSize属性来实现缩放。该属性是一个浮点数,表示相机的正交视图大小。较小的值会使地图缩小,较大的值会使地图放大。可以通过修改该值来实现地图的缩放效果。 通过在代码中访问相机的orthographicSize属性,可以设置地图的缩放程度。例如,将其设置为一个较小的值,如5,会使地图缩小,而将其设置为较大的值,如10,会使地图放大。根据具体需求,可以通过在代码中调整orthographicSize的值来实现地图的缩放。 另外,还可以结合相机的位置进行缩放。可以通过访问相机的transform属性,来修改相机的位置和旋转。例如,将相机向前移动一定的距离,会增加地图的缩放效果,而将相机向后移动一定的距离,则会减小地图的缩放效果。可以通过在代码中修改相机的transform属性来实现地图的缩放。 除了以上两种方法,还可以利用相机的正交投影矩阵和透视投影矩阵进行缩放。这种方式相对复杂一些,需要对相机的投影矩阵进行修改。根据具体情况,可以选择合适的方式来实现地图的缩放效果。 综上所述,可以通过修改相机的orthographicSize属性或transform属性,或者利用投影矩阵来实现Unity中地图的缩放效果。可以根据具体需求选择合适的方式,并在代码中进行相应的调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forever-淡墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值