반응형
유니티 엔진의 Input 클래스에는 touch라는 구조체가 존재한다. 이 touch라는 구조체의 정보를 바탕으로 모바일 환경에서의 제스처기능을 적용해 카메라를 이동하거나 줌 인/아웃 기능을 구현할 수 있다.
카메라 이동
using UnityEngine
enum GESTURE
{
MOVE = 1,
ZOOM,
}
private void MoveCam()
{
if (Input.touchCount == (int)GESTURE.MOVE)
{
Touch touch = Input.touches[0];
Camera.main.transform.position = new Vector3(
Camera.main.transform.position.x - touch.deltaPosition.x,
Camera.main.transform.position.y - touch.deltaPosition.y,
Camera.main.transform.position.z);
}
}
- Touch 구조체에는 deltaPosition이 존재하는데 이전 프레임과 현재 프레임 사이의 움직인 벡터 값을 받을 수 있다.
- 이 벡터 값을 이용해서 카메라의 위치를 변경해주면 된다.
- deltaPosition을 바로 적용해주면 카메라가 엄청 빠르게 움직이니 해당 값에 speed(float) 값을 곱해서 적용해준다.
- 간단하게 보여주기 위해 작성된 코드로, Camera.main의 카메라 클래스는 캐싱해서 사용하는게 최적화에 도움이 된다.
카메라 줌 인/아웃
private void ZoomCam()
{
if (Input.touchCount == (int)TOUCH.ZOOM)
{
Touch touch_1 = Input.touches[0];
Touch touch_2 = Input.touches[1];
//이전 프레임의 터치 좌표를 구한다.
Vector2 t1PrevPos = touch_1.position - touch_1.deltaPosition;
Vector2 t2PrevPos = touch_2.position - touch_2.deltaPosition;
//이전 프레임과 현재 프레임 움직임 크기를 구함.
float prevDeltaMag = (t1PrevPos - t2PrevPos).magnitude;
float deltaMag = (touch_1.position - touch_2.position).magnitude;
//두 크기값의 차를 구해 줌 인/아웃의 크기값을 구한다.
float deltaMagDiff = prevDeltaMag - deltaMag;
Camera.main.orthographicSize += deltaMagDiff;
Camera.main.orthographicSize = Mathf.Clamp(Camera.main.orthographicSize, 7, 30);
}
}
- 줌 기능은 카메라 이동 코드와는 다르게 조금 복잡한데, 결론적으로 이전 프레임과 현제 프레임의 두 터치 사이의 벡터 크기(Maginitude) 값을 이용해서 deltaMagnitude 값을 구한다.
- 이렇게 구해진 deltaMagnitude 값을 Camera의 orthographicSize에 더해주면 줌 인/아웃 기능 구현이 가능하다.
- orthographicSize가 너무 작아져서 음수로 내려가면 화면이 뒤집어져 보이므로 Mathf.Clamp로 적절하게 최소, 최대값을 고정해준다.
- deltaMagnitude 값을 바로 적용하면 줌이 빠르게 적용되니 해당 값에 speed(float) 값을 곱해서 사용해준다.
결과
반응형
'Develoment > Unity' 카테고리의 다른 글
[유니티] NavMeshAgent 회전이 느린 문제 (0) | 2022.06.03 |
---|---|
[유니티] Navigation Bake, NavMeshAgent Component (0) | 2022.06.03 |
[유니티] Android 펀치홀, iOS 노치 UI SafeArea 적용하기 (0) | 2022.02.01 |
[유니티] 이벤트 함수 - 1 (Awake, Start, OnEnable, Update, FixedUpdate, LateUpdate) (0) | 2022.01.31 |
[유니티] Generic singleton(제네릭 싱글톤) 클래스 제작 (0) | 2022.01.26 |