在Unity中调用Android中的方法,然后在Android中回调Unity
一、 创建一个Android工程(开发工具eclipse)
二、创建一个工程名,注意Package Name名为要和在Unity中设置的“Bundle Identifier”相同
三、 全部默认点击 下一步,下图为默认主Activity,可以自己修改名字,也可以不用改
四、在Unity安装目录Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar
将 classes.jar 拖拽到Android项目的 libx 文件夹下
五、 选中工程名,在菜单来选择 “Project”->“Properties”
跳出如下窗口
六、 点击“Add JARS....”。 选择拖进来的 classes.jar 包所在位置
七、 然后在 “Referenced Libraries”下会出现导入的 .jar包
八、然后在创建好的工程中打开【Src】->【com.example.testunity】。“MainActivity.java”
九、然后删除没用的 包和代码。如下所示
package com.example.sd;
import android.os.Bundle;
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
}
十、 然后添加代码如下
package com.example.sd;
import android.os.Bundle;
//导入包
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
//继承自 UnityPlayerActivity
public class MainActivity extends UnityPlayerActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
public static int numberX = 1;
public int numberY = 1;
//将要在Unity中调用的方法,无参数
public static int getNumberX()
{
return numberX + 10;
}
//将要在Unity中调用的方法,有参数
public int getNumberY(int num)
{
return numberY + num;
}
//在Unity中调用该方法,该方法回调 Unity中的方法
//参数1为在Unity场景中的对象名字,参数2 该对象绑定脚本的一个方法名
//参数3为参数
public void CallUnity()
{
//参数1为在Unity场景中的对象名字,
//参数2该对象绑定脚本中的一个方法,
//参数3为传递给 “AndroidCallBalk”的参数
UnityPlayer.UnitySendMessage("Main Camera", "AndroidCallBack", "");
}
}
之后选中工程名右键刷新工程
十一、然后需要导出.jar包,选中工程名,右键选择 “Export....”
十四、 选择 “Java”->“JAR file”
十五、选择路径并创建一个 名字
十六、然后在 “JAR file:”所指路径下会生成 myTestUnity.jar文件
十七、然后在Unity中【Asset】->【Plugins】->【Android】下,将创建的.jar包拖进去。
注意: Plugins 可以自己在Unity工程 Asset 下手动创建, Plugins 文件夹必须是 Asset 下的直接目录,把 Plugins文件夹放在其他文件夹中无效
将工程目录下 bin 下的 “res”文件夹 和 AndroidManifest.xml 拖拽到【Asset】->【Plugins】->【Android】
如下图所示
AndroidManifest.xml如下
注意:有时候在 Build 时 AndroidManifest.xml 文件中可能会有地方出错自行检查修改
十八、接下来在Unity中创建脚本 “MyTest.cs”代码如下
using UnityEngine;
using System.Collections;
public class MyTest : MonoBehaviour {
private int testX = 10;
private int testY = 10;
void OnGUI()
{
if (GUI.Button(new Rect(50, 100, 100, 100), "Button getNumberX"))
{
// "com.unity3d.player.UnityPlayer" 为固定用法,即通过包名寻找UnityPlayer
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
// "currentActivity" 为主Activity, 不要理解为当前的 Activity
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
//调用 eclipse中的 "getNumber"方法
testX += jo.CallStatic<int>("getNumberX");
}
}
}
if (GUI.Button(new Rect(50, 300, 100, 100), "Button getNumber"))
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
testY += jo.Call<int>("getNumberY", 10);
}
}
}
if (GUI.Button(new Rect(50, 300, 100, 100), "Button CallUnity"))
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("CallUnity");
}
}
}
GUI.Label(new Rect( 50, 550, 300, 100), "testX : " + testX.ToString());
GUI.Label(new Rect(50, 700, 300, 100), "testY : " + testY);
GUI.Label(new Rect(50, 850, 300, 100), "X + Y : " + (testX + testY));
}
//eclipse 中回调方法
public void AndroidCallBack()
{
testX += 10;
testY += 5;
}
创建三个按钮,点击按钮调用eclipse中相应的方法
到此准备工作结束,如果在Unity上直接运行,点击按钮会报错,这是因为我们在Unity中调用了Android中的方法,我们需要将该项目打包为 apk,然后将该 apk安装在Android真机上,运行即可看到效果
注意:
Unity接 Android 第三方SDK
将如上eclipse导出的 .jar 包解压,在Unity中Project面板中创建 Plugins->Android
将解压出的 AndroidManifest.xml 放在Android文件夹下, 在Android下创建 bin 文件夹,将 eclipse导出的
.jar包放在 bin文件夹; 在Android下创建 libs 文件夹, 将SDK第三方库的 .jar 放在 libs文件夹下, 将
.jar中解压出的 res 文件夹拖拽到 Android文件夹下