반응형

 

 

 

 

유니티 엔진의 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) 값을 곱해서 사용해준다.

 

 

 

결과

 

 

 

 

 

 

반응형
반응형

※ 본 포스팅은 유니티 버전 2018.4.20(LTS)을 대상으로한 솔루션입니다.


구글 플레이 업로드를 위해 안드로이드 빌드를 하던중 갑자기 에러를 발견하게 된다.

 

com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed

 

하루 전까지만 해도 잘 되던 빌드가 위와 같은 에러가 뜨면서 진행되지를 않는다.

처음보는 에러에 검색을 해봤지만.. 유니티에서 문제가 된 사람은 거의 없던건지, 잘 못찾았던건지 안드로이드 스튜디오에서 작업한 사람의 문의글로 가득한 페이지를 보면서 이것저것 따라해보기 시작했다.

 


시도 1) 안드로이드 스튜디오 업데이트

 

2018 버전으로 작업한 프로젝트이기에 유니티에서 제공하는 SDK를 사용하지 않고 안드로이드 스튜디오에서 받은 SDK를 사용중이라 시도를 해봤다.

 

안드로이드 스튜디오 몇몇 버전이 AAPT2라는게 기본적으로 사용되어진다고 해서 최신버전으로 바꾸거나 AAPT2를 비활성화 하라는 내용인데, Unity에 대한 설명이 아니라서 일단 안드로이드 스튜디오를 최신버전으로 변경후 빌드를 시도해봤다.

 

결과 : 실패


시도 2) .android .gralde 폴더 제거

 

이 시도는 스택오버플로우에서 보게된것인데, 위의 폴더를 제거하면 빌드가 된다고하는 내용이었다.

※ 위의 폴더들은 C:\Users\UserName 폴더 안에 존재한다.

 

.android, .gradle 폴더 삭제후 빌드를 시도해봤다.

 

결과 : 실패


시도 3) mainTemplate.gradle 설정

 

이 시도는 gradle 버전을 수정하여 해결하는 방법이다.

 

유니티 Build setting - Publishing setting에 Main gralde template를 체크해주면 플러그인 폴더에 mainTemplate 파일이 생성된다.

 

해당 파일을 열면 dependencies 항목에 다음과 같이 적혀있다.

dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
**BUILD_SCRIPT_DEPS**}
}

필자의 경우엔 위와 같이 gradle 버전이 3.4.0으로 되어있었는데, 해당 부분을 3.3.2로 변경후 저장, 빌드를 시도해봤다.

 

결과 : 성공

 


급하게 해결해야 했던 상황이라, 왜 저게 되는건지 자세한 사항은 파악하지 못했지만.. 일단 무사히 빌드가 되는것에 안도하고 위기를 넘기게 되었다.

 

자세한 사항은 추후 파악 후 서술할 예정.

반응형

+ Recent posts