本文结构
- 使用注意
- 新工程
- Unity传Android参数
- Android传Unity参数
使用注意
- 任何代码文件都可以使用UnityPlayer.UnitySendMessage() 向Unity发消息。只要import com.unity3d.player.UnityPlayer;然后写UnityPlayer.UnitySendMessage()即可;
- Android调用Android的相关方法,参数UnityPlayer.UnitySendMessage("Android_IAPManager","SimpleReturn","555:"+mIAP);参数1:GameObject名称,参数2:函数名,参数3:字符串参数。只能传一个字符串参数,不能传多个,如果需要传多个参数,只能分几个函数调用,或者字符串用'|'之类的字符合并传递再拆分接收了。物体上不存在名称为参数2的函数,不会报错,但是参数3不能为null,否则会强制退出;
- Unity调用Android得相关方法不再叙述,自己可查看API;
- Unity中调用非MainActivity的普通类对象里的函数时,可在MainActivity中写返回普通类对象的函数,然后在Unity中调用(jo = jo.call<JavaObject>("getUpdateVersion"))来获取当前类对象,比如:
public UpdateVersion getUpdateVersion() {
return new UpdateVersion(this);
}
public UpdateVersion(Activity activity) {
this.activity = activity;
}
this表示传递的是当前的Activity,在UpdateVersion中的构造方法中接收此Activity。Unity3d在调用Android时感觉就是多线程的问题,所以在处理UI情况时,可以将处理UI的操作放置在Handler中,用Bundle传递相关参数。普通类中的Handler如下缩写:(注意红字部分,activity表示从构造函数传递过来的acitivity)
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TEST:
break;
case SHOWTOAST:
Toast.makeText(activity, "helloworld", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
新工程
- 新建Unity工程,命名Bundle ID如com.pcc.appname
- 场景里添加GameObject,命名为Manager,并附带Manager.cs脚本。内容如下
using UnityEngine;
using System.Collections;
public class Manager : MonoBehaviour {
AndroidJavaClass jc;
AndroidJavaObject jo;
void Start()
{
#if UNITY_ANDROID
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic("currentActivity");
#endif
}
void OnGUI()
{
if(GUI.Button(new Rect(0,0,100,100),"do"))
{
DO();
}
}
void DO()
{
#if UNITY_ANDROID
jo.Call("StartAct");
#endif
}
}
3.新建Eclipse 工程,直接选 Android Application Project。下一步,注意package Name一定要和之前的Bundle ID对应,之后一直下一步即可。
4.建好工程后,
Mac:Unity图标右键->显示包内容 Contents->PlaybackEngines->AndroidPlayer->bin->classes.jar拷至libs下(copy)
- 打开src->package name(BundleID)->主代码。这里是src->com.pcc.appname->MainActivity
- import com.unity3d.player.UnityPlayerActivity;
- 把extends Activity 改为extends UnityPlayerActivity
- 把类里的代码改为如下
package com.pcc.appname;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void StartAct()
{
Log.e("jj","kk");
}
}
- Build project
- u3d里新建Plugins/Android文件夹,拷贝 Eclipse工程下的AndroidManifest.xml文件,libs文件夹,res文件三项至Plugins/Android下。并删除classes.jar.
- 打jar包:Eclipse工程->bin->classs, 进入mac控制台, cd至该目录,然后运行jar -cvf class.jar *,之后就在Eclipse工程->bin->classs里生成了 class.jar,U3d Plugins/Android下新建bin文件夹,把class.jar拖进去windows类似,指令完全一样。只不过需要配置环境变量,并通过控制台进入该目录的方式不同罢了。Mac可以直接cd复制粘贴好的路径,windows得一层一层cd.
5.点击Eclipse右上角的DDMS,之后左侧 选择设备,然后点击LogCat
6.点击log信息的自动下拉锁定钮,之后build, 在真机上运行,点击do按钮,就能在控制台看到输出的红色的信息了:
二 Unity传Android参数
- 将jo.Call 改为jo.Call("StartAct", new object[] { "hello","world" });
-
StartAct函数改为
public void StartAct(String x, String y)
{
Log.e(x+Y);
}
- Eclipse重新Build project,
- 然后到bin->classes,删除class.jar, 并在控制台指令重build一个
- 删除unity里已有的class.jar,把新的拖进去。;
- 之后运行,看log,发现字符串参数和整数参数都传了过去
三 Android传Unity参数
(1)unity里Manager.cs代码改为
using UnityEngine;
using System.Collections;
public class Manager : MonoBehaviour {
AndroidJavaClass jc;
AndroidJavaObject jo;
private string txt;
void Start()
{
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic("currentActivity");
txt = "";
}
void OnGUI()
{
if(GUI.Button(new Rect(0,0,100,50),"do"))
{
DO();
}
GUI.Label(new Rect(0,50,100,50),txt);
}
void DO()
{
#if UNITY_ANDROID
jo.Call("StartAct",new object[] {"hello world",5});
#endif
}
void AndroidReceive(string content)
{
txt = content;
}
}
(2) Eclipse里的代码改为
public void StartAct(String x, int y)
{
Log.e(x,"num is:"+y);
UnityPlayer.UnitySendMessage("Manager","AndroidReceive","OKKKKKK");
}
(3)之后如前,替换class.jar
运行时,点击do按钮,下方显示OKKKKKK,表明回传成功!