Unity调用Android。。。哈哈。。可以干坏事啦。。。。。。

来源:互联网 发布:巧克力品牌排行榜知乎 编辑:程序博客网 时间:2024/04/29 14:37

 

羽化的文章啊。。。。好文章要分享。。。嘻嘻嘻。。。。。。

原址:http://blog.csdn.net/libeifs/article/details/6791346

 

 

开发环境

Window7

Unity3D  3.4

MB525defy   Android 2.2.1

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


         羽化的第十一篇博客。最近在玩《北欧女神:负罪者》,3A做的游戏都很有诚意,游戏秉承了系列优良传统,而且做成了SRPG也不觉得不适应,游戏难度中上,剧情也不错,在羽化看来《北欧女神》是个十分经典的系列,在RPG中算是个另类作品,准确来说应该是独树一帜。能力在逐渐提高,而工资却越拿越少,羽化面包和泡面的日子不知道还能坚持多久,面对这个忧郁的现实,如何改变,羽化现在就跟威尔弗雷德一个心情,一直坚持自己最初的理由还是放下包袱开始新的生活?因为。。。于是羽化做了个决定~ ~ Brand New World

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

 

本次学习:

1.      Android类打jar包

2.      Unity如何调用Android

3.      功能分析

 

1.   Android类打jar包

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

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

CompassActivity.java

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


 

       好了,这个类放在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

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


 

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

CompassJNI.cs

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


 

在运行的时候一定要记住把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