Unity Camera moves based on mouse or touch

1. Move at the border

When the mouse reaches the boundary of the game interface, it starts to move the camera. It is suitable for PC-side games that require a mouse.

        if (Input.mousePosition.y > Screen.height)
        {
    
    
            m_camFollowPos.y += moveAmount * Time.deltaTime;
        }
        if (Input.mousePosition.y < 0)
        {
    
    
            m_camFollowPos.y -= moveAmount * Time.deltaTime;
        }

        if (Input.mousePosition.x > Screen.width)//如果鼠标位置在右侧
        {
    
    
            m_camFollowPos.x += moveAmount * Time.deltaTime;//就向右移动
        }
        if (Input.mousePosition.x < 0)
        {
    
    
            m_camFollowPos.x -= moveAmount * Time.deltaTime;
        }

        m_camFollowPos.y = Mathf.Clamp(m_camFollowPos.y, m_minCamYPos, m_maxCamYPos);
        m_camFollowPos.x = Mathf.Clamp(m_camFollowPos.x, m_minCamXPos, m_maxCamXPos);
        myCamera.transform.position = m_camFollowPos;//刷新摄像机位置

2. Drag camera while holding mouse/touch

Hold down the mouse and drag the camera on the PC side. Press and drag the camera with one finger on the mobile terminal.

    void Update()
    {
    
    
        if (GameRoot.Instance.isMenuActive)
        {
    
    
            return;
        }

#if (UNITY_ANDROID || UNITY_IPHONE) && !UNITY_EDITOR
			HandleTouchInput();
#else
        HandleMouseInput();
#endif
    }

    void HandleTouchInput()
    {
    
    
        if (Input.touchCount == 1)
        {
    
    
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
    
    
                m_prevPosition = touch.position;
            }
            else if (touch.phase == TouchPhase.Moved)
            {
    
    
                Vector2 curPosition = touch.position;
                MoveCamera(m_prevPosition, curPosition);
                m_prevPosition = curPosition;
            }
        }
    }

    void HandleMouseInput()
    {
    
    
        if (Input.GetMouseButtonDown(0))
        {
    
    
            m_prevPosition = Input.mousePosition;
        }
        else if (Input.GetMouseButton(0))
        {
    
    
            Vector2 curMousePosition = Input.mousePosition;
            MoveCamera(m_prevPosition, curMousePosition);
            m_prevPosition = curMousePosition;
        }
    }

    private void MoveCamera(Vector2 prevPosition, Vector2 curPosition)
    {
    
    
        //注意这里的myCamera.nearClipPlaen。由于我使用的是透视相机,所以需要将z值改为这个
        //如果读者使用的是正交相机,可能不需要这个
        Vector2 offset = (myCamera.ScreenToWorldPoint(new Vector3(prevPosition.x, prevPosition.y, myCamera.nearClipPlane)) - myCamera.ScreenToWorldPoint(new Vector3(curPosition.x, curPosition.y, myCamera.nearClipPlane)));
        //这里的m_cameraScale,因为我不想修改nearClipPlaen的值来达到移动的快慢,所以加了个移动参数
        Vector2 newPos = new Vector2(transform.localPosition.x + offset.x * m_cameraScaleVal, transform.localPosition.y + offset.y * m_cameraScaleVal);
        newPos.y = Mathf.Clamp(newPos.y, m_minCamYPos, m_maxCamYPos);
        newPos.x = Mathf.Clamp(newPos.x, m_minCamXPos, m_maxCamXPos);
        transform.position = new Vector3(newPos.x, newPos.y, transform.position.z);
    }

Guess you like

Origin blog.csdn.net/qq_28644183/article/details/125672893