Keystore파일을 이용하여 커맨드창에서 APK 서명하기

Keystore파일을 이용하여 커맨드창에서 APK 서명하기


난독화를 한 후 만들어진 apk가 서명되지 않은 상태여서, 빠르고 쉽게 커맨드를 이용하여 apk 서명하는 방법을 찾아서 포스팅합니다.


먼저 apk에 서명이 되어있는지 여부를 확인합니다. APK가 있는 폴더로 이동하여 커맨드 창을 열고 아래 명령어를 입력.


jarsigner -verify <어플이름>.apk



서명이 안되어있으면 아래와 같은 결과가 표시됩니다.


no manifest.

jar is unsigned. <signatures missing or not parsable>


서명이 된 상태라면


jar verified.


로 표시됩니다.



서명이 되어있지 않은 것을 확인했다면, 이제 서명을 할 차례입니다.


명령어는 


jarsigner -verbose -keystore <keystore파일> <서명되지 않은 apk파일> <서명되어 나올 파일 이름.apk>


ex> jarsigner -verbose -keystore gyu.keystore unsigned_gyu.apk signed_gyu.apk


이대로 signed_gyu.apk를 업로드 하려고하면 "Zip 정렬되지 않은 APK를 업로드했습니다." 라는 경고 문구가 뜨고 업로드가 되지 않습니다.  서명한 apk를 재정렬해야만 합니다.


Android SDK가 깔린 폴더로 이동합니다. Android SDK\tools 폴더에서 커맨드창을 열고,


zipalign -v 4 <정렬안된 서명된 apk> <정렬되어나올 완벽한 apk>


ex>zipalign -v 4 signed_gyu.apk gyu.apk



이제  gyu.apk를 플레이 스토어에 업로드 하면 끝~!










[Unity3D] Google Play Store APK 릴리즈 모드

구글 플레이 스토어 APK 릴리즈 모드





구글 플레이 스토어에 APK를 업로드시 릴리즈 모드로 올리라는 표시가 될 때가 있는데,

릴리즈 모드에는 개발자의 서명인 Keystore 파일이 있어야합니다.


같은 프로젝트라면 한 번 적은 서명은 계속 쭉 똑같이 사용해야합니다. 

같은 프로젝트이지만 서명이 다르다면 업로드가 되지 않습니다.



1. File/Build Settings/Publishing Settings or 

Edit/Project Settings/Player/Publishing Settings를 열어보면 Keystore, Key를 Inspector창에서 확인할 수 있습니다.


2. 처음 생성시에는 Create New Keystore를 체크하며, 이 다음부터는 Use Existing Keystore를 선택하고 이전에 입력한 Password를 입력하여 진행하면됩니다.


3. Browse Keystore버튼을 눌러서 keystore파일을 저장할 이름위치를 지정합니다.


4. Keystore password, Confirm password를 적어도 6글자이상 입력해야합니다. 이둘이 불일치할 경우 다음으로 진행하지 못하므로 잘입력해주세요.


5. Key에 Alias Unsigned(debug) 콤보박스를 클릭하여 Create a new Key를 선택합니다.



6. Create a new Key를 선택하면 아래와 같은 창이 뜨게됩니다.



7. Alias, Password, Confirm, Validity(years) 이 4가지만 입력을 하고, 이외의 정보는 입력하지 않아도 Key가 생성이 됩니다.


Alias는 원하는 Key 이름Validity(years)는 이 Keystore의 유효기간입니다. 기간이 짧을 경우 앱 등록시 경고가 뜨게 됩니다. 기본 50년으로 설정되어있는데 그대로 놔두고 key를 생성합니다.

 

8. 입력이 완료되었으면, Alias 콤보박스로 입력한 key를 선택하고, password를 적습니다.


맨아래 Split Application Binary 체크박스가 있는데, 이것은 keystore와는 상관 없이 .obb파일을 생성하는지에 대한것이므로, 체크안하셔도 됩니다.



이대로 Build를 하면 릴리즈 모드가 완성됩니다.






[Unity3D] 최적화 된 캐릭터 모델링

최적화 된 캐릭터 모델링




  • 스킨 입혀진 메쉬 렌더러를 하나만 사용하라.

캐릭터는하나의 스킨 입혀진 메쉬 렌더러(Skinned MeshRenderer)를 사용해야 한다.  다수의 메쉬들을 사용할 이유는 없다.


  •  많은 재질을 사용하지 말아라.

재질의 수를 최소로 유지해야하며 캐릭터에 하나 이상의 재질을 갖고자 할 때 그이유는 한가지이다. 다른 셰이더의 사용이 필요한 경우. 하지만, 캐릭터당 2-3개의 재질이면 충분하다


  •  뼈대의 총 사용량을 줄여라

보통 게임들은 15-60개 정도의 뼈대로 구성된 뼈대 계층을 사용한다. 30개 정도의 뼈대라면 충분히 좋은 품질을 만들어 낼 수 있다. 30개 정도로 하기를 권한다. 폴리곤 개수 500 -6000개 사이의 삼각형이 적당하다.


  • IK와 FK를 분리하라.

역방향의 운동학(IK)과 정방향의 운동학(FK)을 분리해라. 애니메이션이 임포트 될 때 IK 노드들은 FK로 변한다.  Unity는 IK노드를 전혀 필요로 하지 않는다.


[Unity3D] 카메라 광선 (Ray)

카메라 광선 (Rays)




유니티 공식 문서 

http://unitykoreawiki.com/index.php?n=KrMain.CameraRays





Rays가 뭐죠?


시작점(Origin), 방향(Direction)을 가지고, 시작점에서 정해진 방향으로 광선을 쏩니다.

Camera에서 한방향으로 광선을 쏘는거죠.



Camera 클래스에는 2가지 기능이 있습니다.

 ScreenPointToRay 

 픽셀 좌표로 제공됩니다. 왼쪽아래(0 , 0), 오른쪽위(pixelWidth, pixelHeight)



 ViewportPointToRay

 0~1범위 내에서 정규화 된 좌표입니다. 왼쪽아래(0 , 0) 오른쪽위(1 , 1)





Ray로 뭘 할 수 있죠?



카메라에서 광선을 뙇 쏴서 

어떤 물건을 바라보고 있는지, 유저가 클릭한게 뭔지를 알 수 있습니다.

Ray로 광선을 쏘고, Ray를 따라가는 RayCasting으로 알아낼 수 있습니다.




레이 캐스팅 (RayCasting)?


Raycast는 '가상의 레이저빔!!'입니다. 

해당 Ray를 따라서 충돌체(Collider)에 부딪힐 때까지 전송을 합니다.

부딪힌 오브젝트에 대한 정보와 부딪힌 지점이 반환됩니다.





글만봐서는 이해가 잘 안갈수도 있지만 예제코드를 보시면 이해가 가실거에요.


마우스 위치에 있는 오브젝트 알아 내기 코드

private RaycastHit hit = new RaycastHit();

private Ray ray;

void Update()

{

     ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if(Physics.Raycast(ray, out hit)
    {
       Transform objectHit = hit.transform;
    }
}



광선이 어딜 쏘는지 보고 싶어요!


아래 코드를 적용하면 카메라의 광선을 Scene View에서 확인 가능합니다.

그냥 광선은 빨간색으로 표현하고, 어떠한 물체에 부딪히면 초록색 광선을 쏘도록 했습니다.



   


[Unity3D] 드로우 콜(Draw Call)?

Draw call




‘Draw Call’ 이 뭔가요?


Scene에 있는 Vertex들을 그리기위해 CPU가 GPU에 보내는 요청이지요. 요청을 보낼 때마다 DrawCall이 추가됩니다.


카메라를 통해 한 프레임의 화면을 만들어 내는 동안

1개의 셰이더 패스, 1개의 Material로 오브젝트를 1번 그리는 작업의 단위입니다.


같은 Shader, 같은 Material을 갖는 여러 개의 오브젝트는 1번의 Draw Call로 작업합니다.


예를들어,

화면에 Cube_1, Cube_2를 만듭니다.


Cube_1Material_1을 적용시키죠. Draw Call은 1입니다.

Cube_2Material_2를 적용시키면? Draw Call은 2입니다.


Draw Call이 하나 더 추가됐다니!

Cube_2Material_1을 적용합니다. Draw Call은 1이됩니다.



Material을 공유하지 않는 2 개의 오브젝트들을 함께 결합하는 것은 

성능상 아무런 개선을 주지 않는다는 것을 명심해주세요.


Draw Call수를 줄이는 일이 최적화에서 가장 중요한 요소입니다.




Unity에서 Draw Call은 어떻게 보나요?

Draw Call 확인.PNG

<Game View>에서 상단에 Stats라는 버튼 클릭 후 Draw Call 확인.

그외에 FPS, 버텍스 수, 사용한 텍스쳐량, 화면크기 등 확인가능합니다.  





Draw Call을 어떻게 줄이나요?


유니티에서 제공을하는 배칭(Batching)기술을 사용하는거지요.

배칭 기술에는 정적배칭(Static Batching), 동적 배칭 (Dynamic Batching)2개가 있습니다. 이게 무엇인지는 나중에 이야기하죠. Draw Call을 줄이는 방법부터 볼게요.

먼저 아래 항목을 봐주세요.


1. 가능한 많은 오브젝트를 1개의 Material(1장의 텍스쳐)로 묶어야 합니다.

2. 정적배칭(Static Batching), 동적 배칭 (Dynamic Batching) 기능을 켜라. (기본으로 설정되어있음)

메뉴 Edit> Project Settings > Player  


Dynamic Batching.PNG





'배칭(Batching)'이라니요?


자동적으로 DrawCall을 줄여주는 기술이고, CPU가 GPU에 렌더링 요청을 할 때 

데이터 처리 작업을 한꺼번에 해줘서 GPU의 부담을 줄이게 해주는 것입니다.

2개가 있는데 정적배칭, 동적배칭이 있습니다.


이 2개를 켜두면 모든 오브젝트를 공유된 Material 단위로 묶습니다.

(스크립트에서 수정할 때는 materil 멤버변수 대신 sharedMaterial 멤버를 사용합니다!)




1. 동적 배칭

    • 버텍스 300개 이상인 오브젝트는 안하는게 좋다.

    • Material을 기준으로 Scene에 보이는 오브젝트들을 그룹으로 묶어 분류한다.


2. 정적 배칭(Static Batching)

    • 배칭을 위한 300개의 버텍스 상한선이 없다.

    • 동적 배칭과 유사하지만 배칭하려는 오브젝트를 움직일 수 없다.

    • 움직이지 않는 오브젝트는 Static을 체크한다. (static으로 설정된 GameObject에서 동일한 재질을 사용하는 물체가 있는 경우 자동으로 통합)



Static 설정.PNG