unity与android交互

来源:互联网 发布:与淘宝打假师聊天方案 编辑:程序博客网 时间:2024/04/30 22:36

网上大多数都是把android的工程放到unity里来打包成.apk。但是我感觉那样不好,因为我延用了ios的思想,unity和ios交互是使用unity导出xcode工程进行二次开发,其实unity也可以导出eclipse进行二次开发,我用的版本是unity4.3,我记得之前我用4.0导出eclipse工程会生成三个.java脚本,现在只生成一个,UnityPlayerNativeActivity,不过这个类往上继承两层也是UnityPlayerActivity,都一样一样的,只能说4.3更简化了unity和android的交互,

我做了个测试完全无压力交互。

unity测试代码,

using UnityEngine;using System.Collections;public class Test : MonoBehaviour {bool isSend = false;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}void OnGUI(){if(GUI.Button(new Rect(0,0,200,200),"one")){using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")){AndroidJavaClass cls = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");   //cls.CallStatic("_hideView", "one");   jo.Call("_hideView","two");}}}if(GUI.Button(new Rect(0,200,200,200),"two")){using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")){AndroidJavaClass cls = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");   //cls.CallStatic("_Display", "one");   jo.Call("_Display","two");}}}if(isSend){GUI.Button(new Rect(200,0,200,200),"testbtn");}}void AndroidSendMessage(string name){isSend = !isSend;}}

注解:unity为我们提供了调用android特定的类,AndroidJavaClass、AndroidJavaObject,这个不懂的可以查文档,网上解释一大堆,不过com.unity3d.player.UnityPlayer这个我解释一下,这个写法是一种固定写法,会android一般可以理解,就是去根据这个包路径去找到这个UnityPlayer,currentActivity这个有歧义不是当前activity而是主activity,这个不知道的可以去AndroidManifest.xml去看主activity,

这是一种固定写法,参数是写死的

另外可以使用AndroidJavaClass cls_CompassActivity = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");  

就是你导出的android工程包名+主activity,其实道理一样的也可以调用成功,

这样交互的代码只能写在主activity里了。

package com.dilitechcompany.demotest;import com.unity3d.player.UnityPlayer;import android.app.NativeActivity;import android.content.res.Configuration;import android.graphics.PixelFormat;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.view.Window;import android.view.WindowManager;public class UnityPlayerNativeActivity extends NativeActivity{protected UnityPlayer mUnityPlayer;// don't change the name of this variable; referenced from native code// UnityPlayer.init() should be called before attaching the view to a layout - it will load the native code.// UnityPlayer.quit() should be the last thing called - it will unload the native code.protected void onCreate (Bundle savedInstanceState){requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);getWindow().takeSurface(null);setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);getWindow().setFormat(PixelFormat.RGB_565);mUnityPlayer = new UnityPlayer(this);if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,                       WindowManager.LayoutParams.FLAG_FULLSCREEN);int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);boolean trueColor8888 = false;mUnityPlayer.init(glesMode, trueColor8888);View playerView = mUnityPlayer.getView();setContentView(playerView);playerView.requestFocus();//View rootView=mUnityPlayer.getView();////Toast.makeText(this, "class:"+rootView.getClass().getName(), Toast.LENGTH_LONG).show();//}public  void _hideView(String name) {UnityPlayer.UnitySendMessage("Main Camera", "AndroidSendMessage", "");Log.v("unity3d", "hide view");}public  void _Display(String name) {UnityPlayer.UnitySendMessage("Main Camera", "AndroidSendMessage", "");Log.v("unity3d", "display");}protected void onDestroy (){mUnityPlayer.quit();super.onDestroy();}// onPause()/onResume() must be sent to UnityPlayer to enable pause and resource recreation on resume.protected void onPause(){super.onPause();mUnityPlayer.pause();}protected void onResume(){super.onResume();mUnityPlayer.resume();}public void onConfigurationChanged(Configuration newConfig){super.onConfigurationChanged(newConfig);mUnityPlayer.configurationChanged(newConfig);}public void onWindowFocusChanged(boolean hasFocus){super.onWindowFocusChanged(hasFocus);mUnityPlayer.windowFocusChanged(hasFocus);}public boolean dispatchKeyEvent(KeyEvent event){if (event.getAction() == KeyEvent.ACTION_MULTIPLE)return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);return super.dispatchKeyEvent(event);}}

最后java代码附上,这也是个3dview视图,操作方便,二次开发使用,大家可以看log信息,也可以反调unity看交互验证结果。


1 2
原创粉丝点击