Android與Unity互動研究,AndroidUnity研究

來源:互聯網
上載者:User

Android與Unity互動研究,AndroidUnity研究
Android與Unity互動研究

轉載請註明出處:http://blog.csdn.net/crazy1235/article/details/46733221

  • 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<int>("hashCode");
  • 沒有傳回值的靜態方法
AndroidJavaObject jo = new AndroidJavaObject("android.os.Binder");jo.CallStatic("flushPendingCommands");
  • 帶有傳回值的靜態方法
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String");string valueString = jo.CallStatic<string>("valueOf", 42.0);

我們往遊戲對象上綁定一些操作–Operate.cs :

using UnityEngine;using System.Collections;public class Operate : MonoBehaviour {public Transform target;public UILabel label;public bool flag = true;/// <summary>/// 定義旋轉速度/// </summary>public float RotateSpeed=45;// Use this for in  itializationvoid Start () { //Debug.Log("hello"); this.name = "Manager"; GetData ();}/// <summary>/// 通過調用android中的方法擷取name,並為label賦值/// </summary>void GetData(){ AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");   string name = jo.Call <string>("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";   } } /// <summary> /// 頂掉之前的scene /// </summary>void Unload(){    Application.LoadLevel (1);    AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");      jo.Call ("makePauseUnity"); }/// <summary>/// 放大/// </summary>void ZoomIn(){    target.localScale = new Vector3 (0.75f, 0.75f, 0.75f);}/// <summary>/// 縮小/// </summary>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工程之後,看到目錄結構如下:

  • assets檔案下面是unity的一些資源檔,包括情境和渲染的檔案。
  • libs下面當然就是jar包和so檔案了。
  • src下麵包含三個java類。建議使用UnityPlayerActivity.java

開啟UnityPlayerActivity之後,會發現裡面有一個對象時UnityPlayer的執行個體,我們做android中嵌套U3D情境的時候,就是把這個執行個體當成一個view添加到我們的布局中

匯出android工程之後,會出現兩種情況:

  • 你已經有android工程了,此時只需要把assets的檔案和libs的包拷貝到你的項目中去,在把需要配置的類在AndroidManifest.xml中配置一下。
  • 沒有工程,那麼只需要把unity匯出的工程匯入你的IDE中即可。

看一下MainActivity的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#E0EEE0"    android:gravity="center_horizontal"    android:orientation="vertical" >    <!-- 3D視圖地區 -->    <LinearLayout        android:id="@+id/u3d_layout"        android:layout_width="match_parent"        android:layout_height="300dp"        android:background="#a6a9af"        android:orientation="vertical" >    </LinearLayout>    <!-- 放大 -->    <Button        android:id="@+id/zoom_in_btn"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:layout_marginTop="20dp"        android:padding="10dp"        android:text="放大" />    <!-- 縮小 -->    <Button        android:id="@+id/zoom_out_btn"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:layout_marginTop="20dp"        android:padding="10dp"        android:text="縮小" />    <!-- 全屏 -->    <Button        android:id="@+id/u3d_fullscreen_btn"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:layout_marginTop="20dp"        android:padding="10dp"        android:text="全屏" /></LinearLayout>

貼上邏輯代碼之前,先介紹一下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的簡單互動敘述完畢。

此篇blog到此結束~~
感謝大家支援!如有錯誤,請指出~~
謝謝~

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.