Unity中实现鼠标拖拽移动相机操作

文章介绍了在Unity编辑器和Android平台上,如何通过记录鼠标或触屏的移动距离和方向来同步调整相机的移动。使用Raycast方法检测碰撞并计算移动量,限制在预设范围内进行平滑移动。
摘要由CSDN通过智能技术生成

主要思路是鼠标拖拽的时候,记录下移动的距离和方向,然后同步操作相机的移动。

代码如下:

private void Update()
        {
#if UNITY_EDITOR
            if (Input.GetMouseButtonDown(0))
            {
                Debug.Log("Mouse Button Down");
                
                Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitInfo;
                if (Physics.Raycast(myRay, out hitInfo))
                {
                    _startPosition = hitInfo.point;
                }

                _isDragging = false;
            }
            
            if (Input.GetMouseButtonUp(0))
            {
                Debug.Log("Mouse Button Up");
                
                _isDragging = false;
            }

            if (!_isDragging && Input.GetMouseButton(0))
            {
                Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitInfo;
                if (Physics.Raycast(myRay, out hitInfo))
                {
                    Vector3 length = hitInfo.point - _startPosition;
                    if (length.sqrMagnitude > 0.01f)
                    {
                        _isDragging = true;
                    }
                }
            }
            
            ScrollCameraSize();
#elif PLATFORM_ANDROID
            StringBuilder logSb = new StringBuilder();
            if (Input.GetTouch(0).phase == TouchPhase.Began)
            {
                logSb.AppendLine("Finger DOWN");
                _slgui.ShowLog(logSb.ToString());
                
                Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitInfo;
                if (Physics.Raycast(myRay, out hitInfo))
                {
                    _startPosition = hitInfo.point;
                }

                _isDragging = false;
            }
            
            if (Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                logSb.AppendLine("Finger Dragging");
                _slgui.ShowLog(logSb.ToString());
                
                _isDragging = true;
            }
            
            if (Input.GetTouch(0).phase == TouchPhase.Ended)
            {
                logSb.AppendLine("Finger UP");
                _slgui.ShowLog(logSb.ToString());
                
                _isDragging = false;
            }
#endif

            if (_isDragging)
            {
                Ray myRay = _bgCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitInfo;
                if (Physics.Raycast(myRay, out hitInfo))
                {
                    Vector3 move = (hitInfo.point - _startPosition);
                    float length = Vector3.SqrMagnitude(move);
                    
                    Vector3 normalMove = Vector3.Normalize(move);
                    _horizontal = -normalMove.x * _dragSpeed * length;
                    _vertical = -normalMove.z * _dragSpeed * length;
                    MoveOffset(_horizontal, _vertical);
                }
            }
        }

  
        private void MoveOffset(float horizontal, float vertical)
        {
            Vector3 offset = Vector3.zero;
            offset.x = horizontal * 0.2f;//moveSpeed * Time.deltaTime
            offset.z = vertical * 0.2f;//moveSpeed * Time.deltaTime

            bool changePos = false;
            var bgPos =   _bgCamera.transform.position + _bgCameraRight * offset.x * _moveAngel + _bgCameraForward * offset.z * _moveAngel * _moveAngelOffset;

            if (bgPos.x < _bgCameraMinX || bgPos.x > _bgCameraMaxX)
            {
                offset.x = 0;
                changePos = true;
            }

            if (bgPos.z < _bgCamerMinZ || bgPos.z > _bgCameraMaxZ)
            {
                offset.z = 0;
                changePos = true;
            }

            var bgNewPos = changePos
                ? _bgCamera.transform.position + _bgCameraRight * offset.x * _moveAngel + _bgCameraForward * offset.z * _moveAngel * _moveAngelOffset
                : bgPos;

            _bgCamera.transform.position = Vector3.Lerp(_bgCamera.transform.position, bgNewPos, Time.deltaTime*moveSpeed);
            var cameraPos = _camera.transform.position +  _mainCameraRight * offset.x + _mainCameraForward * offset.z;
            _camera.transform.position = Vector3.Lerp(_camera.transform.position, cameraPos, Time.deltaTime*moveSpeed);
        }

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值