[Unity]/[Unity 2D]

[Unity 2D] 드래그 카메라 이동 (drag camera move)

dogfootman 2023. 7. 22. 03:07

 

 

1. 필요한 변수 선언

        // 상수 : 이동 관련
        private const float DirectionForceReduceRate = 0.935f; // 감속비율
        private const float DirectionForceMin = 0.001f; // 설정치 이하일 경우 움직임을 멈춤

        // 변수 : 이동 관련
        private bool _userMoveInput; // 현재 조작을 하고있는지 확인을 위한 변수
        private Vector3 _startPosition;  // 입력 시작 위치를 기억
        private Vector3 _directionForce; // 조작을 멈췄을때 서서히 감속하면서 이동 시키기 위한 변수

        // 컴포넌트
        private Camera _camera;

 

 

2. Start 함수에서 카메라 컴포넌트 취득

        private void Start()
        {
            _camera = GetComponent<Camera>();
        }

 

 

3. Update 함수 작성

        private void Update()
        {
            // 카메라 포지션 이동
            ControlCameraPosition();

            // 조작을 멈췄을때 감속
            ReduceDirectionForce();

            // 카메라 위치 업데이트
            UpdateCameraPosition();
        }

 

 

4. ControlCameraPosition 함수 작성

        private void ControlCameraPosition()
        {
            var mouseWorldPosition = _camera.ScreenToWorldPoint(Input.mousePosition);
            if (Input.GetMouseButtonDown(0))
            {
                CameraPositionMoveStart(mouseWorldPosition);
            }
            else if (Input.GetMouseButton(0))
            {
                CameraPositionMoveProgress(mouseWorldPosition);
            }
            else
            {
                CameraPositionMoveEnd();
            }
        }

 

 

5. CameraPositionMoveStart 함수 작성

        private void CameraPositionMoveStart(Vector3 startPosition) 
        {
            _userMoveInput = true;
            _startPosition = startPosition;
            _directionForce = Vector2.zero;
        }

 

 

6. CameraPositionMoveProgress 함수 작성

        private void CameraPositionMoveProgress(Vector3 targetPosition)
        {
            if (!_userMoveInput)
            {
                CameraPositionMoveStart(targetPosition);
                return;
            }

            _directionForce = _startPosition - targetPosition;
        }

 

 

7. CameraPositionMoveEnd 함수 작성

        private void CameraPositionMoveEnd()
        {
            _userMoveInput = false;
        }

 

 

8. ReduceDirectionForce 함수 작성

        private void ReduceDirectionForce()
        {
            // 조작 중일때는 아무것도 안함
            if (_userMoveInput)
            {
                return;
            }
            
            // 감속 수치 적용
            _directionForce *= DirectionForceReduceRate;
            
            // 작은 수치가 되면 강제로 멈춤
            if (_directionForce.magnitude < DirectionForceMin)
            {
                _directionForce = Vector3.zero;
            }
        }

 

 

9.  UpdateCameraPosition 함수 작성

        private void UpdateCameraPosition()
        {
            // 이동 수치가 없으면 아무것도 안함
            if (_directionForce == Vector3.zero)
            {
                return;
            }
            
            var currentPosition = transform.position;
            var targetPosition = currentPosition + _directionForce;
            transform.position = Vector3.Lerp(currentPosition, targetPosition, 0.5f);
        }

 

 

Image참조: https://icons8.com/