-
유니티 카메라 확대,축소 / 마우스 드래그 - 카메라 이동 제한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를 지정해주는 함수를 만들어도 될거 같습니다.
반응형'Unity' 카테고리의 다른 글
유니티 인벤토리 - 인벤토리 시스템 (0) 2024.01.23 유니티 데이터 저장/불러오기 - Json 데이터 저장/불러오기 (0) 2024.01.22 유니티 DOTween - 알림창 만들기 (0) 2024.01.18 유니티 마우스 드래그 - 카메라 이동 (0) 2024.01.14 유니티 비동기 로딩 - 로딩 씬 (0) 2024.01.12