À¯´ÏƼ ¾Èµå·ÎÀ̵å Ç÷¯±×ÀÎ3


¾ÕÀåÀÇ ³»¿ëÀ» ÂüÁ¶Çؼ­ Ä¿½ºÅÒ À¯´ÏƼ Ç÷¹ÀÌ¾î ¾×ƼºñƼ¸¦ ¸¸µé¾î º¸ÀÚ.

À¯´ÏƼ ¾Èµå·ÎÀ̵å Ç÷¯±×ÀÎ
À¯´ÏƼ ¾Èµå·ÎÀ̵å Ç÷¯±×ÀÎ2

"CustomUnityPlayerActivity"¸¦ ¸¸µé±â À§Çؼ­´Â À¯´ÏƼÆú´õÀÇ UnityPlayerActivity.java ÆÄÀÏÀ» ÀÌ¿ëÇÑ´Ù.

[ À¯´ÏƼ ¼³Ä¡ Æú´õ ]\Editor\Data\PlaybackEngines\androidplayer\com\unity3d\player

¾Èµå·ÎÀ̵忡¼­ UnityPlayer.UnitySendMessage ¸í·É¾î »ç¿ëÇϱâ


1. ¾Èµå·ÎÀ̵å ÇÁ·ÎÁ§Æ® À̸§°ú À¯´ÏƼ ¹øµéÀ̸§À» µ¿ÀÏÇÏ°Ô ¸¸µç´Ù.

¾Èµå·ÎÀ̵å ÇÁ·ÎÁ§Æ® À̸§°ú À¯´ÏƼ ¹øµéÀ̸§À» µ¿ÀÏÇÏ°Ô ÇØ¾ß UnityPlayer¸¦ »ó¼ÓÇÑ Ç÷¯±×ÀÎÀ» Á¤»óÀûÀ¸·Î ·Îµù ÇÒ¼ö ÀÖ´Ù.
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

< ¾Èµå·ÎÀ̵å ÇÁ·ÎÁ§Æ® >




< À¯´ÏƼ ¹øµé À̸§ >




2. classes.jar ÆÄÀÏ Ãß°¡


¼Ó¼ºÃ¢À» ¿­¾î¼­  "Java Build Path"¸¦ ¼±ÅÃÇÑ´Ù.
Libraries ÅÇ¿¡¼­ "Add External JARs..." ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.
C:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin Æú´õ¿¡¼­ "classes.jar" ÆÄÀÏÀ» Ãß°¡ÇÑ´Ù.
Apply ¹öÆ°À» ´­·¯¼­ Àû¿ëÇÑ ÈÄ¿¡ OK ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

3. classes.jar ÀÇÁ¸¼º ¼³Á¤



¼Ó¼ºÃ¢¿¡¼­ "Order and Export" ÅÇÀ» ¼±ÅÃÇÑ´Ù.
classes.jar¸¦ üũÇÑ´Ù.
Apply ¹öÆ°À» ´­·¯ Àû¿ëÇÑ ´ÙÀ½ OK ¹öÆ°À» Ŭ¸¯ÇÏ¿© ¼Ó¼ºÃ¢À» ´Ý´Â´Ù.

4. MainActivity.java ÆÄÀÏÀ» ¼öÁ¤ÇÑ´Ù.
( UnitySendMessage ¸í·É¾î¸¦ »ç¿ë ÇÒ·Á¸é À¯´ÏƼÀÇ classes.jar ÆÄÀÏÀ» Ãß°¡ ÇØ¾ß ÇÑ´Ù. )

MainActivity.java ÆÄÀÏÀ» ¼±ÅÃÈÄ ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ¿© ( Refactor > Rename ) ¸Þ´º¸¦ Ŭ¸¯ÇÏ´ø°¡ ¾Æ´Ï¸é F2¸¦ Ŭ¸¯Çϸé Rename ´ëÈ­»óÀÚ°¡ ¶á´Ù.



MainActivity ´ë½Å CustomUnityPlayerActivity¸¦ ÀÔ·ÂÇÏ¿© Ŭ·¡½º À̸§À» º¯°æÇÑ´Ù.

UnityPlayerActivity.java ¼Ò½º¸¦ ¸ðµÎ º¹»çÇؼ­  CustomUnityPlayerActivity.java¿¡ ºÙ¿© ³Ö±â ÇÑ´Ù.

package com.example.plugin;

import android.os.Bundle;

import com.unity3d.player.UnityPlayer;

import android.content.res.Configuration;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;


public class CustomUnityPlayerActivity extends Activity
{
    protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code

    // Setup activity layout
    @Override protected void onCreate (Bundle savedInstanceState)
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);

        getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy

        mUnityPlayer = new UnityPlayer(this);
        if (mUnityPlayer.getSettings().getBoolean("hide_status_bar", true))
        {
            getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                   WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }

        setContentView(mUnityPlayer);
        mUnityPlayer.requestFocus();
    }

    // Quit Unity
    @Override protected void onDestroy ()
    {
        mUnityPlayer.quit();
        super.onDestroy();
    }

    // Pause Unity
    @Override protected void onPause()
    {
        super.onPause();
        mUnityPlayer.pause();
    }

    // Resume Unity
    @Override protected void onResume()
    {
        super.onResume();
        mUnityPlayer.resume();
    }

    // This ensures the layout will be correct.
    @Override public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        mUnityPlayer.configurationChanged(newConfig);
    }

    // Notify Unity of the focus change.
    @Override public void onWindowFocusChanged(boolean hasFocus)
    {
        super.onWindowFocusChanged(hasFocus);
        mUnityPlayer.windowFocusChanged(hasFocus);
    }

    // For some reason the multiple keyevent type is not supported by the ndk.
    // Force event injection by overriding dispatchKeyEvent().
    @Override public boolean dispatchKeyEvent(KeyEvent event)
    {
        if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
            return mUnityPlayer.injectEvent(event);
        return super.dispatchKeyEvent(event);
    }

    // Pass any events not handled by (unfocused) views straight to UnityPlayer
    @Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
    @Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
    @Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
    /*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }
   
    public  void CallByUnity()
    {
        UnityPlayer.UnitySendMessage("Main Camera","AndroidLog",">>>>>>>> From CustomUnityPlayerActivity");
    }   
}


À¯´ÏƼ ¾Èµå·ÎÀ̵å Ç÷¯±×ÀÎ2ó·³ CustomUnityPlayerActivity¿Í Test Ŭ·¡½º ¸ðµÎ¿¡¼­ UnitySendMessage¸¦  È£ÃâÇÏ°í ÀÖ´Ù.

<Test.java ¼Ò½º>
package com.example.plugin;

import com.unity3d.player.UnityPlayer;

public class Test {
    public static String GetStaticString(String a)
    {
        return "Plugin static: " + a;
    }
   
    public static int GetStaticInt(int a)
    {
        return a + 1000;
    }
   
    public String GetString(String a)
    {
        return "Plugin object: " + a;
    }
   
    public int GetInt(int a)
    {
        return a + 50000;
    }
   
    public  void CallByUnity()
    {
        UnityPlayer.UnitySendMessage("Main Camera","AndroidLog",">>>>>>>> From Test.java");
    }   
}

5. Ç÷¯±×ÀÎ ÆÄÀÏ º¹»ç

classes.jar ÆÄÀÏÀ» »ç¿ëÇϸé ÀͽºÆ÷Æ®µÈ plugin.jar ÆÄÀÏ°ú ÇÔ²² res Æú´õ,  AndroidManifest.xml  ÆÄÀϵéÀ» À¯´ÏƼ Assets/Plugins/Android Æú´õ¿¡ º¹»çÇÑ´Ù.

±âÁ¸¿¡ res, AndroidManifest.xml ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù¸é ¸ÓÁöÇØ¾ß ÇÑ´Ù.




À¯´ÏƼ¿¡¼­ ½ÇÇà

1. Run MainActivity.java

UnityPlayerActivity¸¦ »ó¼ÓÇÑ MainActivity¸¦ ½ÇÇàÇÒ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject _activity = jc.GetStatic<AndroidJavaObject> ("currentActivity");

ÇöÀç È°¼ºÈ­µÈ Activity¸¦ ¾ò¾î¿Â´Ù. ½ÇÇàÀº ´ÙÀ½°ú °°´Ù.

        _activity.Call( "CallByUnity");

2. Run Test.java

À¯´ÏƼ ¾Èµå·ÎÀ̵å Ç÷¯±×ÀÎ ¿¡¼­ ½ÇÇàÇÏ´ø Test ¿ÀºêÁ§Æ®ÀÇ »ç¿ë¹ý°ú °°´Ù.

        AndroidJavaObject javaObject = new AndroidJavaObject("com.example.plugin.Test");
        javaObject.Call( "CallByUnity");

  À¯´ÏƼ Test.cs ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

    public GUIText _gui;

#if UNITY_ANDROID
    AndroidJavaObject _activity;

    void Awake()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        _activity = jc.GetStatic<AndroidJavaObject> ("currentActivity");
    }
#endif

    // Use this for initialization
    void Start ()
    {
   
#if UNITY_EDITOR
        _gui.text = "gui in Editor";
#elif UNITY_ANDROID
        /*
        AndroidJavaClass staticClass = new AndroidJavaClass("com.example.plugin.Test");
        string resStaticStr = staticClass.CallStatic<string>("GetStaticString", "GetStaticString");
        string str = resStaticStr + "\n";

        AndroidJavaObject javaObject = new AndroidJavaObject("com.example.plugin.Test");
        string dynamicStr = javaObject.Call<string>( "GetString", "GetString");
        str += dynamicStr;
        _gui.text = str;
        */

        //1. Run MainActivity.java
        _activity.Call( "CallByUnity");

        //2. Run Test.java
        //AndroidJavaObject javaObject = new AndroidJavaObject("com.example.plugin.Test");
        //javaObject.Call( "CallByUnity");       
#endif

    }

    public void AndroidLog(string str)
    {
        _gui.text = str;
    }
}


ÂüÁ¶ :  Ç÷¯±×ÀÎ ¿©·¯°³ »ç¿ë½Ã res¿Í Manifest ÆíÁý¿¡ °ü·ÃµÈ ³»¿ë
          http://limchaeng.tistory.com/?page=5