ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 카메라 확대,축소 / 마우스 드래그 - 카메라 이동 제한
    Unity 2024. 1. 16. 16:16
    반응형
    [내용]

    안녕하세요

    오늘은 저번에 공부했던 카메라 이동 및 확대/축소에서 이어집니다!

    카메라가 배경이미지를 넘어 갈 수 없게 설정하고, 마우스 휠을 이용해 확대, 축소를 하게 구현해봤습니다

     

    [변수]
    #region 변수
    [SerializeField] private Camera mainCamera;
    [SerializeField] private float zoomSpeed;
    [SerializeField] private float dragSpeed;
    [SerializeField] private float minCamSize;
    [SerializeField] private float maxCamSize;
    [SerializeField] private SpriteRenderer mapRenderer;
    
    private bool mouseLeftClick;
    private bool mouseLeftClickDown;
    private float zoomValue;
    private float mapMinX;
    private float mapMinY;
    private float mapMaxX;
    private float mapMaxY;
    private Vector3 dragOrigin;
    #endregion // 변수
    • 마우스 휠 스피드와, 배경이미지를 인스펙터에서 변경 가능하게 직렬화 했습니다.
    • 맵 최대, 최소 값을 저장할 변수와 입력을 받는 bool 변수를 추가했습니다.

     

    [입력처리 함수]
    /** 카메라 입력처리 */
    private void CameraInput()
    {
        zoomValue = Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        mouseLeftClick = Input.GetMouseButton(0);
        mouseLeftClickDown = Input.GetMouseButtonDown(0);
    }
    • 입력을 처리하는 함수를 만들어서 관리합니다.

     

    [맵 크기 계산]
    /** 맵 최대,최소 계산 */
    private void MapSizeCaculate()
    {
        // 맵 SpriteRenderer의 절반 값 구하기
        mapMinX = mapRenderer.transform.position.x - mapRenderer.bounds.size.x / 2f;
        mapMaxX = mapRenderer.transform.position.x + mapRenderer.bounds.size.x / 2f;
    
        mapMinY = mapRenderer.transform.position.y - mapRenderer.bounds.size.y / 2f;
        mapMaxY = mapRenderer.transform.position.y + mapRenderer.bounds.size.y / 2f;
    }
    • 맵의 최대, 최소 값을 구합니다

     

    [카메라가 움직일 수 있는 위치 계산]
    /** 카메라가 움직일 수 있는 위치 계산 */
    private Vector3 LimitMoveCamera(Vector3 targetPosition)
    {
        // 절반 높이, 넓이 구하기
        float cameraHeight = mainCamera.orthographicSize;
        float cameraWidth = mainCamera.orthographicSize * mainCamera.aspect;
    
        // 최대, 최소 값 구하기
        float minX = mapMinX + cameraWidth;
        float maxX = mapMaxX - cameraWidth;
        float minY = mapMinY + cameraHeight;
        float maxY = mapMaxY - cameraHeight;
        
        // 카메라 제한된 범위 값
        float newX = Mathf.Clamp(targetPosition.x, minX, maxX);
        float newY = Mathf.Clamp(targetPosition.y, minY, maxY);
    
        // 값 반환
        return new Vector3(newX, newY, targetPosition.z);
    }
    • 카메라가 움직일 수 있는 위치를 계산하고 반환합니다.

     

    [카메라 확대 / 축소]
    /** 카메라를 확대,축소한다 */
    public void CameraZoomInOut()
    {
        if(zoomValue == 0) { return; }
        // 크기 계산
        float newSize = mainCamera.orthographicSize - zoomValue;
    
        // 축소 제한
        mainCamera.orthographicSize = Mathf.Clamp(newSize, minCamSize, maxCamSize);
    
        // 카메라 움직임 제한
        mainCamera.transform.position = LimitMoveCamera(mainCamera.transform.position);
    }
    • 변경된 확대,축소 함수 입니다.

     

    [실행]
    /** 초기화 */
    private void Awake()
    {
        // 맵 크기 계산
        MapSizeCaculate();
    }
    
    /** 초기화 => 상태를 갱신한다 */
    private void Update()
    {
        // 카메라 입력처리
        CameraInput();
        // 카메라 드래그
        CameraDrag();
        // 카메라 확대,축소
        CameraZoomInOut();
    }
    • Awake에서 맵 크기를 계산합니다.
    • Update에서 카메라 드래그, 확대,축소를 실행합니다.

    * 카메라 orthographicSize가 배경보다 커질 경우 카메라가 고장나는 경우를 볼 수 있습니다.
    * 카메라 MaxCamSize를 활용해 축소 사이즈를 제한하면 됩니다.

    * 배경이미지 크기에 따라 MaxCamSize, MinCamSize를 지정해주는 함수를 만들어도 될거 같습니다.

     

     

    반응형
Designed by Tistory.