2021년 1월 19일 화요일

Unity3d 에서 Android plugin 불러내기-예제1

 참고:https://twnkls.com/blogs/howto-native-android-plugins-for-unity3d/

1.안드로이드에서 라이브러리생성

1.일단 빈 프로젝트 생성

2.안드로이드어플속성의 빈프로젝트가 생성되었지만 이를 그냥 안드로이드 모듈 형태로 바꾸어 보자.

- manifests/AndroidManifest.xml 을 아래처럼 깔끔히 정리하자

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mynativeplugin2">

<
application
android:allowBackup="true"         android:label="@string/app_name"
android:supportsRtl="true"/>

</
manifest>
- module의 build.gradle(프로젝트/app/build.gradle파일) 에서 application 관련 설정을 모듈 관련설정으로 바꾸자
plugins {
id 'com.android.library' // <- 원래는 com.android.application
}
...
defaultConfig {
// 이부분 삭제 applicationId "com.mymymy.appuririri"
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

- res/style들도 삭제

3.유니티에서 뭔가했을때 이쪽 Android Native에서도 뭔가를 해보여줘야 하니까 간단한 Toast 만들자
New Java Class -> Bridge.java (자바파일이름은 맘대로)
강좌에는 이렇게 한단다.
import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

public class Bridge extends Application
{
// our native method, which will be called from Unity3D
public void PrintString(final Context ctx, final String message )
{
//create / show an android toast, with message and short duration.         //메인쓰레드가 유니티가 사용하고 있으니 핸들러로 해야 화면에 토스트를 띄울수있다.
        new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show();
}
});
}
}
4.make project 해서 aar 파일로 만들자( aar은 안드로이드 압파일)
aar파일 여깄네.






2.유니티에서 안드로이드 라이브러리 불러내기

1.아무 프로젝트를 만들자.
2.Assets밑에Plugins폴더만들고, 그밑에 Android폴더를 만들자

3.아까만든 aar파일을 여기에 던져놓는다.

4.안드로이드 플러그인이 준비되었으니, 유니티에서 그걸 불러내서 연동해보자. 아까 Bridge.java 라고 만든 클래스에 PrintString함수가 있으니 그걸 불러내면된다.
Assets밑에Scripts라는 폴더를 만든다
5. Scripts폴더에 callMyAndroidToast.cs파일을 만들고 아래와 같이 적는다.
sing System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class callMyAndroidToast : MonoBehaviour
{

    //method that calls our native plugin.
    public void CallNativePlugin() {


        // Retrieve the UnityPlayer class.
        AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        // Retrieve the UnityPlayerActivity object ( a.k.a. the current context )
        AndroidJavaObject unityActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity").Call<AndroidJavaObject>("getApplicationContext");
        // Retrieve the "Bridge" from our native plugin.
        // ! Notice we define the complete package name.
        // 아까 만든 안드로이드 앱의 Bridge 까지 저장해서 한번에 해당 클래스를 불러냈다.              
        AndroidJavaObject bridge = new AndroidJavaObject("com.yourandroidapp.androidmoduleforunity.Bridge");

        // Setup the parameters we want to send to our native plugin.              
        object[] parameters = new object[2];
        parameters[0] = unityActivity;
        parameters[1] = "This is an call to native android!";

        // Call PrintString in bridge, with our parameters.
        // 안드로이드에서는 Toast를 띄우기위해서 Context가 필요한데, 현재 유니티가 뜬 Context(Activity)를 넘겨준다.
        bridge.Call("PrintString", parameters);
    }


	void OnGUI()
	{
		if (GUI.Button(new Rect(0
		                        , 0
		                        , 160
		                        , 130)
		               , "버튼"))
		{

                      CallNativePlugin();
		}
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


6.
callMyAndroidToast를 드래그 해서 Main Camera에 붚여 놓는다.메인카메라에 GUI 가 표시될꺼다.
[>] 플레이 버튼을 눌렀을때 아래 그림 처럼 표시되면  OK
그러나 버튼 눌러도 반응 없는(에러나 하단에 보이는게 당근! 앱을 실행해야 Context를 Bridge에 전달하지~

7.
자 이제 Unity도 준비되었으니, Android + Unity 를 연동해보자. 일단 안드로이드 플랫폼에서 유니티 게임(?) 앱을
실행할 꺼니까, 안드로이드로 유니티플레이어 실행플랫폼을  바꾸자.
Unity 에서 그걸 도와주는 메뉴가 File->Build Setting 인데, 거기서 Platform을 안드로이드로 Switch Platform 하자
Switch Platform 은 시간 좀 걸린다.

8.Build And Run 을 하면 갑자기 빌드를 저장하라고 하는데, 그 이유는 Unity 에서 바로 앱을 만들어서 단말기에 보내는 것이 
아니라 일단 안드로이드용 유니티 라이브러리/ 프로젝트에 사용된 각종 게임 데이터등을 안드로이드 프로젝트로 저장한다. 
그리고 그걸 몰래 gradle 빌드함으로써 apk 로 만들고 앱을 단말에 설치하는 것이다.  
빌드에 실패하는 경우는 주로 안드로이드 최소지원버젼 (minSdk)의 잘못지정하는 경우가 있는 데 위의 빌드 창에서 
[Player Settins] ->Player -> Minimun API Level을 23이상으로 줘보자.
빌드가 무사히 끝났다면 유니티 화면이 뜨고 버튼을 누르면 안드로이드만의 Toast가 뜨는데, 토스트내용은 유니티에서
던져준 내용이다. 


9.안드로이드 쪽 (이번예에서는 Bridge클래스 또는 안드로이드쪽 파일의 내용을 수정하고 나서 다시 aar 만들경우
 유니티에서는 해당 aar파일이 변경되었는지 모르기때문에 유니티 프로젝트를 다시실행하라고 한다. 새로운 aar파일을 plugin폴더에
덮어씌운경우도 유니디를 다시 시작전에는 반영이 안되다.

10.유니티 에서 직접 빌드하지 않고,안드로이드용으로 export 된 유니티 프로젝트를 Android Studio에서 직접 열어서 
안드로이드 관련 설정을 변경/추가 해서 앱을 기동시킬수도 있다.
 빌드용/개발용/테스트용을 나뉘고자 할때 사용하기도 한다.

 File->Build Setting 화면에서 export project체크박스를 체크하면 저장위치를 물어보고 해당 폴더에 이런저런
(유니티라이브러리와 유니티의 프로젝트자료등등..)을 넣어서 안드로이드용 프로젝트를 만들어준다.
그걸 Android Studio 에서 열어서 보통의 안드로이드 앱처럼 빌드->실행할수 있다. 
(물론 화면은 유니티결과물 게임 화면이 뜰것이다.)



확인용 Github : https://github.com/sugoigroup/potential-journey.git




0 comments:

댓글 쓰기