Android與Unity互動研究
Android與Unity互動研究
Android與Unity互動研究 unity與android互動的由來 unity簡單介紹 unity與android互動介紹 unity調用android的方法 android調用untiy的方法
unity與android互動的由來
本人在項目開發過程中,遇到這樣一個需求,把unity的情境放到android中去顯示。剛開始做的時候也是一頭霧水,unity是什麼東西都沒聽說過。後來也是查詢很多資料,才實現了需求的效果。所以把自己的一些總結記錄於此,方便各位同行參考。
unity簡單介紹
unity是可以開發諸如三維視頻遊戲、建築模型、三維動畫等互動類內容的多平台綜合遊戲開發工具,具有很強大的跨平台性。在unity之中編寫好情境和程式之後,可以匯出Android、ios、windows phone、PC等多個平台的版本。
如,列出了unity可以匯出的所有平台。
unity與android互動介紹
一般的都是,把unity作為android程式中的一部分,將一個u3d情境當成一個介面或者一個介面的一部分。
還有的是把android作為unity的一部分進行開發。不過這種形式的開發很少,也沒必要。
我們下面以一個例子來介紹二者之間的互動。
首先,在unity中搞了一個遊戲情境,運行之後如:
此情境中“1”是一個label,用來顯示從android中設定的怪獸人物的名稱。“2”用於在android程式中控制大小顯示變化的。“3”是用與unity中測試大小變化的。
unity調用android的方法
我們需要在運行起來Unity引擎之後,調用java類中的方法擷取怪獸的姓名,就需要Uniy調用Android的方法。
unity調用java方法一共有四種形式,分別是:
沒有傳回值的普通方法
AndroidJavaObject jo = new AndroidJavaObject(android.content.res.Configuration);jo.Call(setToDefaults);
帶有傳回值的普通方法
AndroidJavaObject jo = new AndroidJavaObject(java.lang.String, some string);int hash = jo.Call(hashCode);
沒有傳回值的靜態方法
AndroidJavaObject jo = new AndroidJavaObject(android.os.Binder);jo.CallStatic(flushPendingCommands);
帶有傳回值的靜態方法
AndroidJavaObject jo = new AndroidJavaObject(java.lang.String);string valueString = jo.CallStatic(valueOf, 42.0);
我們往遊戲對象上綁定一些操作–Operate.cs :
using UnityEngine;using System.Collections;public class Operate : MonoBehaviour {public Transform target;public UILabel label;public bool flag = true;/// /// 定義旋轉速度/// public float RotateSpeed=45;// Use this for in itializationvoid Start () { //Debug.Log(hello); this.name = Manager; GetData ();}/// /// 通過調用android中的方法擷取name,並為label賦值/// void GetData(){ AndroidJavaClass jc = new AndroidJavaClass (com.unity3d.player.UnityPlayer); AndroidJavaObject jo = jc.GetStatic (currentActivity); string name = jo.Call (getName, 成功調用android方法); label.text = name;}// Update is called once per framevoid Update () { //target.Rotate (Vector3.up * Time.deltaTime * RotateSpeed);}void OnClick(){ Screen.orientation = ScreenOrientation.Landscape; if (flag) { target.localScale = new Vector3 (0.5f, 0.5f, 0.5f); flag = false; //label.text = 123456; } else { target.localScale = new Vector3 (0.75f, 0.75f, 0.75f); flag = true; //label.text = 000000; } } /// /// 頂掉之前的scene /// void Unload(){ Application.LoadLevel (1); AndroidJavaClass jc = new AndroidJavaClass (com.unity3d.player.UnityPlayer); AndroidJavaObject jo = jc.GetStatic (currentActivity); jo.Call (makePauseUnity); }/// /// 放大/// void ZoomIn(){ target.localScale = new Vector3 (0.75f, 0.75f, 0.75f);}/// /// 縮小/// void ZoomOut(){ target.localScale = new Vector3 (0.5f, 0.5f, 0.5f);}}
代碼和情境編寫好之後,就可以使用unity到處apk檔案運行了。不過我們需要在eclipse中進行二次開發,所以需要到處android工程。
在匯出的時候,可以選擇匯出”Google Android Project”。
如,如果不勾選此選項,則匯出的是一個apk檔案。
在匯出android工程或apk之前,需要在”Player Settings”進行一些配置:
這些配置與我們在eclipse等工具進行開發設定的基本一致。
匯出android工程之後,看到目錄結構如下:
vc7Sw8e1xLK8vtbW0Dwvc3Ryb25nPqGjPC9wPg0KPGhyIC8+DQo8cD61vLP2YW5kcm9pZLmks8zWrrrzo6y74bP2z9bBvdbWx+m/9qO6PC9wPg0KxOPS0b6t09BhbmRyb2lkuaSzzMHLo6y0y8qx1rvQ6NKqsNFhc3NldHO1xM7EvP66zWxpYnO1xLD8v72xtLW9xOO1xM/uxL/W0Milo6zU2rDR0OjSqsXk1sO1xMDg1NpBbmRyb2lkTWFuaWZlc3QueG1s1tDF5NbD0rvPwqGjIMO709C5pLPMo6zEx8O01rvQ6NKqsNF1bml0ebW8s/a1xLmks8y1vMjrxOO1xElERdbQvLS/yaGjDQo8cD6/tNK7z8JNYWluQWN0aXZpdHm1xLK8vtajujwvcD4NCjxwcmUgY2xhc3M9"brush:java;">
貼上邏輯代碼之前,先介紹一下Android調用unity方法的方式:
android調用untiy的方法:
UnityPlayer.UnitySendMessage(Manager, ZoomIn, );
第一個參數是Game Object對象,所以需要在遊戲對象上綁定指令碼,第二個參數是unity中定義的方法名,第三個參數是定義方法的參數(可空)。
既可以在定義情境的時候將遊戲對象改名字,也可以在代碼中設定:
void Start () { this.name = Manager; GetData (); }
在unity中運行之後,就會發現出現一個”Manager”的遊戲情境了。
下面看一下activity的代碼:
package com.jacksen.unity2android;import com.unity3d.player.UnityPlayer;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.Toast;public class MainActivity extends UnityPlayerActivity { private LinearLayout u3dLayout; private Button zoomInBtn, zoomOutBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); u3dLayout = (LinearLayout) findViewById(R.id.u3d_layout); u3dLayout.addView(mUnityPlayer); mUnityPlayer.requestFocus(); zoomInBtn = (Button) findViewById(R.id.zoom_in_btn); zoomOutBtn = (Button) findViewById(R.id.zoom_out_btn); zoomInBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { UnityPlayer.UnitySendMessage(Manager, ZoomIn, ); } }); zoomOutBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { UnityPlayer.UnitySendMessage(Manager, ZoomOut, ); } }); } public String getName(final String str) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, str, 1000).show(); } }); return 我是怪獸,哈哈哈; } /** * 3D調用此方法,用於退出3D */ public void makePauseUnity() { runOnUiThread(new Runnable() { @Override public void run() { if (mUnityPlayer != null) { try { mUnityPlayer.quit(); } catch (Exception e) { e.printStackTrace(); } } MainActivity.this.finish(); } }); } /** * 按鍵點擊事件 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { onDestroy(); } return true; } @Override protected void onDestroy() { super.onDestroy(); //UnityPlayer.UnitySendMessage(Manager, Unload, ); mUnityPlayer.quit(); } // Pause Unity @Override protected void onPause() { super.onPause(); mUnityPlayer.pause(); } // Resume Unity @Override protected void onResume() { super.onResume(); mUnityPlayer.resume(); } @Override public void onBackPressed() { super.onBackPressed(); // mUnityPlayer.quit(); // this.finish(); }}
OK,運行效果如下:
跳轉到MainActivity之後,unity情境啟動,調用android中的getName()方法為怪獸頭上的label賦值。
點擊放大後縮小按鈕分別調用Unity中的ZoomIn()和ZoomOut()方法,控制怪獸變大變小。
OK,至此unity與android的簡單互動敘述完畢。