【Unity】Unity实现鼠标控制摄像机围绕物体旋转镜头 滑轮控制远近

本文介绍了一种在Unity中实现摄像机环绕特定物体旋转的方法,包括摄像机的远离与接近控制,以及通过鼠标输入实现的平滑旋转。代码示例展示了如何响应鼠标滚轮和鼠标移动,以调整摄像机的位置和视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在游戏和一些产品展示等项目中会有让摄像机围绕某个物体进行旋转这种需求 

下面展示的代码是个删减版的  只保留了主要功能   限制的方面都删除了

在原有的代码中有  移动摄像机功能 围绕的点不做限制每帧都在变化   还有移动的范围限制  旋转的角度限制   还有触发层级的限制   UI误触限制等。。   

使用的过程中可以根据自己的需求来添加

在实际的使用中可能会有限制的需求  比如最大远离多少  最近距离多少   不能旋转到地面以下等

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//摄像机操作   
//删减版   在实际的使用中可能会有限制的需求  比如最大远离多少  最近距离多少   不能旋转到地面以下等
public class CamCtrl : MonoBehaviour
{
    public Transform CenObj;//围绕的物体
    private Vector3 Rotion_Transform;
    private new Camera camera;
    void Start()
    {
        camera = GetComponent<Camera>();
        Rotion_Transform = CenObj.position;
    }
    void Update()
    {
        Ctrl_Cam_Move();
        Cam_Ctrl_Rotation();
    }
    //镜头的远离和接近
    public void Ctrl_Cam_Move()
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            transform.Translate(Vector3.forward * 1f);//速度可调  自行调整
        }
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            transform.Translate(Vector3.forward * -1f);//速度可调  自行调整
        }
    }
    //摄像机的旋转
    public void Cam_Ctrl_Rotation()
    {
        var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
        var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
        if (Input.GetKey(KeyCode.Mouse1))
        {
            transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x * 5);
            transform.RotateAround(Rotion_Transform, transform.right, mouse_y * 5);
        }
    }
}

你可以通过编写脚本来实现相机围绕物体旋转并移动到下一个物体进行旋转的效果。具体的实现方法如下: 1. 创建一个空物体,并将其命名为“CameraRig”(或者其他你喜欢的名称),将相机作为其子物体,并将相机的位置调整到合适的位置。 2. 在代码中定义需要旋转物体列表(比如一个数组),以及相机围绕物体旋转的速度。 3. 在Update函数中,使用Time.deltaTime计算出上一帧到这一帧的时间间隔,然后将相机绕着当前需要旋转物体进行旋转,代码如下: ```csharp // 计算相机绕当前物体旋转的角度 float rotationAngle = rotationSpeed * Time.deltaTime; Quaternion currentRotation = Quaternion.Euler(0, rotationAngle, 0); Quaternion newRotation = transform.rotation * currentRotation; transform.rotation = newRotation; ``` 其中,rotationSpeed为旋转的速度,transform为相机所在的物体的Transform组件。 4. 当相机绕着当前物体旋转了一定时间(比如10秒),则将相机移动到下一个需要旋转物体的位置,并将当前物体的索引加1,代码如下: ```csharp // 经过一定时间后,切换到下一个物体 rotationTimer += Time.deltaTime; if (rotationTimer >= rotationDuration) { currentTargetIndex++; if (currentTargetIndex >= targets.Length) { currentTargetIndex = 0; } currentTarget = targets[currentTargetIndex]; rotationTimer = 0f; // 移动相机到下一个目标物体的位置 Vector3 targetPosition = currentTarget.transform.position; transform.position = targetPosition - transform.forward * distanceFromTarget; } ``` 其中,rotationTimer为旋转计时器,rotationDuration为旋转持续时间,targets为需要旋转物体数组,currentTargetIndex为当前需要旋转物体的索引,currentTarget为当前需要旋转物体,distanceFromTarget为相机距离物体的距离。 这样,就可以实现相机围绕多个物体旋转并移动到下一个物体进行旋转的效果了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值