물에 살고싶은 개발자

카메라 확대축소와 축소시에 강제이동 본문

Unity3D

카메라 확대축소와 축소시에 강제이동

돼지사랑 2015. 12. 14. 19:54

이번 글은 카메라 확대축소와 확대축소를 했을때 원치않는부분, 예를들면 맵의 바깥부분이 찍히지 않도록

제한하는 방법이다.


내가 구현한 방법론을 써보자면..

확대축소는 생각보다 간단한편이다.

두개의 터치포인트의 위치사이에 거리벡터를 처음 터치했을때와

드래그할때의 값을 비교해 멀어지면 축소하고 가까워지면 확대하면 된다.

아래 코드를 보자.

if( touchCount == 2 )
{
	Touch touch1 = Input.GetTouch(0);
	Touch touch2 = Input.GetTouch(1);
	
	if( touch1.phase == TouchPhase.Began || touch2.phase == TouchPhase.Began )
	{
		PreTouchDistance = Vector2.Distance( Input.touches[0].position , Input.touches[1].position );
	}
	
	if( touch1.phase == TouchPhase.Moved || touch2.phase == TouchPhase.Moved )
	{
		NowTouchDistance = Vector2.Distance( Input.touches[0].position , Input.touches[1].position );
		
		if( PreTouchDistance > NowTouchDistance )
		{
			ZoomOut(); 
		}
		else if( PreTouchDistance < NowTouchDistance )
		{
			ZoomIn(); 
		}
		SizeCal();
	}
	
	PreTouchDistance = NowTouchDistance ;
}

사실 확대축소는 크게 어려울게 없는편이다.

문제는 이 확대축소를 할때에 카메라를 강제로 이동시키는 것이다.

만약 최대 구석까지 카메라를 옮긴 상태에서 축소하게 된다면 애초에 내가 원하지 않았던 부분까지 렌더링이 된다

말로 설명하기가 애매하니까 이미지로 보자면

오른쪽을 보면 맵의 바깥부분까지 찍히게 된다.

이 전 포스팅에서 써둔것처럼 이동제한을 걸어둔 상태에서 하더라도 마찬가지로 위 이미지와 같은 결과가 나오는걸 막아보자.

일단 방법론적으로는 이렇다.

미리 지정해둔 카메라의 Size 최소값 / 현재사이즈를 계산하면 

현재 사이즈의 배율이 나온다. 예를들면 최소값이 2라고 했을때, 현재 사이즈가 4라면

최소값의 2배이므로 2라는 값이 나온다.

이 사이즈값을 미리 노가다를 통해 구해둔(씬뷰에서 최대와 최소사이즈로 일일이 움직이며 구한 포지션값...) 값들의 

최대값과 최소값을 뺀 값에 위에서 구한 사이즈 배율을 곱하면 

원하는 포지션값이 나오게 된다.


말로 써놓고보니 복잡한듯 심플한듯하니 코드를 보자

void SizeCal()
{
	SizePer = SizeMin / Camera.main.orthographicSize ;
	
	for( int i = 0 ; i < SideCoordinate.Length / 2  ; i++ )
	{
		GapXY[i] = SideCoordinate[ MaxIndex , i ] - SideCoordinate[ MinIndex , i ] ;
		SideXY[i] = SideCoordinate[ MaxIndex , i ];
		SideXY[i] -= GapXY[i] * SizePer;
	}
}

이렇게 해두고 확대축소할때마다 호출해주면 SideXY 배열에 실시간으로 위치를 계산해서 넣어주게 된다.


끝!

Comments