2. Unity에서의 Android란?!
Unity의 기본 게임 시스템에 포함되지 않는 기능을 구현하기 위해 반드시 필요.
예를 들면
- 사용자 자신의 핸드폰번호 혹은 핸드폰 주소록에 접근하여
친구리스트를 생성.
- 갤럭시 시리즈에서 S펜을 구현.
- 구글 게임 서비스를 게임에 적용 등등…
핵심 게임기능을 제외한 많은 기능은 유니티에서 구현할 수 없고 네이티브코드,
즉 Android에서 구현하고 유니티와 연동해야 함.
3. 전체 Flow
이클립스에서 원하는 기능을 구현한 JAR 파일을 만듬.
자바개발툴킷(JDK), Android SDK, 이클립스등 기본적인 안드로이드 개발을 위한
환경 설정을 해야함.
만든 JAR파일과 그에 맞는 AndroidManifest.xml 파일을 유니티에 넣긔.
JAR파일과 통신할 유니티 스크립트를 만들고, 디바이스 데이터를 받아 후처
리를 진행.
4. 실습
1. 이클립스에서 프로젝트를 먼저 만들거나, 유니티에서 먼저 작업을 하거나 상관은 없음.
2. 이클립스에서 먼저 프로젝트를 만드는 것으로 하고 작업 진행.
3. 이클립스에서 기본적인 안드로이드 어플리케이션 프로젝트를 생성. (생성시 패키지명을 주의하여 생성)
4. 생성된 프로젝트내에서 메인액티비티.JAVA에 onCreate 진입함수를 제외한 나머지 함수를 삭제.
5. MainActivity.java가 유니티로 정보를 보내줄 수 있게하기 위해 유니티 클래스를 상속받아야함.
이를 위해
C:Program FilesUnityEditorDataPlaybackEnginesandroiddevelopmentplayerbin
경로에 위치한 classes.jar 파일을 libs 폴더에 임포트 시킨 후 상속 처리.
5. 실습
6. 테스트를 위해 현재 내 핸드폰 번호를 유니티로 가져와서 뿌리는 것으로 구현하고 싶으므로, 아래와 같이 MainActivity.java 코드를 작성.
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);
}
}
※ UnitySendMessage
첫번째 인자는 해당 메소드가 실행되면 유니티로 값을 전달할때 유니티의 하이라키 상에서의 오브젝트 이름으로 찾아 해당 오브젝트로 값을 전달한다는 의미고,
두번째 인자는 해당 오브젝트에 추가된 스크립트들중 전달하고자 하는 데이터를 처리할 함수를 지정하는 것이고,
세번째 인자는 당연히 전달할 데이터를 의미함.
6. 실습
7. 작업 후 src 이하 폴더에 있는 java 파일만 jar 파일로 익스포트.
8. 이클립스 작업은 모두 끝났고 유니티에서 새프로젝트를 만듬.
9. 하이라키에 DataObject라는 빈 객체를 생성후 스크립트를 추가후 아래의 내용을 코딩.
using UnityEngine;
using System.Collections;
public class DataObjectScript : MonoBehaviour {
private AndroidJavaObject currentActivity;
private string _PhoneNumber;
void Awake()
{
// 현재 활성화된 액티비티를 얻어와 미리 준비한 변수에 저장.
AndroidJavaClass AJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
currentActivity = AJC.GetStatic<AndroidJavaObject>("currentActivity");
if (currentActivity != null)
{
// MainActivity에 있는 GetPhoneNumber 메소드를 데이터를 전달받기 위해 호출함.
currentActivity.Call("GetPhoneNumber");
}
}
void OnGUI()
{
Rect _rect = new Rect((Screen.width/2) - 100, (Screen.height/2) - 100, 200, 200);
GUI.Box(_rect, _PhoneNumber);
}
// MainActivity에 있는 GetPhoneNumber 메소드가 실행되어 데이터를 받을 함수.
void CheckPhoneNumber(string arg)
{
_PhoneNumber = arg;
}
}
7. 실습
10. 유니티 빌드셋팅으로 가서 아래의 설정값으로 변경.
- 안드로이드 스위치 플랫폼
- 플레이어 셋팅
- Other settings 에 있는 Bundle Identifier 부분에 이클립스에서 만든 패키지명 그대로 설정해
준다.
- 그리고 폰으로 테스트 해볼건데 테스트라 하더라도 세로모드면 보기도 이쁘지 않음.
Resulution and Presentation 에서 Default Orientation을 Landscape Left 로 변경한다. (이부
분은 주로 게임만들때 많이 변경되는 부분인데 좀이따 AndroidManifest.xml에서 맞춰줘야 앱이
정상동작함).
11. 구글 프로젝트 설정 후 빌드하여 AndroidManifest.xml 파일을 생성.
12. 생성된 xml 파일과 아까 작업해둔 jar 파일을 유니티 프로젝트에 Plugins/Android 폴더를 만
든 후 해당 폴더에 위치시킴.
8. 실습
13. xml 파일을 아래와 같이 비슷하게 설정.
<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>
- 유니티 버젼에 따라 xml 내용은 좀 다를 수 있지만 핵심은 기존에 intent filter를 아까 만든 jar 파일에 있는 MainActivity.java로 설정시켜야 함. 또한 회전 여부 에 따
라 앱이 종료가 될 수 있으므로 이부분을 잘 캐치하여 같이 설정해야함.