分享

Unity调用Android ? Unity3D频道

 3dC 2014-05-06

开发环境

Window7

Unity3D  3.4

MB525defy   Android 2.2.1

jdk1.6.0 (7版本貌似不行)

 

这次说一个比较有趣的内容,Android类在Unity上如何调用的方法,感谢★幻想の猫⌒的分享,话说方法来自网上,羽化只是小做修改,在此感慨国外牛人多,下面开始吧- -

 

本次学习:

1.      Android类打jar包

2.      Unity如何调用Android

3.      功能分析

 

1.   Android类打jar包

羽化在这还是用网上的那个例子,用Android类得到Sensor的三个值,这里把过程简化,毕竟这些都是Android的基础。

首先打开Unity,在Project下创建Plugins文件夹,然后在该文件夹下创建一个名为Android的子文件夹,再在Android文件夹下创建src文件夹,创建这三个层级的文件夹后我们开始写Android类,下面有些部分是需要自己修改的,羽化用自己的习惯修改了。

CompassActivity.java

  1. package com.LB.UnityAndroid1;
  2. import com.unity3d.player.UnityPlayerActivity;
  3. import android.content.Context;
  4. import android.hardware.Sensor;
  5. import android.hardware.SensorEvent;
  6. import android.hardware.SensorEventListener;
  7. import android.hardware.SensorManager;
  8. import android.os.Bundle;
  9. import android.util.Config;
  10. import android.util.Log;
  11. import android.app.Activity;
  12. import android.view.WindowManager;
  13. public class CompassActivity extends UnityPlayerActivity {
  14. private static final String TAG = "Compass";
  15. private SensorManager mSensorManager;
  16. private Sensor mSensor;
  17. static public float xmag;
  18. static public float x;
  19. static public float ymag;
  20. static public float zmag;
  21. private final SensorEventListener mListener = new SensorEventListener() {
  22. public void onSensorChanged(SensorEvent event) {
  23. if (Config.DEBUG) Log.d(TAG,
  24. "sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")");
  25. xmag = event.values[0];
  26. ymag = event.values[1];
  27. zmag = event.values[2];
  28. }
  29. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  30. }
  31. };
  32. @Override
  33. protected void onCreate(Bundle icicle) {
  34. super.onCreate(icicle);
  35. getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  36. mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
  37. mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
  38. }
  39. @Override
  40. protected void onResume()
  41. {
  42. if (Config.DEBUG) Log.d(TAG, "onResume");
  43. super.onResume();
  44. mSensorManager.registerListener(mListener, mSensor,
  45. SensorManager.SENSOR_DELAY_GAME);
  46. }
  47. @Override
  48. protected void onStop()
  49. {
  50. if (Config.DEBUG) Log.d(TAG, "onStop");
  51. mSensorManager.unregisterListener(mListener);
  52. super.onStop();
  53. }
  54. public static float getX() {
  55. //return xmag;
  56. x+=10.0;
  57. return x;
  58. }
  59. public static float getY() {
  60. return ymag;
  61. }
  62. public static float getZ() {
  63. return zmag;
  64. }
  65. }

 

 

好了,这个类放在src文件夹里面,现在是四个层级关系,右击UnityAndroid选中Show in Explorer,这样就会来到这个文件夹下,下面打开cmd命令控制台,cd到我们这个文件夹下,分别输入这三条语句:

1.> javac CompassActivity.java -classpath D:\Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar -bootclasspath D:\android-sdk-windows\platforms\android-8\android.jar -d .

2.> javap -s com.LB.UnityAndroid1.CompassActivity

3.> jar cvfM ../Compass.jar com/

注意这里需要配置好java的环境变量和要有android 2.2的API。这样,在Unity里面会发现多出来一个com的文件夹和Android的jar包,我们打jar包就这样打好了。

 

 

2.  Unity如何调用Android

这里我们还需要新建AndroidMainfest.xml在Android文件夹下,这里要新建个res文件夹,因为羽化这有用到里面的资源。于是放好后结构就很像Android的项目了。

AndroidMainfest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas./apk/res/android"
  3.       package="com.LB.UnityAndroid1"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">
  7.         <activity android:name=".CompassActivity"
  8.                   android:label="@string/app_name">
  9.             <intent-filter>
  10.                 <action android:name="android.intent.action.MAIN" />
  11.                 <category android:name="android.intent.category.LAUNCHER" />
  12.             </intent-filter>
  13.         </activity>
  14.     </application>
  15.     <uses-permission android:name="android.permission.WAKE_LOCK"/>
  16. </manifest>

 

万事具备,现在写个C#来调用这个类了,这个就放在根目录下。

CompassJNI.cs

  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. public class CompassJNI : MonoBehaviour
  5. {
  6.     static float    xValue;
  7.     static float    yValue;
  8.     static float    zValue;
  9.     // Use this for initialization
  10.     void Start ()
  11.     {
  12.         AndroidJNI.AttachCurrentThread();
  13.     }
  14.     void Update() {
  15.         if(Input.GetKey(KeyCode.Escape))
  16.         {
  17.             Application.Quit();
  18.         }
  19.         using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  20.         {
  21.             using (AndroidJavaObject obj_Activity = cls_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
  22.                 AndroidJavaClass cls_CompassActivity = new AndroidJavaClass("com.LB.UnityAndroid1.CompassActivity");
  23.                 cls_CompassActivity.CallStatic("Init", obj_Activity);
  24.                 xValue = cls_CompassActivity.CallStatic<float>("getX");
  25.                 yValue = cls_CompassActivity.CallStatic<float>("getY");
  26.                 zValue = cls_CompassActivity.CallStatic<float>("getZ");
  27.             }
  28.         }
  29.     }
  30.     void OnGUI()
  31.     {
  32.         GUI.Label(new Rect(Screen.width / 2 -200, Screen.height / 2, 400,100), "xmag = " + xValue.ToString() + " ymag = " + yValue.ToString() + " zmag = " + zValue.ToString());
  33.         if(GUI.Button(new Rect(Screen.width-120,Screen.height-40,120,30),"Click to YUHUA!"))
  34.         {
  35.             Application.OpenURL("http://blog.csdn.net/libeifs");
  36.         }
  37.     }
  38. }

 

 

在运行的时候一定要记住把Player Settings里面的Identification的Bundle Identifier改成自己的项目名,羽化这里是Com.LB.UnityAndroid1 。

 

3.   功能分析

这个例子是得到Android手机的Sensor,羽化这里让X自增长以示区别,细心的人会发现羽化这里加了些看似没用的语句,比如这里有个阻止屏幕休眠的语句,这是羽化目前发现唯一的一个Unity做不到的功能,多亏了Michael的提醒,不然会成为一个盲点。其实这个项目里面很多东西可以删掉,留下jar包和CompassJNI就够了,大家可以试试,Unity载入jar包貌似是全部载入与名字没有关系,话说这个例子可以用来添加ADMob,公司里面明哥已经实现出来了,羽化是不建议加这个,因为很烦人,原来玩《割绳子》的时候深有体会=。= 这里加了羽化博客的广告,大家不要骂。。。

老样子项目地址送上:

http://download.csdn.net/detail/libeifs/3616911

 

原文链接:http://blog.csdn.net/libeifs/article/details/6791346

声明: 本文由( liuxiaoni )原创编译,转载请保留链接: Unity调用Android

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多