unity与android交互

转自:http://blog.csdn.net/itolfn/article/details/38293627?utm_source=tuicool&utm_medium=referral

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

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

unity测试代码,

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Test : MonoBehaviour {  
  5.     bool isSend = false;  
  6.     // Use this for initialization  
  7.     void Start () {  
  8.       
  9.     }  
  10.       
  11.     // Update is called once per frame  
  12.     void Update () {  
  13.       
  14.     }  
  15.     void OnGUI()  
  16.     {  
  17.         if(GUI.Button(new Rect(0,0,200,200),"one"))  
  18.         {  
  19.             using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))  
  20.             {  
  21.                 using(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))  
  22.                 {  
  23.                     AndroidJavaClass cls = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");     
  24.                       
  25.                     //cls.CallStatic("_hideView", "one");     
  26.                     jo.Call("_hideView","two");  
  27.                 }  
  28.             }  
  29.           
  30.           
  31.         }  
  32.         if(GUI.Button(new Rect(0,200,200,200),"two"))  
  33.         {  
  34.             using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))  
  35.             {  
  36.                 using(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))  
  37.                 {  
  38.                     AndroidJavaClass cls = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");     
  39.                       
  40.                     //cls.CallStatic("_Display", "one");     
  41.                     jo.Call("_Display","two");  
  42.                 }  
  43.             }  
  44.               
  45.               
  46.         }  
  47.         if(isSend)  
  48.         {  
  49.             GUI.Button(new Rect(200,0,200,200),"testbtn");  
  50.         }  
  51.     }  
  52.     void AndroidSendMessage(string name)  
  53.     {  
  54.         isSend = !isSend;  
  55.     }  
  56. }  

注解: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里了。

  1. package com.dilitechcompany.demotest;  
  2.   
  3. import com.unity3d.player.UnityPlayer;  
  4. import android.app.NativeActivity;  
  5. import android.content.res.Configuration;  
  6. import android.graphics.PixelFormat;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.view.KeyEvent;  
  10. import android.view.View;  
  11. import android.view.Window;  
  12. import android.view.WindowManager;  
  13.   
  14. public class UnityPlayerNativeActivity extends NativeActivity  
  15. {  
  16.     protected UnityPlayer mUnityPlayer;     // don't change the name of this variable; referenced from native code  
  17.   
  18.     // UnityPlayer.init() should be called before attaching the view to a layout - it will load the native code.  
  19.     // UnityPlayer.quit() should be the last thing called - it will unload the native code.  
  20.     protected void onCreate (Bundle savedInstanceState)  
  21.     {  
  22.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  23.         super.onCreate(savedInstanceState);  
  24.           
  25.         getWindow().takeSurface(null);  
  26.         setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);  
  27.         getWindow().setFormat(PixelFormat.RGB_565);  
  28.   
  29.         mUnityPlayer = new UnityPlayer(this);  
  30.         if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar"true))  
  31.             getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  32.                                    WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  33.   
  34.         int glesMode = mUnityPlayer.getSettings().getInt("gles_mode"1);  
  35.         boolean trueColor8888 = false;  
  36.         mUnityPlayer.init(glesMode, trueColor8888);  
  37.   
  38.         View playerView = mUnityPlayer.getView();  
  39.         setContentView(playerView);  
  40.         playerView.requestFocus();        
  41. //      View rootView=mUnityPlayer.getView();  
  42. //        
  43. //      Toast.makeText(this, "class:"+rootView.getClass().getName(), Toast.LENGTH_LONG).show();  
  44. //        
  45.     }  
  46.       
  47.     public  void _hideView(String name) {  
  48.         UnityPlayer.UnitySendMessage("Main Camera""AndroidSendMessage""");  
  49.         Log.v("unity3d""hide view");  
  50.     }  
  51.     public  void _Display(String name) {  
  52.         UnityPlayer.UnitySendMessage("Main Camera""AndroidSendMessage""");  
  53.         Log.v("unity3d""display");  
  54.     }  
  55.     protected void onDestroy ()  
  56.     {  
  57.         mUnityPlayer.quit();  
  58.         super.onDestroy();  
  59.     }  
  60.   
  61.     // onPause()/onResume() must be sent to UnityPlayer to enable pause and resource recreation on resume.  
  62.     protected void onPause()  
  63.     {  
  64.         super.onPause();  
  65.         mUnityPlayer.pause();  
  66.     }  
  67.     protected void onResume()  
  68.     {  
  69.         super.onResume();  
  70.         mUnityPlayer.resume();  
  71.     }  
  72.     public void onConfigurationChanged(Configuration newConfig)  
  73.     {  
  74.         super.onConfigurationChanged(newConfig);  
  75.         mUnityPlayer.configurationChanged(newConfig);  
  76.     }  
  77.     public void onWindowFocusChanged(boolean hasFocus)  
  78.     {  
  79.         super.onWindowFocusChanged(hasFocus);  
  80.         mUnityPlayer.windowFocusChanged(hasFocus);  
  81.     }  
  82.     public boolean dispatchKeyEvent(KeyEvent event)  
  83.     {  
  84.         if (event.getAction() == KeyEvent.ACTION_MULTIPLE)  
  85.             return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);  
  86.         return super.dispatchKeyEvent(event);  
  87.     }  
  88.       
  89. }  

最后java代码附上,这也是个3dview视图,操作方便,二次开发使用,大家可以看log信息,也可以反调unity看交互验证结果。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AndroidUnity之间的交互可以实现在Unity运行时,调用Android原生代码来实现一些功能。在Android端可以使用 Android Java API 调用 Unity 的代码。而在Unity端,可以使用 C# 代码来调用 Android 的 Java API。这种双向调用可以实现一些比较复杂的跨平台应用,例如在Unity中展示Android硬件设备的信息或者调用相机、传感器等硬件设备来实现某些功能。 例如,在Android端上获取某个传感器的数据,然后传到Unity中,就可以借助Java Native Interface(JNI)来实现。具体实现方式如下: 1. Android端: * 创建一个Native方法,在其中读取传感器数据; * 创建一个Java类,将该Native方法和Unity相关的方法绑定; * 在Unity中调用Java类中的方法,以获取传感器数据。 2. Unity端: * 在C#代码中,调用Android的Java API,以实现数据传输; * 实现Unity的渲染逻辑,以展示从Android端传输过来的数据。 需要注意的是,为了确保代码的正确性和稳定性,一定要在调用之前做好详细的测试工作。 ### 回答2: AndroidUnity是两个流行的软件开发平台,它们都具有广泛的应用。将它们结合起来,可以为应用开发者带来无限的可能性。 在androidunity交互过程中,最主要的问题是如何将android中的数据传递到unity中。这主要分为两种情况:一种是在Unity中使用安卓API(Java代码),另一种是安卓使用Unity中的可编程元素(C#代码)。 在第一种情况下,可以使用Unity的Java接口来实现,编写类似于以下的Java代码: ``` UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", "Message"); ``` 其中,UnitySendMessage方法将消息发送给Unity中的一个GameObject,它接受两个参数,分别是接受消息的对象名和它上面的方法名。 在第二种情况下,可以使用Unity的C#接口来实现。我们可以使用Unity中的SendMessage或BroadcastMessage方法来向Unity对象发送消息(这些对象必须具有MonoBehaviour脚本,否则将不会工作)。 在Android中使用Unity对象也同样简单。我们需要做的就是在Android项目中添加UnityPlayerActivity类,在此类中使用UnityPlayer类的相关方法调用Unity导出的API。 综上所述,将安卓与Unity结合起来,可以极大地扩展应用的功能性,并为用户提供更好的体验。通过上述方法可以轻松实现androidunity交互。 ### 回答3: AndroidUnity交互是现在游戏开发中非常常见的一种技术,Android作为手机操作系统的代表,提供了丰富多彩的开发接口,而Unity作为一款游戏引擎,具有着强大的游戏制作功能。两者合作可以大大提高游戏的交互性和玩法。下面我们来分别了解一下AndroidUnity之间的交互方式。 首先是从AndroidUnity交互。由于Android系统是Java语言开发的,而Unity则是C#开发的,所以两者之间实现交互还需要一些中间的桥梁。目前比较常用的方式是通过JNI接口,将Java层面的信息传递到C#层面的Unity中。在Java中,你需要先获取UnityPlayer的实例,然后就可以通过UnityPlayer的方法来调用C#端的函数。具体流程如下: 1. 在Unity中编写对应的C#函数,该函数必须使用静态修饰符(static)。例如: public static void UnityMethod(string str){ Debug.Log("接收到的数据为:" + str); } 2. 在Java中,使用JNI接口调用C#函数。例如: // 获取UnityPlayer实例 UnityPlayer player = new UnityPlayer(); // 调用C#函数 player.UnitySendMessage("GameObject名字", "函数名字", "传递的参数"); UnitySendMessage方法中,第一个参数表示的是GameObject的名字,第二个参数表示的是C#函数的名字,第三个参数就是传递的参数。 其次是从UnityAndroid交互。在Unity中,通过AndroidJavaClass和AndroidJavaObject等API,可以实现调用Java层面的方法。具体流程如下: 1. 在Java中,编写需要调用的方法,这里的方法必须是public静态的。例如: public static void showAndroidToast(String msg){ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } 2. 在Unity中,使用AndroidJavaClass和AndroidJavaObject等API来调用Java方法。例如: // 设置Context AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); // 调用Java方法 AndroidJavaClass cls = new AndroidJavaClass("com.example.androidTest.MainActivity"); cls.CallStatic("showAndroidToast", currentActivity, "传递的参数"); CallStatic方法中,第一个参数表示要调用的Java层面类的名称,第二个参数表示要调用的Java方法名称,接下来的参数就是要传递的参数。 综上所述,通过JNI和AndroidJavaClass等API,AndroidUnity之间可以很方便地进行交互,相互传递数据和调用各自的方法。这样就能够更好地完成游戏逻辑和UI界面的制作。同时,这种交互方式也为跨平台的开发提供了很好的经验和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值