Upload
-
View
2.204
Download
4
Embed Size (px)
DESCRIPTION
Unity와 Android의 기본적인 연동방법
Citation preview
*index 1. Unity 에서의 Android 란 ?!
2. 전체 Flow3. 실습
Unity 에서의 Android 란 ?!
Unity 의 기본 게임 시스템에 포함되지 않는 기능을 구현하기 위해 반드시 필요 .
예를 들면
- 사용자 자신의 핸드폰번호 혹은 핸드폰 주소록에 접근하여 친구리스트를 생성 . - 갤럭시 시리즈에서 S 펜을 구현 . - 구글 게임 서비스를 게임에 적용 등등…
핵심 게임기능을 제외한 많은 기능은 유니티에서 구현할 수 없고 네이티브코드 , 즉 Android 에서 구현하고 유니티와 연동해야 함 .
전체 Flow
이클립스에서 원하는 기능을 구현한 JAR 파일을 만듬 .
자바개발툴킷 (JDK), Android SDK, 이클립스등 기본적인 안드로이드 개발을 위한환경 설정을 해야함 .
만든 JAR 파일과 그에 맞는 AndroidManifest.xml 파일을 유니티에 넣긔 .
JAR 파일과 통신할 유니티 스크립트를 만들고 , 디바이스 데이터를 받아 후처리를 진행 .
실습
1. 이클립스에서 프로젝트를 먼저 만들거나 , 유니티에서 먼저 작업을 하거나 상관은 없음 .
2. 이클립스에서 먼저 프로젝트를 만드는 것으로 하고 작업 진행 .
3. 이클립스에서 기본적인 안드로이드 어플리케이션 프로젝트를 생성 . ( 생성시 패키지명을 주의하여 생성 )
4. 생성된 프로젝트내에서 메인액티비티 .JAVA 에 onCreate 진입함수를 제외한 나머지 함수를 삭제 .
5. MainActivity.java 가 유니티로 정보를 보내줄 수 있게하기 위해 유니티 클래스를 상속받아야함 . 이를 위해 C:\Program Files\Unity\Editor\Data\PlaybackEngines\androiddevelopmentplayer\bin 경로에 위치한 classes.jar 파일을 libs 폴더에 임포트 시킨 후 상속 처리 .
실습
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;
@Overrideprotected 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 첫번째 인자는 해당 메소드가 실행되면 유니티로 값을 전달할때 유니티의 하이라키 상에서의 오브젝트 이름으로 찾아 해당 오브젝트로 값을 전달한다는 의미고 , 두번째 인자는 해당 오브젝트에 추가된 스크립트들중 전달하고자 하는 데이터를 처리할 함수를 지정하는 것이고 , 세번째 인자는 당연히 전달할 데이터를 의미함 .
실습
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;}
}
실습
10. 유니티 빌드셋팅으로 가서 아래의 설정값으로 변경 . - 안드로이드 스위치 플랫폼 - 플레이어 셋팅 - Other settings 에 있는 Bundle Identifier 부분에 이클립스에서 만든 패키지명 그대로 설정해준다 . - 그리고 폰으로 테스트 해볼건데 테스트라 하더라도 세로모드면 보기도 이쁘지 않음 . Resulution and Presentation 에서 Default Orientation 을 Landscape Left 로 변경한다 . ( 이부분은 주로 게임만들때 많이 변경되는 부분인데 좀이따 AndroidManifest.xml 에서 맞춰줘야 앱이 정상동작함 ).
11. 구글 프로젝트 설정 후 빌드하여 AndroidManifest.xml 파일을 생성 .
12. 생성된 xml 파일과 아까 작업해둔 jar 파일을 유니티 프로젝트에 Plugins/Android 폴더를 만든 후 해당 폴더에 위치시킴 .
실습
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 로 설정시켜야 함 . 또한 회전 여부 에 따라 앱이 종료가 될 수 있으므로 이부분을 잘 캐치하여 같이 설정해야함 .
실습
14. 이후 빌드하여 핸드폰 번호가 출력되는지 여부를 확인 .