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/
'[Unity] > [Unity 2D]' 카테고리의 다른 글
[Unity 2D] 아이소메트릭의 맵에서 카메라 범위 제한하기 (Constraining Camera Ranges in Isometric Maps) (0) | 2023.07.23 |
---|---|
[Unity 2D] 마우스 위치 기준으로 카메라 줌인 줌아웃 (Camera zoom in zoom out based on mouse position) (0) | 2023.07.22 |