이글은 핸드폰번호를 유니티에서 써먹기 위해 이틀간의 삽질 및 구글 검색등등으로 해결한 나의 노고를-_-
은 개뿔 안잊어먹으려고 정리할 겸 남겨둔다.
(참고로 난 기본 자바는 알고있고, 안드로이드쪽은 하나도 모르는 유니티 개발자다.)
1. 기본적으로 핸드폰 번호와 같은 기계 정보(혹은 유니티에서 제어되지 않는 디테일한 것들..)를 가져오기 위해서는 유니티에서는 불가능하다고 한다. 그런고로 JDK, 안드로이드 SDK, 이클립스 그리고 안드로이드 프로젝트를 생성할 수 있는 안드로이트 개발 툴킷 설정을해야한다.
당연히 유니티는 설치되어있다고 가정하고... 아무튼 이부분은 인터넷 찾아보면 열나 많으니 문제가 되지 않을것으로 본다.
2. 이클립스에서 먼저 프로젝트를 만들던 유니티에서 먼저 작업을해서 AndroidManifest.xml을 만들던 순서가 중요하지는 않은 것 같다. 난 이클립스로 먼저 플젝을 만들기로 함.
3. 난 이클립스 케플러 버젼으로 쓰는데 .. 검색해보면 대부분 이전 이클립스 버젼을 사용하고 있어서 약간 메뉴에서 보이는게 다를 수 있는데, 아래의 이미지로 안드로이드 프로젝트를 만들면 된다.
어플리케이션 이름과 플젝 이름은 그냥 Test와 같은 단어식으로 기재하면 되고(이부분은 딱히 무슨단어를 쓰건 상관없다), 중요한건 패키지 이름인데.. 이부분은 나중에 유니티에서 설정할 부분하고 동일하게 쓰면 AndroidManifest.xml에서 수정할일이 없어진다. 수정자체가 간단하긴 하지만ㅋㅋ SDK 버젼은 각자가 적절하게 셋팅.
아래 이미지에서는 건드릴거 없이 그냥 넥스트 ㄱㄱ
아래 이미지 역시 그냥 넥스트 ㄱㄱㄱ
아래 이미지 역시 그냥 넥스트..
이부분은 그냥 넘어가도 되고 약간 변경해도 되는데 나중에 AndroidManifest.xml에서 진입할 부분을 지정할때 사용할 Activity name이라고 생각하믄 된다. 그런고로 변경없이 그냥 넥스트해도 아무런 무리가 없음.
4. 그러면 아래와 같이 플젝이 만들어지면서 에디터 창이 열릴텐데 MainActivity.java에서 필요없는 부분(붉은색 처리한 두부분)은 삭제를 과감하게 !!
5. 그다음 MainActivity가 유니티로 정보를 보내줄수 있도록 유니티에서 사용하는 클래스를 상속받아야 함. 그런고로 유니티를 기본 경로로 설치했다면 아래 폴더에 있는 classes.jar 파일을 이클립스로 복사해야한다. (사실 굳이 가져오지 않아도 나중에 jar 파일 만들때는 뺄꺼라 상관없긴 하지만 이클립스 상에서 저걸 복사 안해두고 코딩하면 붉은색 라인들이 축제를 벌이는걸 볼수가 있음. 개인적으로 노란줄 뜨는것도 엄청 싫어해서ㅋㅋ 그리고 복사하는게 어려운게 아니라 코딩도 수월해지므로 꼭 복사하도록~)
복사방법은 classes.jar 파일을 드래그앤 드랍으로 이클립스 왼쪽 창에 보이는 libs 로 옮겨도 되고 컨트롤 c / v 도 먹음. 복사할땐 당연히 카피!
C:\Program Files\Unity\Editor\Data\PlaybackEngines\androiddevelopmentplayer\bin
6. 난 핸드폰 번호만 가져올 생각임. 코딩시 순서대로 코딩할텐데 코딩하다가 스펠링도 정확히 적었음에도 빨간줄이 가면 마우스 오버했을때 툴팁을 보고 import해도 되고, 이클립스의 컨트롤 쉬프트 m 을 사용해도 알아서 임포트함 ㅇㅇ; 쨌던 임포트는 코딩 다하고 해도 문제없으니까 ..
* onCreate 메소드는 아마 진입 시점에서 가장 먼저 호출되는 메소드로 추정함.. 아마 맞을껀데 귀찮아서 찾아보진 않았음.
* 캐스팅 연산자 나 기타 등등 자바 문법 해석은 안하겠음.. 여기에 기재된 클래스및 메소드들이 어떤 역할을 하는지가 중요함.
* UnitySendMessage
첫번째 인자는 해당 메소드가 실행되면 유니티로 값을 전달할때 유니티의 하이라키 상에서의 오브젝트 이름으로 찾아 해당 오브젝트로 값을 전달한다는 의미고,
두번째 인자는 해당 오브젝트에 추가된 스크립트들중 전달하고자 하는 데이터를 처리할 함수를 지정하는 것이고,
세번째 인자는 당연히 전달할 데이터를 의미함.
// 패키지 명은 뺐음.. 코딩시 당연히 패키지는 기재되어 있어야함.
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
public class MainActivity extends UnityPlayerActivity {
public static String PhoneNumber = "";
TelephonyManager tm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
PhoneNumber = tm.getLine1Number();
}
public void GetPhoneNumber(){
UnityPlayer.UnitySendMessage("DataObject", "CheckPhoneNumber", PhoneNumber);
}
}
6. 위와 같이 코딩이 끝났다면 이제 작업한 것들을 jar로 빼야 한다.
왼쪽에 보이는 src 하위 에 MainActivity.java 가 포함된 패키지에서 오른쪽 클릭을 하고 아래의 이미지 순서대로 고고~
아래 이미지에서 붉은색부분에 jar파일을 생성할 위치 지정하고 피니쉬하면 해당 경로에 jar가 생성됨.
7. 이제 이클립스에서 작업하는건 다 끝났으므로 이클립스는 종료. 유니티에서 새프로젝트를 만든 후 빈 오브젝트를 하나 만든다.
빈 오브젝트 이름은 DataObject 로 MainActivity에 있는 메소드 매개변수와 동일하게 만든다.
8. 빈 스크립트를 만들고 DataObject 에 드래그앤드랍으로 추가한다.
9. 스크립트 내용을 아래와 같이 작성한다. 보통 웹에 있는 다른 예제들은 OnGUI 함수를 이용하는데, 난 NGUI로 좀이따 버튼을 만들 생각임을 참고.
using UnityEngine;
using System.Collections;
public class DataObjectScript : MonoBehaviour {
private AndroidJavaObject currentActivity;
private string _PhoneNumber;
public UILabel _ViewLabel;
void Awake()
{
// 현재 활성화된 액티비티를 얻어와 미리 준비한 변수에 저장.
AndroidJavaClass AJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
currentActivity = AJC.GetStatic<AndroidJavaObject>("currentActivity");
if (currentActivity != null)
{
// MainActivity에 있는 GetPhoneNumber 메소드를 데이터를 전달받기 위해 호출함.
currentActivity.Call("GetPhoneNumber");
}
}
// NGUI에서 사용할 함수.
void ViewPhoneNumver()
{
_ViewLabel.text = _PhoneNumber;
}
// MainActivity에 있는 GetPhoneNumber 메소드가 실행되어 데이터를 받을 함수.
void CheckPhoneNumber(string arg)
{
_PhoneNumber = arg;
}
}
10. 기본적인 NGUI 버튼 및 라벨 설정 부분은 설명없이 넘어감..ㅇㅇ;
11. 스크립트에 View Label로 사용할 라벨을 드래그앤드랍으로 연결한다.
12. 이제 거의 막바지 작업으로 넘어가는데... 컨트롤 쉬프트 B 입력해서 빌드 셋팅으로 간다음.
- 안드로이드로 스위치 플랫폼
- 플레이어 셋팅
- Other settings 에 있는 Bundle Identifier 부분에 이클립스에서 만든 패키지명 그대로 설정해준다.
- 그리고 폰으로 테스트 해볼건데 테스트라 하더라도 세로모드면 보기도 이쁘지 않음.
Resulution and Presentation 에서 Default Orientation을 Landscape Left 로 변경한다. (이부분은 주로 게임만들때 많이 변경되는 부분인데 좀이따 AndroidManifest.xml에서 맞춰줘야 앱이 정상동작함).
13. 빌드 설정에서 Scenes In Build 부분에 씬을 추가하지 않아도 된다고 했는데 일단 난 씬은 추가함.. 안해도 상관없긴 하더라...
14. 이제 빌드를 해서 AndroidManifest.xml 을 유니티에서 생성해줘야 한다.
이클립스에서 생성된걸로 작업하면 좀 번거로운 부분이 있어서 이렇게 하는게 개인적으로는 편했음)
그러면 빌드하기 직전 셋팅은 아래 그림과 같게 되겠음.
* Assets에 Plugins 폴더를 만들고 그안에 Android 폴더를 만들어 둔다. (여기에 좀이따 파일을 넣을 예정임)
15. 빌드! 이때 apk를 어디다 만들던, 어떤 이름으로 만들던 상관없음.
16. 빌드를 하고 나면 프로젝트가 생성된 폴더로 접근하고 해당 프로젝트 안에 Temp / StagingArea 폴더안에 있는 AndroidManifest.xml을 아까 만든 Plugins/Android 폴더안에 드래그 앤 드랍으로 넣고 이클립스에서 Export 한 Jar 파일도 넣는다. 그럼 총 두개의 파일이 해당 폴더 안에 위치하게 됨.
AndroidManifest.xml이나 jar파일을 이 폴더에 넣어야만 나중에 빌드할때 요 안에 있는 파일로 빌드가 됨.. 폴더명 틀리면 앙댐..
17. 이제 마지막 단계임. AndroidManifest.xml을 아래와 같이 수정할 예정임. 제일 중요함 ㅋㅋ
* 변경점은 UnityPlayerProxyActivity 쪽에 선언되있던 Intent filter를 삭제하고, 작업 초기에 이클립스쪽에서 만든 MainActivity를 먼저 인식하게 만들어야 하므로,activity 추가 및 intent 필터 설정. 그리고 폰 데이터 접근권한을 줘야 데이터를 사용할 수 있으므로, <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 부분을 추가함. 화면 회전이 AndroidManifest.xml에 별도로 설정되어 있지 않은 경우 화면회전과 동시에 앱이 종료가 되는 싱기한 현상을 목격할 수 있음. 그러므로 이부분을 주의해서 보고 수정이 필요하다면 꼭 수정해야함.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kr.co.bandus"
android:theme="@android:style/Theme.NoTitleBar"
android:versionName="1.0"
android:versionCode="1"
android:installLocation="preferExternal">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
<application android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:debuggable="false">
<activity android:name="com.unity3d.player.UnityPlayerProxyActivity"
android:launchMode="singleTask"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:screenOrientation="landscape">
</activity>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:launchMode="singleTask"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:screenOrientation="landscape">
</activity>
<activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
android:launchMode="singleTask"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:screenOrientation="landscape">
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
</activity>
<activity
android:name="kr.co.bandus.MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="6" android:targetSdkVersion="18" />
<uses-feature android:glEsVersion="0x00020000" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-feature android:name="android.hardware.touchscreen" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>
이제 모든 설정이 끝났으므로, 빌드앤런을 통해 확인하면 01098987575 식과같은 번호를 스트링형식으로 뿌려주는 걸 확인할 수 있음!!