9
* index 1. Unity 에에에 Android 에 ?! 2. 에에 Flow 3. 에에

유니티와 안드로이드의 연동

  • Upload
    -

  • View
    2.204

  • Download
    4

Embed Size (px)

DESCRIPTION

Unity와 Android의 기본적인 연동방법

Citation preview

Page 1: 유니티와  안드로이드의 연동

*index 1. Unity 에서의 Android 란 ?!

2. 전체 Flow3. 실습

Page 2: 유니티와  안드로이드의 연동

Unity 에서의 Android 란 ?!

Unity 의 기본 게임 시스템에 포함되지 않는 기능을 구현하기 위해 반드시 필요 .

예를 들면

- 사용자 자신의 핸드폰번호 혹은 핸드폰 주소록에 접근하여 친구리스트를 생성 . - 갤럭시 시리즈에서 S 펜을 구현 . - 구글 게임 서비스를 게임에 적용 등등…

핵심 게임기능을 제외한 많은 기능은 유니티에서 구현할 수 없고 네이티브코드 , 즉 Android 에서 구현하고 유니티와 연동해야 함 .

Page 3: 유니티와  안드로이드의 연동

전체 Flow

이클립스에서 원하는 기능을 구현한 JAR 파일을 만듬 .

자바개발툴킷 (JDK), Android SDK, 이클립스등 기본적인 안드로이드 개발을 위한환경 설정을 해야함 .

만든 JAR 파일과 그에 맞는 AndroidManifest.xml 파일을 유니티에 넣긔 .

JAR 파일과 통신할 유니티 스크립트를 만들고 , 디바이스 데이터를 받아 후처리를 진행 .

Page 4: 유니티와  안드로이드의 연동

실습

1. 이클립스에서 프로젝트를 먼저 만들거나 , 유니티에서 먼저 작업을 하거나 상관은 없음 .

2. 이클립스에서 먼저 프로젝트를 만드는 것으로 하고 작업 진행 .

3. 이클립스에서 기본적인 안드로이드 어플리케이션 프로젝트를 생성 . ( 생성시 패키지명을 주의하여 생성 )

4. 생성된 프로젝트내에서 메인액티비티 .JAVA 에 onCreate 진입함수를 제외한 나머지 함수를 삭제 .

5. MainActivity.java 가 유니티로 정보를 보내줄 수 있게하기 위해 유니티 클래스를 상속받아야함 . 이를 위해 C:\Program Files\Unity\Editor\Data\PlaybackEngines\androiddevelopmentplayer\bin 경로에 위치한 classes.jar 파일을 libs 폴더에 임포트 시킨 후 상속 처리 .

Page 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;

@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 첫번째 인자는 해당 메소드가 실행되면 유니티로 값을 전달할때 유니티의 하이라키 상에서의 오브젝트 이름으로 찾아 해당 오브젝트로 값을 전달한다는 의미고 , 두번째 인자는 해당 오브젝트에 추가된 스크립트들중 전달하고자 하는 데이터를 처리할 함수를 지정하는 것이고 , 세번째 인자는 당연히 전달할 데이터를 의미함 .

Page 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;}

}

Page 7: 유니티와  안드로이드의 연동

실습

10. 유니티 빌드셋팅으로 가서 아래의 설정값으로 변경 . - 안드로이드 스위치 플랫폼 - 플레이어 셋팅 - Other settings 에 있는 Bundle Identifier 부분에 이클립스에서 만든 패키지명 그대로 설정해준다 . - 그리고 폰으로 테스트 해볼건데 테스트라 하더라도 세로모드면 보기도 이쁘지 않음 . Resulution and Presentation 에서 Default Orientation 을 Landscape Left 로 변경한다 . ( 이부분은 주로 게임만들때 많이 변경되는 부분인데 좀이따 AndroidManifest.xml 에서 맞춰줘야 앱이 정상동작함 ).

11. 구글 프로젝트 설정 후 빌드하여 AndroidManifest.xml 파일을 생성 .

12. 생성된 xml 파일과 아까 작업해둔 jar 파일을 유니티 프로젝트에 Plugins/Android 폴더를 만든 후 해당 폴더에 위치시킴 .

Page 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 로 설정시켜야 함 . 또한 회전 여부 에 따라 앱이 종료가 될 수 있으므로 이부분을 잘 캐치하여 같이 설정해야함 .

Page 9: 유니티와  안드로이드의 연동

실습

14. 이후 빌드하여 핸드폰 번호가 출력되는지 여부를 확인 .