new project 생성
application name 과 company domain 은 package name 이 적절하게 나오도록 구성
완료하여 프로젝트가 생성 되었다면
unity 가 설치된 폴더 내부에 있는 classes.jar 파일을 프로젝트에 추가해야함
C:\Program Files\Unity\Editor 안의
\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
내부에 있을 것으로 추정
찾았다면 안드로이드 프로젝트로 다시 포커스를 이동시켜서
app 에 우클릭하여 open module settings 클릭
Dependencies 탭으로 이동후 우측의 File dependency 클릭
libs 폴더 찍으면 위쪽 경로 창이 업데이트 된다.
해당 경로에 unity 설치 폴더에 있던 classes.jar 복사
위 그림 처럼 추가 되어 있어야 하고 확인 하면
아래 그림 처럼 추가 되어야 한다.
좌측의 계층 창에서도 app/ libs 하위에 생성된것을 확인(파일만 옮겨도 생성되는거)
혹시 com.android.support:appcompat-v7:25.0.1 (버전은 상관없음) 가 디팬던시에 없다면
이후에 할 gradle 수정 작업에서 애를 먹게 된다.
추가해 주자
로 들어가서
선택해주면 dependencies창에도 gradle에도 추가가 된다
불필요한 항목 삭제
좌측 계층 창이 project로 되어있다면 android로 바꾼다.
그리고 java 항목을 연다. 패키지 이름 뒤 (test 어쩌고) 하는걸 지운다.
(사라질때 까지 계속 지운다)
UnityPlayerActivity 상속
MainActivity.java 의 내용을 수정
위와 같은 내용을
package com.bkst.pluginunity;
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;//유니티 라이브러리 임포트
// Activity 대신 UnityPlayerActivity 를 상속
public class MainActivity extends UnityPlayerActivity {
@Override protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
public static void LogStatic(String str)
{
Log.d("bk", str);
}
public void Log(String str)
{
Log.d("bk", str);
}
}
와 같이 수정
Gradle Scripts 하위에서 build.gradle(Module:app) 더블클릭 하여 연다.
(project로 잡고 있다면 app 하위의 gradle을 연다.)
gradle의 내용은 아래와 같을 것이다.
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.bkst.pluginunity"
minSdkVersion 9
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations' })
testCompile 'junit:junit:4.12' compile files('libs/classes.jar')
}
아래와 같이 바꿔준다.
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
//applicationId "com.bkst.pluginunity"//라이브러리는 애플리케이션 ID를 가질 수 없다.
minSdkVersion 9
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.0.1'//dependencies 에서 추가하면 자동 추가됨
compile files('libs/classes.jar')//dependencies 에서 추가하면 자동 추가됨}
task deleteObjectJar(type: Delete){
delete 'release/AndroidPlugin.jar'
}
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename('classes.jar', 'AndroidPlugin.jar')
}
exportJar.dependsOn(deleteObjectJar, build)
이제 android studio의 우측 을 보면 아래와 같은 버튼이 있다.
누르면

...(root) 와 :app 두개가 나오는데
:app 하위의 other를 열고 찾아보면 exportJar가 있다.
본래 exportJar 를 더블클릭하면 jar가 생성 되면서 빌드 로그를 볼 수 있었는데,
이상하게 지금은 프로젝트 clean을 해야 빌드가 되면서 로그를 볼 수 있다.
빌드 된 jar 파일의 위치 탐색기 갈 필요 없이 아래의 저거를 끄집어 쓰면 된다.
유니티에서 써먹기
유니티에서 사용하기 위해서는 아래의 그림 같이 사전 작업이 필요하다.
우선 Plugins 폴더를 만들어야 하고 그 안에 Anroid 폴더를 만들어야 한다.
그리고 Android 폴더 내부에
1) AndroidManifest.xml과
2) 방금 만든 .jar 파일 그리고
3) AndroidManifest.xml 등에서 사용하는 resource들을 담고 있는 res 폴더를
알맞게 구성해야 한다.
1,2,3에 대한 자세한 설명
1. 기존의 AndroidManifest.xml가 있다면 그것을 활용하고 없다면
방금 만든 android studio project에 있는 AndroidManifest.xml 을 활용한다.
AndroidManifest.xml 의 내용
붉은 줄이 그어진 부부은 android studio에서 가져오면서 수정한 부분이다.
1) drawable 은 mipmap 이었고,
2) com.bkst.pluginunity는 없었다.
아 빼먹을 뻔 했는데 위쪽에 있는 pakage="com.bkst.testapp" 을 수정하는 바람에
2)번이 .MainActivity에서 com.bkst.pluginunity.MainActivity 로 수정된 것이다.
원래는 pakage = com.bkst.pluginunity 였다.
특별한 이유가 없다면 pakage는 그대로 하는게 좋음. (테스트 해본 것)
2) .jar 파일은 그냥 가져오면 된다.
3) res 폴더
android studio 프로젝트의 res 폴더를 그대로 끄집어서 온 복사본이다.
해상도 별 이미지 저장소, 프로그램적으로 쓰이는 변수들 등을 정의 해 놓은 곳
참고한 블로그에서는 번들아이디를 맞추라는데 그럴 필요는 없는것 같다.
이제 진짜 쓰는 부분이다.(code)
앱이 시작하면 바로 쓰도록 설계되어 있다.
using UnityEngine;
using System.Collections;
public class Manager : MonoBehaviour {
AndroidJavaObject ajObject;//안드로이드 오브젝트
void Start ()
{
// 안드로이드 activity나 이를 상속받은 UnityPlayerActivity 를 상속받은 클래스의
// 메소드를 쓰기 위해서는 아래 처럼 해야 한다.
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
ajObject = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 아무것도 상속받지 않은 클래스에 속한 메소드를 호출하기 위해서는
// 아래와 같이 클래스까지의 경로(패키지명)을 지정한다.
//ajObject = new AndroidJavaObject("com.bkst.pluginunity.MainActivity");
ajObject.CallStatic("LogStatic", "testStatic");
ajObject.Call("Log", "test");
}
}