1. 程式人生 > >android與unity3d互相互動

android與unity3d互相互動

請參看“Android和Unity3d互相呼叫的Demo”的資源

實際上Android調Unity就是用

//第一個引數為unity類所繫結的遊戲物件

//第二個引數為unity方法名

//第三個引數為unity方法的引數

UnityPlayer.UnitySendMessage("Main Camera", "GetMessage" ,"success");//注,要先有unity打包出的android專案才能寫UnityPlayer,否則沒有這個類

Unity調android使用

AndroidJavaClass    jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject   jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

                     jo.Call("button0");//button0是我android中的方法

//需要注意的是,這個呼叫好像是執行緒呼叫,換而言之,不能在呼叫的方法中直接建立AsyncTask,而是需要在handler中建立

Unity 檔案

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {
	public GUIText send1,get1,v1,dis;
	bool send = false;
	AndroidJavaObject jo;
	// Use this for initialization
	void Start () {
		v1.text = ""+1.0;
		if (Application.platform== RuntimePlatform.Android){
			AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        	jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
		}
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetMouseButtonDown(0)){
			send1.text = "send "+Time.time;
			 
			//jo.Call<float>("time1",Time.time);
			get1.text = "get "+jo.Call<float>("time1",Time.time);
            
		}
		if (Application.platform== RuntimePlatform.Android){
			get1.text = ""+jo.Get<float>("x1");
		}
	}
	public void GetMessage(string txt){
		dis.text = txt;
	}
	void OnGUI() {
        if (GUI.Button(new Rect(10, 50, 150, 50), "Button0")){
			if (Application.platform== RuntimePlatform.Android){
				jo.Call("button0");
			}
		}
        if (GUI.Button(new Rect(10, 150, 150, 50), "Button1")){
			if (Application.platform== RuntimePlatform.Android){
				jo.Call("button1");
			}
		}
		if (GUI.Button(new Rect(10, 250, 150, 50), "Button2")){
			if (Application.platform== RuntimePlatform.Android){
				jo.Call("button2");
			}
		}
		if (GUI.Button(new Rect(10, 350, 150, 50), "Button3")){
			if (Application.platform== RuntimePlatform.Android){
				jo.Call("button3");
			}
		}
    }
}

android檔案
public class SDKToUnityActivity extends NativeActivity{
	private static final int USERINFO_WHAT = 1;
	private static final int UPDATE_SCORE_WHAT = 2;
	private static final int RANKING_WHAT = 3;
	private static final int clientId = 1;//使用者自己的專案id
	private static final String clientSecret = "971efa9be0ac8d5f088242d9f77f78e4";//專案的祕鑰
	
	
	OpenCenterAuth auth;
	SsoHandler ssoHandler;
	AccessToken accessToken;
	ObjectAsynTask objectAsynTask;
	
	Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case USERINFO_WHAT:
				OpenCenterData.getUserInfo(SDKToUnityActivity.this, auth, accessToken, new MyDataListener());
				break;
			case UPDATE_SCORE_WHAT:
				Log.d("", msg.what+"---------------------"+msg.arg1);
				OpenCenterData.updateScore(SDKToUnityActivity.this, auth, accessToken, msg.arg1 , new MyDataListener());
				break;
			case RANKING_WHAT:
				OpenCenterData.getRanking(SDKToUnityActivity.this, auth, accessToken, new MyDataListener());
				break;

			default:
				break;
			}
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		//初始化授權資訊
		auth = new OpenCenterAuth(this, clientId, clientSecret, "");
	}
	
	/**
	 * 授權的方法auth
	 */
	public void button0()
	{
		ssoHandler = new SsoHandler(this, auth);
		ssoHandler.authorize(new MyAuthListener());
	}
	
	/**
	 * 獲得使用者資訊呼叫的方法getUserInfo
	 */
	public void button1()
	{	
		handler.sendEmptyMessage(USERINFO_WHAT);
	}
	
	/**
	 * 增加分數的呼叫方法 addScore
	 * @param score
	 */
	public void button2()
	{	
		Message msg = new Message();
		msg.what = UPDATE_SCORE_WHAT;
		msg.arg1 = 59;
		handler.sendMessage(msg);
	}
	
	/**
	 * 獲得使用者的排名getRank
	 */
	public void button3()
	{	
		handler.sendEmptyMessage(RANKING_WHAT);
	}
	
	/**
	 * 授權的監聽器
	 * @author Gc
	 *
	 */
	class MyAuthListener implements OnOpenCenterAuthListener{

		/**
		 * 成功時呼叫的方法
		 */
		@Override
		public void onComplete(String arg0) {
			//儲存token
			accessToken = Oauth2AccessToken.parseAccessToken(arg0);
			//告知unity授權成功
			//第一個引數為unity類所繫結的遊戲物件
			//第二個引數為unity方法名
			//第三個引數為unity方法的引數
			UnityPlayer.UnitySendMessage("Main Camera", "GetMessage" ,"success   "+arg0);
		}
		
		/**
		 * 取消時呼叫的方法
		 */
		@Override
		public void onCancel() {

			UnityPlayer.UnitySendMessage("Main Camera", "GetMessage" ,"onCancel = ");

		}

		@Override
		public void onOpenCenterException(Exception arg0) {

			UnityPlayer.UnitySendMessage("Main Camera", "GetMessage" ,"Exception ");

		}
		
	}
	
	/**
	 * 授權成功與否都會回到這個函式,在這裡面呼叫回撥的方法,ssoHandler會根據返回的值自動呼叫監聽器相應的方法
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (ssoHandler != null) {
			ssoHandler.authorizeCallBack(requestCode, resultCode, data);
		}
	}
	
	/**
	 * 獲取資訊的監聽器
	 * @author Gc
	 *
	 */
	class MyDataListener implements OnOpenCenterDataListener{

		@Override
		public void OnSuccess(Object obj, int tid) {

			UnityPlayer.UnitySendMessage("Main Camera", "GetMessage" ,"OnSuccess--" + obj);

		}
		
		@Override
		public void OnNoNetWork(int tid) {

			UnityPlayer.UnitySendMessage("Main Camera", "GetMessage" ,"NoNetWork--" );

		}
		
		@Override
		public void OnConnectionTimeout(int tid) {

			UnityPlayer.UnitySendMessage("Main Camera", "GetMessage","ConnectionTimeout--");

		}
		
		@Override
		public void OnConnectionFail(int tid) {

			UnityPlayer.UnitySendMessage("Main Camera", "GetMessage","OnConnectionFail--");

		}
		
	}
}


 Unity for Android 比較特殊,Unity for IOS 打包是將XCODE工程直接交給開發者,開發者可以在工程的基礎上繼續新增新的檢視,最後由開發者自行打包生成IPA包,釋出程式。而Unity for Android打包直接生成APK包,等於說原始碼開發者是看不到的,但是Unity的自身確實有些侷限,針對Android平臺我們需要學習如何在Unity中呼叫AndroidJAVA程式碼。本章我們的目標是使用Unity的指令碼開啟Activity。首先我們建立一個普通的Android工程,目錄結構如下圖所示。


因為專案需要使用Unity提供的介面,所以需要將介面classes.jar引入至當前工程但中。介面包的所在地,開啟Finder->應用程式->Unity->點選Unity圖示,滑鼠右鍵選擇顯示包內容”->Contents->PlaybackEngines->AndroidPlayer->bin->classes.jar 。介面包引入工程後,開始編寫JAVA程式碼。

UnityTestActivity.java

  1. package com.xys;  
  2. import android.content.Context;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import com.unity3d.player.UnityPlayerActivity;  
  6. publicclass UnityTestActivity extends UnityPlayerActivity {  
  7.     /** Called when the activity is first created. */
  8.     Context mContext = null;  
  9.     @Override
  10.     publicvoid onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         mContext = this;  
  13.     }  
  14.     publicvoid StartActivity0(String name)  
  15.     {  
  16.         Intent intent = new Intent(mContext,TestActivity0.class);  
  17.         intent.putExtra("name", name);  
  18.         this.startActivity(intent);  
  19.     }  
  20.     publicvoid StartActivity1(String name)  
  21.     {  
  22.         Intent intent = new Intent(mContext,TestActivity1.class);  
  23.         intent.putExtra("name", name);  
  24.         this.startActivity(intent);  
  25.     }  
  26. }  

         UnityTestActivity是主ActivityUnity程式一起動就會呼叫這個Activity,它是在AndroidManifest.xml中配置的。它需要繼承UnityPlayerActivity,然而它就是剛剛我們引入的classes.jar包中提供的介面類。UnityTestActivity對外提供了兩個方法介面,StartActivity0(String name) 方法與StartActivity1(String name)方法,這兩個方法是在Unity中使用C#指令碼呼叫的,意思是呼叫後程序將開啟一個新的Activity,引數name也是由C#指令碼傳遞過來的,接著將傳遞的String引數繼續傳遞給新開啟的Activity

TestActivity0.java

  1. package com.xys;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7. import android.widget.TextView;  
  8. publicclass TestActivity0 extends Activity {  
  9.     /** Called when the activity is first created. */
  10.     @Override
  11.     publicvoid onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.         TextView text = (TextView)this.findViewById(R.id.textView1);  
  15.         text.setText(this.getIntent().getStringExtra("name"));  
  16.         Button close = (Button)this.findViewById(R.id.button0);  
  17.         close.setOnClickListener(new OnClickListener() {  
  18.             @Override
  19.             publicvoid onClick(View v) {  
  20.                 TestActivity0.this.finish();  
  21.             }  
  22.         });  
  23.     }  
  24. }  


TestActivity1.java

  1. package com.xys;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7. import android.widget.TextView;  
  8. publicclass TestActivity1 extends Activity {  
  9.     /** Called when the activity is first created. */
  10.     @Override
  11.     publicvoid onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.         TextView text = (TextView)this.findViewById(R.id.textView1);  
  15.         text.setText(this.getIntent().getStringExtra("name"));  
  16.         Button close = (Button)this.findViewById(R.id.button0);  
  17.         close.setOnClickListener(new OnClickListener() {  
  18.             @Override
  19.             publicvoid onClick(View v) {  
  20.                 TestActivity1.this.finish();  
  21.             }  
  22.         });  
  23.     }  
  24.     publicvoid Start()  
  25.     {  
  26.     }  
  27. }  

使用this.getIntent().getStringExtra(“name”)方法,得到上個介面傳遞過來的字串,並且顯示在螢幕中,用於區分新開啟的ActivityTestActivity0TestActivity1是兩個新開啟的Activity,它們屬於Unity程式的子Activity所以它不需要繼承UnityPlayerActivity,直接繼承Activity即可,在程式碼中監聽了一個按鈕,意思是點選按鈕後關閉當前的Activity

接著是程式碼中開啟的一個佈局檔案,這個應該沒什問題,學過Android開發的朋友應該都能看懂,我就不詳細解釋了。

main.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/screen"
  3.     android:layout_width="fill_parent"

    相關推薦

    androidunity3d互相互動

    請參看“Android和Unity3d互相呼叫的Demo”的資源 實際上Android調Unity就是用 //第一個引數為unity類所繫結的遊戲物件 //第二個引數為unity方法名 //第三個引數為unity方法的引數 UnityPlayer

    AndroidJS互相調用以及註意

    import 調用 spa sha 技術 作用 zhang ces wan 近期項目中常常使用Html5而Android與JS調用常常會用到,這裏記錄一下,測試系統5.0以上。這裏先貼一下源代碼Activity:package jwzhangjie.com.webview

    Android混合開發-(AndroidWeb的互動

    在Android開發中,越來越多的商業專案使用了Android原生控制元件與WebView進行混合開發,當然不僅僅就是顯示一個WebView那麼簡單,有時候還需要本地Java程式碼與HTML中的JavaScript進行互動,Android也對互動做了很好的封裝,所以很容易實現例如:點選網頁中的按鈕A

    AndroidHTML+JS互動

    原創文章 ,首發在 http://blog.csdn.net/leejizhou/article/details/50894531李濟洲的部落格 在Android開發中,越來越多的商業專案使用了android原生控制元件與WebView進行混合開發,當然不僅僅就是顯示一個WebView那

    androidjava web互動完成簡單的登入和註冊

       本文的知識點包括android客戶端的網路程式設計、訊息機制、IO流、多執行緒和java web伺服器端的servlet、資料庫操作、javabean技術、工具類和測試類的使用。 客戶端 執行效果圖 佈局檔案 activity_main.xml <

    Android h5 js互動問題,初步瞭解。

    接觸Android也算很久了,但是js互動一直不熟也可以說是沒認真接觸過。今天專案修改也完成了,閒來無事忽然想起了這個問題,上網查找了一下,初步瞭解了一下。自己也寫了demo還算ok! 廢話不多說了,咱直接來說一下。(寫這個呢可能幫不到太多人,但是想讓自己印象深刻一些!) 首先,js互動分為

    AndroidJavaWeb伺服器互動教程(3)-一個簡單的Android專案

    1.前言 是時候該寫Android端了。。。 2.建立專案 3.匯入xUtils3框架 送上xUtil3框架的傳送門 附上jar包的下載地址: 百度雲 七牛雲 以及json的下載地址 七牛雲 百度雲 把jar包拷入libs

    WebView的使用以及AndroidJs的互動

    1.WebView基礎使用 1.想要使用WebView,需要在<manifest>中新增許可權: <uses-permission android:name="android.permission.INTERNET" />2.我們可以在xml

    AndroidH5的互動

                    webView.setVerticalScrollBarEnabled(false);webView.setHorizontalScrollBarEnabled(false);webView.getSettings().setJavaScriptEnabled(true);//

    Android實現登入功能,Android伺服器資料互動,使用tomcat、mysql實現登入的demo程式,web端和android均可實現登入

    1.使用到的開發工具為:Eclipse(Java EE),Android Studio,MYSQL 5.7.21;2.首先在MYSQL資料庫建表,我這裡使用的資料庫視覺化操作軟體為:navicat premium:如圖:這裡你可以取自己喜歡的資料庫名字,但是為了方便起見,我建

    android服務端互動的兩種方式

    做android開發的程式設計師必須知道android客戶端應該如何與服務端進行互動,這裡主要介紹的是使用json資料進行互動。服務端從資料庫查出資料並以json字串的格式或者map集合的格式返回到客戶端,客戶端進行解析並輸出到手機螢幕上。 此處介紹兩種方式:

    高德地圖元件在Android的應用以及AndroidJavaScript的互動(一)

    最近在慕課網學習了關於高德地圖元件的課程(其實就是一個廣告,內容和官網的API完全一樣),發現這個JavaScript API比Android API簡單方便多了,於是就打算放在Android APP上來實現,花了一點小功夫,但是最終還是實現了,後來打算擴充套件

    android網頁js互動 json傳參格式問題

    如果不進行格式轉換,安卓客戶端獲取到的引數內容是undefined 網上存在多種方法: 1)jQuery外掛支援的轉換方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以將json字串轉換成json物件 2)

    AndroidJS互相呼叫

    1、HTML頁面 <!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文件</title> <script> va

    android中Webviewjavascript的互動互相呼叫)

    最近做android專案中遇到要在webview中做與js互動相關的東東,涉及到js中呼叫android本地的方法,於是查了資料整理了一下android和js互相呼叫的過程。如下demo,demo的主要實現過程如下:通過載入本地的html檔案(裡面有js指令碼),實現and

    Android Studio Unity3d互動。歸納版。

    本來想自己整理下,發現有人整理了,直接搬運過來了。備忘。 原址:http://blog.csdn.net/u014230923/article/details/51363556 這次部落格講解 Android Studio 怎麼匯出專案到 Unity。  在這

    Unity3DAndroid(eclipse和AndroidStudio)互動問題

    1. Android包名與unity的Android平臺簽名一致 2. 如果開發AndroidSDK Android支援版本和unity支援最低版本一致 3. 5.x 搜尋Classes.jar (找到unity安裝路徑 搜尋) Unity\Editor\Data\PlaybackEngines\Androi

    AndroidJS之間的互相呼叫互動(一)

    Android裝置多解析度的問題Android瀏覽器預設預覽模式瀏覽 會縮小頁面 WebView中則會以原始大小顯示Android瀏覽器和WebView預設為mdpi。hdpi相當於mdpi的1.5倍 ldpi相當於0.75倍三種解決方式:1 viewport屬性 2 CS

    Android Html互動_二_ JSApp互相呼叫

    Android Html互動<二> JS與App互相呼叫 @(Android系統原始碼解析)[Android, html] 宣告:轉載請註明出處,知識有限,如有錯誤,請多多交流指正! 場景:html網頁中JS與App相互呼叫,相互傳輸資料

    androidh5的互相互動傳參

    最近幾年隨著h5的強勢崛起,越來越多的公司運用h5開發或者採用h5與android的混合開發,前端時間公司就碰到了一個h5就和android互動的專案,本人也是在摸索中一次次改進,廢話不說了直接上程式碼: 1.建議使用new Webview構建webview物件而不是直接