Unity和android通信
前言:
最近做Unity接入各平台SDK,看了雨松MOMO博客(http://www.xuanyusong.com/archives/667),更新SDK包到最新的4.4,做了个demo,出现各种问题,为了解决这些问题,
整了整整2天才跑通。现记录下来以后查看。
1:eclipse创建android工程项目UnitySDK
注意:
Minimum Required SDK 选择最低API 9,因为最新的SDK包 使用的 setContentView(R.layout.activity_main); startActivity(intent);
需要API9,不然就会提示错误:Call requires API level 9 (current min is 8): android.app.NativeActivity#setContentView。
而eclipse又很难检测出此错误,即使 android:minSdkVersion="8" ,eclipse打包没有修改的sdk包apk仍正常在真机上运行显示activity。
但是,一旦导入到unity工程中生成apk后,就会显示不出要启动的activity,加载setContentView(R.layout.activity_main) 报错:
android.content.res.resoureces$NotFoundException 提示无法找到 activity_main 的ID。
为了这个问题,痛苦了1天,不知道哪里出问题。因此在创建android工程后,最好手动检测下:
右键工程项目->android tools -> 点击 run lints: check common errors ,来显示目前项目上的错误。如果 android:minSdkVersion= 低于api对应的版本就会提示出来。
2:创建主Activity
Unity程序一起动就会调用这个MainActivity.java,它是在AndroidManifest.xml中配置的。它需要继承unity的UnityPlayerActivity类。
因此需要unity提供的android的classes.jarr文件,
路径:E:\unity4.5\Data\PlaybackEngines\androidplayer\development\bin 下可以找到。
需要导入到android工程里面,看android工程是否存在libs文件夹,sdk更新后,
每次创建android工程都会自动创建libs的。我们需要把classes.jar 文件放入libs里面。
对工程按F5刷新,则会自动导入到private Libraries里面:
MainActivity.java :
package com.example.unitysdk; import android.content.Context; import android.content.Intent; import android.os.Bundle; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { Context mContext = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; } public void StartActivity0(String name) { Intent intent = new Intent(mContext,TestActivity0.class); intent.putExtra("name", name); this.startActivity(intent); } }
TestActivity0.java:
package com.example.unitysdk; import android.app.Activity; import android.os.Bundle; public class TestActivity0 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
TestActivity0属于Unity程序的子Activity所以它不需要继承UnityPlayerActivity,直接继承Activity即可。
<span style="font-family: Arial, Helvetica, sans-serif;">Activity_main.xml: 默认的</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="html"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.unitysdk.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
3:修改下AndroidManifest.xml文件,添加TestActivity0的activity
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.unitysdk" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.unitysdk.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.unitysdk.TestActivity0" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > </activity> </application> </manifest>
4:修改res/values,values-xx里面的styles.xml,删掉menu里面的文件main.xml
</pre><pre code_snippet_id="482409" snippet_file_name="blog_20141011_14_7145067" name="code" class="csharp" style="font-family: Verdana, 'Microsoft YaHei';"><pre name="code" class="html"><style name="AppBaseTheme" parent="Theme.AppCompat.Light"> 改为 <style name="AppBaseTheme" parent="android:Theme.Light"> 同理,将 <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 改为 <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 不然在unity生成apk时候报错: Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details. E:\android\android-sdks\build-tools\19.1.0\aapt.exe package --auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S "res" -I "E:/android/android-sdks/platforms/android-20\android.jar" -F bin/resources.ap_ stderr[ res\values\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'. res\values-v11\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'. res\values-v14\styles.xml:8: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.
5:导出此工程的jar文件
不要手动用jar命令去导出,直接右键工程项目->Export->Java->JAR file
一直默认,点击Finish就导出了sdk.jar文件了。
6:创建unity工程,放入sdk.jar文件。
Unity工程中文件夹的结构如下,Plugins->Android的名称不能修改。把android工程文件:res文件夹,AndroidManifest.xml
拷贝到unity的Assets/Plugins/Android/ 目录下。Sdk.jar也放到此目录下。
</pre><pre code_snippet_id="482409" snippet_file_name="blog_20141011_24_6056199" name="code" class="csharp" style="font-family: Verdana, 'Microsoft YaHei';">using System.Collections; public class Test : MonoBehaviour { void OnGUI() { if (GUILayout.Button("OPEN Activity01", GUILayout.Height(100))) { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); jo.Call("StartActivity0", "第一个Activity"); } } }
8:最后要注意Unity中的包名,要和Android工程保持一致,否则无法调用。如下图所示,Bundle Identifier* 当前项目为com.example.unitysdk 。
</pre><pre code_snippet_id="482409" snippet_file_name="blog_20141011_27_3799115" name="code" class="csharp" style="font-family: Verdana, 'Microsoft YaHei';">9:build打包生成APK。
</pre><pre name="code" class="csharp" style="font-family:Verdana,'Microsoft YaHei'">
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。