Bootstrap

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

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

代码如下:

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

;