非常詳細(xì)的測(cè)試unity與android之間的通訊操作
轉(zhuǎn)載自 http://www./club/thread-320335-1.html
這段時(shí)間在研究嵌入sdk,途中遇到不少問題和坑,在這就不一一說(shuō)了。嵌入sdk是比較常見的吧,如接入廣告啊, 新浪的分享...... 這些都需要接入sdk的。(這些我在這段時(shí)間都應(yīng)以研究成功了,后期會(huì)寫上)?,F(xiàn)在我們從最基本的做吧。 其實(shí)這些和什么引擎都是沒多大關(guān)系的。不管是 unity,還是cosos2d...... 說(shuō)白了,這些就是和移動(dòng)平臺(tái)有關(guān)系。ios,android,wp8啊。
如果你不熟悉android,沒關(guān)系,即使你是從未打開過eclipse都可以,因?yàn)槲野言敿?xì)步驟給以圖片的方式展示出來(lái)?,F(xiàn)在我們就從最基本的做起吧。主要是實(shí)現(xiàn)在unity中去調(diào)android的方法。其實(shí)這個(gè)很簡(jiǎn)單,只是為了從未接觸過安卓的人才弄的這樣詳細(xì)。(我以前沒接觸過安卓,當(dāng)時(shí)多么希望能有一份這樣的教程教導(dǎo)我啊。)
1. 打開eclipse,新建一個(gè)安卓的工程。
在 這里要注意我們的包名,和最低的sdk,包名的話我們?cè)趗nity中導(dǎo)出的時(shí)候需要用到。至于最低的sdk就是一個(gè)兼容問題了,如果我們選4.0一下的 話,那當(dāng)我們?cè)趗nity導(dǎo)出的時(shí)候會(huì)報(bào)錯(cuò)誤的。我在這坑了很久很久,最后才發(fā)現(xiàn)一系列的錯(cuò)誤是這個(gè)因起來(lái)的。最好是要在32位的sdk,jdk中進(jìn)行 吧,這樣會(huì)少很多莫名的錯(cuò)誤問題, 注意的就是我在下圖圈起來(lái)的地方。
我們一直狂點(diǎn)下一步,當(dāng)我們看見這個(gè)時(shí),就是最后一步了。
如果大家都沒錯(cuò),創(chuàng)建的新工程就是如下一樣了。我圈起來(lái)的地方多是會(huì)用到了,需要注意的地方。
2.現(xiàn)在我們安卓工程創(chuàng)建好了,就到了開始編寫的時(shí)候了。我們打開unity的安裝目錄
例如:D:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin找到class.jar 。
這個(gè)是unity幫我們封裝好了的jar包,我們要用到該包。
然后我們將class.jar,放進(jìn)我們的安卓工程去。直接拖進(jìn)libs目錄就可以。如圖
現(xiàn)在我們來(lái)引用下吧,選中它,右鍵.......... 如下:
3. 好了,現(xiàn)在我們把重要的都加進(jìn)來(lái)了,那我們現(xiàn)在就來(lái)做個(gè)簡(jiǎn)單的實(shí)驗(yàn),就是點(diǎn)擊unity中德按鈕,打開一個(gè)安卓的ACtivity吧。我們首先要做的就是 把這個(gè)Activity布局。我們?cè)趓es--layout文件夾下找到activity_main打開,加入這些內(nèi)容:
Xml代碼 - <?xml version="1.0" encoding="utf-8"?>
- <ScrollView
- xmlns:android="http://schemas./apk/res/android"
- xmlns:tools="http://schemas./tools"
- android:id="@+id/container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.ITFFuture.testua.MainActivity"
- tools:ignore="MergeRootFrame" >
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <TextView
- android:id="@+id/textView0"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textColor="#000000"
- android:textSize="18sp"
- android:background="#00FF00"
- android:text="測(cè)試Unity和Android之間額通訊"
- android:gravity="center_vertical|center_horizontal" />
- <TextView
- android:id="@+id/textView1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFFFFF"
- android:textSize="18sp"
- android:background="#0000FF"
- android:text="大家好,我是安卓的Activity"
- android:gravity="center_vertical|center_horizontal" />
- <Button
- android:id="@+id/button0"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="關(guān)閉這個(gè)Activity"/>
- </LinearLayout>
- </ScrollView>
我們的內(nèi)容轉(zhuǎn)成實(shí)際界面是這樣的樣子。
現(xiàn)在我們來(lái)新建一個(gè)Class,取名為OpenActivity1,如圖:
然后我們接入代碼,代碼內(nèi)容如下:
Java代碼 - package com.ITFFuture.testua;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
-
- public class OpenActivity1 extends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- TextView text = (TextView)this.findViewById(R.id.textView1);
- text.setText(this.getIntent().getStringExtra("name"));
- Button close = (Button)this.findViewById(R.id.button0);
- close.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- OpenActivity1.this.finish();
- }
- });
- }
- }
這個(gè)代碼很簡(jiǎn)單,,改變中間的字母內(nèi)容,是點(diǎn)擊關(guān)閉按鈕,關(guān)閉此Activity.最終效果如下:
好了,現(xiàn)在我們?cè)贛ainActivity中謝方法吧,這個(gè)Activity就相當(dāng)于第一個(gè)場(chǎng)景。 MainActivity的內(nèi)容:
Java代碼 - package com.ITFFuture.testua;
-
- import com.unity3d.player.UnityPlayerActivity;
-
- import android.os.Bundle;
- import android.app.Activity;
- import android.content.Context;
- import android.content.Intent;
-
- public class MainActivity extends UnityPlayerActivity {
-
- Activity mActivity=null;
- Context mContext = null;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mActivity=this;
- mContext = this;
- StartActivity1("我是通過安卓中顯示的Activity");
- }
-
- public void StartActivity1(String name) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(mContext,OpenActivity1.class);
- intent.putExtra("name", name);
- mActivity.startActivity(intent);
- }
- }
還有最后一點(diǎn),要配置AndroidManifest.xml.聲明我們定義的Activity.
Xml代碼 - <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas./apk/res/android"
- package="com.ITFFuture.testua"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="18" />
-
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.ITFFuture.testua.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:theme="@android:style/Theme.NoTitleBar.Fullscreen"
- android:name=".OpenActivity1">
- </activity>
- </application>
-
- </manifest>
我們主要是聲明了我們自己的Avtivity,這個(gè)很重要,在后期加入廣告啊,新浪微博分享愛啊....
好了,那我們最終來(lái)導(dǎo)出jar包吧。在導(dǎo)出之前還是先刷新下(F5),和Build 下Project.
我們現(xiàn)在來(lái)導(dǎo)出吧。
現(xiàn)在我們的jar包已經(jīng)成功導(dǎo)出了。是這樣子的
我們?cè)诎沧恐械乃胁僮饕簿屯瓿闪斯?,現(xiàn)在接下來(lái)的就是如何和unity進(jìn)行互通了。
上面導(dǎo)出的jar文件(Test.jar)如果用解壓軟件打開會(huì)發(fā)現(xiàn),除了class文件,還有項(xiàng)目中的資源文件、lib庫(kù),這樣雖然這個(gè)jar文件在unity中可以使用,但增大了文件大小,因此可以用下面的方法來(lái)導(dǎo)出一個(gè)純凈的jar文件(只含有class文件)。
代碼所有的.class文件都生成在了Android工程的bin文件夾中,當(dāng)前工程的路徑是 TestUA->bin->classes->com->ITFFuture->testua->你的.class文件。下面需 要對(duì)這些.class文件進(jìn)行打包,蘋果系統(tǒng)的話打開電腦的終端,cd到classes文件夾的目錄下,接著執(zhí)行代碼
Python代碼 - jar -cvf Test.jar *
這行代碼的意思是把當(dāng)前目錄下的所有.class文件打包成.jar文件,保存文件名稱為Test.jar。你可以再解壓看看,可以看到厘米只有class文件。
3.從unity中去調(diào)用
在 unity中,我們新建一個(gè)Plugins文件夾,Plugins下面又建Android文件夾,Android文件夾下再建一個(gè)bin文件夾,我們將我 們導(dǎo)出的jar包放進(jìn)這個(gè)文件夾下,然后我們?cè)趀clipse中的res文件復(fù)制一份放入Android。也要把AndroidManifest.xml 放進(jìn)Android目錄下。詳細(xì)情況如下:
現(xiàn)在我們新建一個(gè)腳本吧。用來(lái)調(diào)用安卓中那個(gè)StartActivity1方法。
C#代碼 - using UnityEngine;
- using System.Collections;
-
- public class js001 : MonoBehaviour {
-
- private AndroidJavaObject m_activity;
-
- // Use this for initialization
- void Start () {
-
- AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
- m_activity = jc.GetStatic<AndroidJavaObject> ("currentActivity");
-
-
- }
-
-
- void OnGUI(){
- //call hello world
- if(GUI.Button(new Rect(50,50,200,40),"Open Activity")){
- m_activity.Call("StartActivity1","Unity中調(diào)出android的方法了");
- }
-
- //quit
- if(Input.GetKey(KeyCode.Escape)||Input.GetKey(KeyCode.Home)){
- Application.Quit();
- }
- }
-
- // Update is called once per frame
- void Update () {
-
- }
- }
最后我們導(dǎo)出apk吧。在其中要設(shè)置一項(xiàng)。就是包名。這個(gè)要和安卓工程的包名一模一樣哦。
然后我們運(yùn)行下吧。
在剛開始的時(shí)候我們會(huì)看安卓中德Activity,然后我們點(diǎn)擊關(guān)閉按鈕,就能看那Unity的Scene了。這個(gè)是我們點(diǎn)擊Open Activity這個(gè)按鈕時(shí)候,安卓中的Activity又被我們打開了。
好了,測(cè)試成功??!
遇到的問題:
1. U3D導(dǎo)出安卓版本,總會(huì)出現(xiàn)Unable to find unity activity in manifest. You need to make sure orientation attribut is set to portrait manually.
解決方法:在AndroidManifest.xml加入一行參數(shù)就可以了。
Xml代碼 - <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
參數(shù)位置如下圖:
|