unity 摄像机镜头跟随鼠标拖拽

通过update方法记录变化量然后通过坐标换算移动摄像机

一.获取上一帧到当前帧鼠标位移变化量,计算过相机从上一针位置到当前帧位置移动的距离

 /// <summary>
        /// 计算上一帧到当前帧移动距离
        /// </summary>
        /// <param name="moveDetla"></param>
        /// <returns></returns>
        bool isCameraMove(out Vector3 moveDetla)
        {
            moveDetla = Vector3.zero;
            if (Input.GetMouseButtonDown(0))
            {
                setBeginState();
            }
            else if (Input.GetMouseButton(0))
            {
                Debug.DrawLine(cameraRay.origin, cameraRay.origin + cameraRay.direction * 50, Color.red);
                Vector3 curMousePos = getMouseWorldPos();
                Vector3 detla = curMousePos - curTouchPos;
                if (detla.sqrMagnitude > 0)
                {
                    Vector3 temp = dragCamera.ScreenToWorldPoint(curMousePos);
                    onToutch(temp);
                    moveDetla = dragCamera.ScreenToWorldPoint(startTouchPos) - temp;

                     //计算过相机从上一针位置到当前帧位置移动的位置
                    cameraTargetPos = cameraOriginPos + moveDetla;
                    curDragComeraPos = dragCamera.transform.position;
                    LaunchCameraMove();
                    // moveDetla = temp - dragCamera.ScreenToWorldPoint(startTouchPos);
                    curTouchPos = curMousePos;
                    return true;
                }
            }

            return false;
        } 

二.实现摄像机移动阻尼和曲线移动派生类CameraDragSmoothDamp和CameraDragByCurve

重写CameraDragSmoothDamp的OnCameraMove()实现摄像机阻尼运动效果

 protected override void OnCameraMove()
    {
        base.OnCameraMove();
        if (!isLaunchMove)
        {
            return;
        }

        Vector3 result =
            Vector3.SmoothDamp(dragCamera.transform.position, cameraTargetPos, ref curVelocity, moveTime);
        if (curVelocity == Vector3.zero)
        {
            isLaunchMove = false;
        }

        SetCameraPos(result);
    }

重写CameraDragByCurve的OnCameraMove()实现摄像机曲线运动效果

 protected override void OnCameraMove()
    {
        base.OnCameraMove();
        if (Curve==null)
        {
            return;;
        }
        if (!isLaunchMove)
        {
            return;

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使摄像机跟随鼠标移动,首先需要将摄像机绑定到一个空对象上,这个空对象作为摄像机位置的参考点。然后,使用Input.GetAxis函数获取鼠标在X和Y轴上的移动值,并将其转换为摄像机移动的速度。 接下来是实现的步骤: 1. 创建一个空对象,并将摄像机作为其子对象。 2. 在空对象上添加一个脚本,并将其命名为“CameraFollowMouse”。 3. 在“CameraFollowMouse”脚本中添加以下代码: ``` public float moveSpeed = 0.1f; public float maxAngle = 70f; private Vector3 lastMousePosition; void Start() { lastMousePosition = Input.mousePosition; } void Update() { Vector3 delta = Input.mousePosition - lastMousePosition; lastMousePosition = Input.mousePosition; // 将鼠标移动转换为摄像机移动的速度 float horizontalSpeed = delta.x * moveSpeed; float verticalSpeed = delta.y * moveSpeed; // 计算摄像机应该绕X轴和Y轴旋转多少 float xRotation = transform.rotation.eulerAngles.x - verticalSpeed; float yRotation = transform.rotation.eulerAngles.y + horizontalSpeed; // 约束摄像机绕X轴的旋转角度在[-maxAngle, maxAngle]范围内 if (xRotation > maxAngle && xRotation < 180f) xRotation = maxAngle; else if (xRotation < 360f - maxAngle && xRotation > 180f) xRotation = 360f - maxAngle; // 应用旋转 transform.rotation = Quaternion.Euler(xRotation, yRotation, 0f); } ``` 4. 打开场景,将摄像机拖到空对象下。 5. 调整摄像机的初始位置和旋转角度,以便与游戏画面进行良好的配合。 6. 在场景视图里调整空对象的位置,使摄像机能够正确地跟随鼠标移动。 7. 运行游戏,用鼠标移动来测试摄像机是否能够跟随移动。 ### 回答2: 在Unity中,使摄像机跟随鼠标移动可以通过以下步骤实现: 首先,在场景中创建一个空物体(Empty Game Object),将其命名为"Camera Target"。这个空物体将作为摄像机的目标,跟随鼠标移动。 然后,选中摄像机对象,在Inspector面板中找到"Script"组件,并添加一个新的脚本组件。 在脚本中,我们可以编写以下代码来实现摄像机跟随鼠标移动的功能: ```C# using UnityEngine; public class CameraFollow : MonoBehaviour { public Transform cameraTarget; public float cameraSpeed = 0.1f; private void Update() { Vector3 mousePosition = Input.mousePosition; mousePosition = Camera.main.ScreenToWorldPoint(mousePosition); mousePosition.z = transform.position.z; cameraTarget.position = Vector3.Lerp(cameraTarget.position, mousePosition, cameraSpeed); transform.position = Vector3.Lerp(transform.position, cameraTarget.position, cameraSpeed); } } ``` 在上面的代码中,我们首先定义了一个Transform类型的变量cameraTarget,用于存储摄像机的目标位置。然后,我们可以调整cameraSpeed参数来控制摄像机跟随速度。 在Update()函数中,我们使用Input.mousePosition来获取当前鼠标的屏幕位置,并通过Camera.main.ScreenToWorldPoint()将其转换为世界坐标。为了保持摄像机鼠标平面的位置一致,我们将得到的鼠标位置的Z坐标设置为摄像机的当前Z坐标。 接下来,我们使用Vector3.Lerp()函数来逐渐将摄像机的位置调整到目标位置cameraTarget.position。通过Lerp函数的第三个参数cameraSpeed来控制移动的平滑度。 最后,将上述脚本组件添加到摄像机对象上,然后按下播放按钮,你将看到摄像机跟随鼠标移动的效果。 ### 回答3: 在Unity中,我们可以通过编写脚本来实现摄像机跟随鼠标移动的效果。下面是一个简单的实现方法: 1. 首先,在Unity编辑器中创建一个空物体,并将其作为摄像机的父物体。 2. 在空物体上挂载一个脚本,命名为"CameraFollowMouse"。 3. 在脚本中定义一个公共变量,用于控制摄像机跟随速度: ``` public float followSpeed = 5f; ``` 4. 在`Update()`函数中,将鼠标在屏幕上的坐标转换为世界坐标: ``` Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); ``` 5. 计算摄像机的新位置,使其平滑地跟随鼠标移动: ``` transform.position = Vector3.Lerp(transform.position, mousePosition, Time.deltaTime * followSpeed); ``` 在这里,`transform.position`表示空物体(摄像机的父物体)的当前位置。使用`Vector3.Lerp()`函数可以实现平滑的插值,`Time.deltaTime`用于平衡速度与帧率。 6. 最后,在Unity编辑器中将脚本挂载在空物体上,并运行游戏。 这样,摄像机就会跟随鼠标的移动而平滑移动。可以根据需要调整跟随速度和其他参数来获得最佳效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值