将Unity3D游戏移植到Android平台是一件很容易的事情,只须要在File->Build Settings中选择Android平台,而后点击Switch Platform并Build出apk便可。一般,咱们的工做不只限于此,通常还须要给手机游戏加入计费、广告等功能。这些功能通常没有提供Unity3D插件,咱们须要将游戏导出为Android工程,而后添加这些功能;或者,咱们根据这些计费sdk来作本身想要的Unity3D插件,而后直接在Unity3D中使用。java
1.从Unity3D到Android工程android
为了实现交互,咱们采用的是简单的函数相互调用。若是咱们在Unity3D中想调用Android代码,那么能够在脚本文件C#中这样写:app
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity"); activity.Call("UnlockGame")
第一行代码构造了"com.unity3d.player.UnityPlayer"类的一个对象,而后获取了本类的静态成员"currentActivity",取得了activity就能够调用Android代码了(若是你在Unity导出的Eclipse工程中查看unity-class.jar这个文件中的类,你会发现com.unity3d.player这个package下就有UnityPlayer.class这个类,这个类中有个currentActivity)。这个UnlockGame函数是简单的成员方法,通常直接写在MainActivity中,也就是说Android代码中必需要有UnlockGame这个函数,而后才能调用;而"com.unity3d.player.UnityPlayer"和"currentActivity"都是默认的参数。eclipse
若是要在Android工程中调用Unity3D中的方法,咱们须要新建一个Android工程。能够这样写java代码:ide
UnityPlayer.UnitySendMessage("AndroidManager", "AndroidCallBackUnlockGame", "");
这里调用了Unity3D中"AndroidCallBackUnlockGame"这个方法,最终激活了游戏。第一个参数表示Unity3D中某个gameObject,第二个参数是这个gameObject上的脚本中的某个方法,第三个参数是这个方法的参数。函数
上面只是讲述了交互的基本原理,下面是详细步骤。ui
(1)在Unity3D中建立脚本,如上面第一段代码所示,加入调用Android函数的代码;若是Android要调用C#代码,也要写下被Android代码回调的C#函数。而后,把Unity项目导出为Android工程便可。这里须要注意下图红色部分,其中Bundle Identifier就是导出的Android工程的包名。this
(2)打开Eclipse,导入工程,选择import->Existing Android Code Into Workspace,最好把Copy Into WorkSpace选项也选上,这个工程一般叫作“UnityPlayerProxyActivity”。导入工程后,咱们能够直接运行这个工程了。但这里是为了与Android代码交互,因此还不能这样作。一般的方法是,咱们新建一个Android Application Project,包名必须与导入的工程包名相同;而后把导入的工程做为新工程的Library Project,在工程的Properties里设置,以下图所示。spa
(3)将导入的Unity工程assets目录里的bin和libs目录(新版的没有lib目录)拖放到新工程的assets目录里,即移动资源位置而已。说明一点,新建的Android工程做为了主工程,导入的Unity工程做为了Library Project,它们的Assets和Res资源将会最终合并在一块儿,但主工程必需要添加Library工程中全部须要的配置信息,也就是AndroidManifest.xml中的内容。这里还可能遇到资源ID冲突的现象,优先级高的主工程将覆盖优先级低的工程。插件
(4)好了,如今咱们有两个工程,一个是新建的,一个是从Unity3D中导入的。这里必须学点Android开发的基础知识,onCreate函数是入口函数,其它的自学吧。想在Android里调用Unity3D代码,就用本文开头的第二段代码便可。一般,咱们在新工程里建立一个Activity,在AndroidManifest.xml里进行设置要启动的Activity。假设要启动的是MainActivity,那么对于MainActivity这个类,咱们要让它继承UnityPlayerActivity这个类,而后在Oncreate里调用super.onCreate便可。而后,运行新工程,咱们的Unity3D游戏也跟着启动了。咱们的主工程是新建的,没有设置任何视图,之因此启动了游戏,是由于继承了UnityPlayerActivity这个类,而后调用super.onCreate经过父类启动了游戏。
public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); } }
既然是基础,我在说的详细点。首先建立新的Android Application Project,注意包名与导入的工程一致,而且不要建立Activity, 咱们手动建立。而后新建一个类,类名暂且为MainActivity,package name必须与前面说的一致。而后写上上图中的代码。若是有错误提示,按下ctrl + shift + O能够导入所需类库。若是还有红色错误,请检查你是否引用了Unity工程。咱们要手动建立Activity,还要在AndroidManifest.xml这个文件里作设置,以下所示。
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="orientation|keyboard" android:screenOrientation="landscape"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
其中的android:name=".MainActivity"表示这个Activity关联的类是前面建立的MainActivity类,这里省略了前面的包名。已经设置完了,如今能够run了。有一点要记住,若是你在Unity的C#代码里调用了某个Android函数,MainActivity类中必定要添加这个函数。另外,若是你不添加android:screenOrientation可能会致使程序启动崩溃。
2.从Android工程到Unity3D
(1)新建一个Android工程,不要建立Activity,在properties属性里把工程设置为library.
(2)到安装目录C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin下面复制classes.jar这个文件到Android工程的libs目录下面。
(3)新建一个类,这里是MainActivity,写法以下,咱们会在Unity3D中调用TextToast这个函数。这里一样要注意包名,要与Unity3D中Bundle Identifier相同。注意这里必须使用runOnUiThread处理UI线程。
public class MainActivity extends UnityPlayerActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); } protected void TextToast(final String msg){ runOnUiThread(new Runnable(){ public void run(){ Text(msg); } }); } public void Text(String msg){ Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }
(4)在菜单里选择Project->Clean,而后在工程目录的bin下面找到刚生成的jar文件,咱们能够直接把这个jar文件导入Unity3D中做为插件使用,即放到目录Assets/Plugins/Android下面便可。在Unity3D的安装目录C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer下面找到AndroidManifest.xml这个文件,也复制到Assets/Plugins/Android这个目录下。打开这个xml文件,修改Activity名称与eclipse工程中的Activity一致,即把com.unity3d.player.UnityPlayerProxyActivity修改成包名.MainActivity,我这里是com.activ8.ppt.MainActivity。设置完成,咱们如今能够在Unity3D中使用该插件了,使用方法见本文开头第一段代码。Unity4.3之后,配置文件修改方法已经改变,还要修改package为你的包名,建议查看Unity Manual文档,查找”Building Plugins for Android",而后查找”AndroidManifest.xml“文件便可看到相关设置代码。