1. 程式人生 > >[Unity3D]Unity+Android互動教程——讓手機"動"起來

[Unity3D]Unity+Android互動教程——讓手機"動"起來

想要用Unity實現一個二維碼掃描的功能,然後網上找外掛,找到一個貌似叫EasyCodeScanner,但下載下來用用,真不好使,一匯入執行就報錯,調好錯了再執行發現點按鈕沒反應,反覆試了幾遍發現還是沒反應,沒辦法看原始碼,結果發現只實現了IOS部分,沒有Android部分,我屮艸芔茻...,神傷!用IOS真機測試吧,還是有問題,果斷放棄了,下定決心自己動手豐衣足食,雖然不瞭解Android,但沒有學不起來的,只要想,就沒有實現不了的!!!首先還是得學習一下Android和Unity的簡單互動,在這兒寫個詳細點的教程!供初學者學習,當然網上也有這方面的教程,有的地方不注意的話,還是會碰到困擾的,下面是詳細步驟!更多教程敬請關注我的

微博

效果這裡展示的Unity呼叫Android原生的方法實現點選Unity介面中的按鈕,然後實現手機的震動!

關於最基本的互動,可以參考這篇文章,Unity與Android基本互動,然後在這基礎之上來做實現手機震動,其實也差不多!可能重複了,當自我鞏固吧,呵呵!

測試方法:必須要真機測試!!!

實現步驟:

一、建立Android工程

1.建立工程


2.匯入Unity相關jar

Jar目錄:unity的安裝路徑\Editor\Data\PlaybackEngines\androidplayer\bin下的classes.jar

3.開啟MainActivity.java,匯入各種包,編寫自己的函式

[java] view plaincopyprint?
  1. package com.example.clickshake;  
  2. import android.os.Bundle;  
  3. import com.unity3d.player.UnityPlayerActivity;  
  4. import android.app.Service;  
  5. import android.os.Vibrator;  //震動的包
  6. publicclass MainActivity extends UnityPlayerActivity {  
  7.     private Vibrator mVibrator01;
    //宣告一個振動器物件
  8.     @Override
  9.     protectedvoid onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.     }  
  12.     //震動函式
  13.     publicvoid ClickShake()  
  14.     {  
  15.         mVibrator01 = (Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE);   
  16.         mVibrator01.vibrate(newlong[]{100,10,100,1000},-1);//自定義整棟模式,只震動一次
  17.     }  
  18.     //判斷大小
  19.     publicint Max(int a,int b)  
  20.     {  
  21.         if(a>b)  
  22.             return a;  
  23.         return b;  
  24.     }  
  25. }  

新增unityActivity,使MainActivity繼承UnityPlayerActivity,並把SetContentView函式刪掉(不然到手機上啟動程式的時候就會只看到一句HelloWorld),這裡有兩個自己自定義的函式主要的就是上面的沒有引數的呼叫振動器的自定義函式,還有個就是有返回值有引數的比較大小的函式,這裡用兩個不同的函式在Unity中呼叫做對比!

4.修改XML並且新增震動許可權

新增允許震動的許可權,選擇AndroidManifest.xml,然後點選Permissions->Add UserPermission->android.perssion.VIBRATE。

5.匯出jar包

在專案根目錄上右擊->Export

點選Finish結束!

二、建立Unity工程

1.在Assets下建立Plugins/Android資料夾,這個資料夾是特殊資料夾,專門用與存放Android的包檔案,以便呼叫Android介面

將檔案的xml,jar,res,libs檔案放在Android檔案下

2.寫Unity呼叫Android程式碼

[csharp] view plaincopyprint?
  1. using UnityEngine;  
  2. using System.Collections;  
  3. publicclass NewBehaviourScript : MonoBehaviour {  
  4.     private AndroidJavaObject activity;  
  5.     privateint res = 0;  
  6.     // Use this for initialization
  7.     void Start () {  
  8.         AndroidJavaClass jc=new AndroidJavaClass("com.unity3d.player.UnityPlayer");  
  9.         activity = jc.GetStatic<AndroidJavaObject>("currentActivity");  
  10.         res = activity.Call<int>("Max"newobject[] { 10, 20 });  
  11.     }  
  12.     void OnGUI()  
  13.     {  
  14.         GUI.Label(new Rect(20, 20, 300, 20), "呼叫的Android方法:求出10和20中比較大的數字是"+res.ToString());  
  15.         GUI.Label(new Rect(20, 70, 300, 20), "http://blog.csdn.net/dingxiaowei2013");  
  16.         if ( GUI.Button(new Rect(Screen.width / 2 - 20, Screen.height / 2 + 20, 100, 40), "點選震動"))  
  17.         {  
  18.             activity.Call("ClickShake");  
  19.         }  
  20.     }  
  21. }  

說明AndroidJavaObject是一個java物件,這裡獲取的是java檢視,然後呼叫自定義方法。 (注:初步瞭解這裡的引數之所以填”com.unity3d.player.UnityPlayer”和”currentActivity”,是因為在生成jar檔案的時候,已經指定了MainActivityclass繼承UnityPlayerActivity,也在XML指定了MainActivity是Main class)
activity.Call<int>("","");這個呼叫的是有返回值的方法,int是返回型別,activity.Call("");呼叫的是沒返回值沒引數的方法

3.匯出設定(Importent)


4.真機測試

我就不上傳截圖了,大概就是一個按鈕,能夠點選使手機震動,還有一個label,顯示10和20比較的結果值。