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

原址: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 plain copy print ?
  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. }  
package com.LB.UnityAndroid1;import com.unity3d.player.UnityPlayerActivity;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.util.Config;import android.util.Log;import android.app.Activity;import android.view.WindowManager;public class CompassActivity extends UnityPlayerActivity {private static final String TAG = "Compass";private SensorManager mSensorManager;private Sensor mSensor;static public float xmag;static public float x;static public float ymag;static public float zmag;private final SensorEventListener mListener = new SensorEventListener() {public void onSensorChanged(SensorEvent event) {if (Config.DEBUG) Log.d(TAG,"sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")");xmag = event.values[0];ymag = event.values[1];zmag = event.values[2];}public void onAccuracyChanged(Sensor sensor, int accuracy) {}};@Overrideprotected void onCreate(Bundle icicle) {super.onCreate(icicle);getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}@Overrideprotected void onResume(){if (Config.DEBUG) Log.d(TAG, "onResume");super.onResume();mSensorManager.registerListener(mListener, mSensor,SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onStop(){if (Config.DEBUG) Log.d(TAG, "onStop");mSensorManager.unregisterListener(mListener);super.onStop();}public static float getX() {//return xmag;x+=10.0;return x;}public static float getY() {return ymag;}public static float getZ() {return zmag;}}


 

       好了,这个类放在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 plain copy print ?
  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>  
<?xml version="1.0" encoding="utf-8"?>                                                                                            


 

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

CompassJNI.cs

[csharp] view plain copy print ?
  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("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. }  
using UnityEngine; using System.Collections; using System;  public class CompassJNI : MonoBehaviour  { static float xValue; static floatyValue; static floatzValue;  // Use this for initialization void Start ()  { AndroidJNI.AttachCurrentThread(); }  void Update() { if(Input.GetKey(KeyCode.Escape)) { Application.Quit(); } using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))  {  using (AndroidJavaObject obj_Activity = cls_UnityPlayer.GetStatic("currentActivity")) {  AndroidJavaClass cls_CompassActivity = new AndroidJavaClass("com.LB.UnityAndroid1.CompassActivity");  cls_CompassActivity.CallStatic("Init", obj_Activity);  xValue = cls_CompassActivity.CallStatic("getX"); yValue = cls_CompassActivity.CallStatic("getY"); zValue = cls_CompassActivity.CallStatic("getZ");  } } }  void OnGUI()  { GUI.Label(new Rect(Screen.width / 2 -200, Screen.height / 2, 400,100), "xmag = " + xValue.ToString() + " ymag = " + yValue.ToString() + " zmag = " + zValue.ToString()); if(GUI.Button(new Rect(Screen.width-120,Screen.height-40,120,30),"Click to YUHUA!"))  { Application.OpenURL("http://blog.csdn.net/libeifs"); } } }


 

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

 

更多相关文章

  1. 【Android(安卓)Developers Training】 16. 暂停和恢复一个Activ
  2. android APK 调用G—sensor驱动的过程
  3. 禁止其他应用访问自己的组件
  4. Android百度地图坑之Error inflating class com.baidu.mapapi.ma
  5. Android日常开发(18)android 调用 vue methods 方法,提示"Uncaught
  6. android反编译工具Apktool安装与使用
  7. Android四大组件基本介绍及其生命周期
  8. Android系统文件夹结构的说明
  9. android suspend and resume

随机推荐

  1. android有用代码片段(一)
  2. Android_MediaPlayer:java.io.IOException
  3. Android(安卓)四种加载方式详解(standard
  4. Android(安卓)Studio 找不到R文件解决方
  5. Android(安卓)cupcake源代码获取和编译 f
  6. Android(安卓)OpenGL 学习笔记 --开始篇
  7. Android调用微信登陆、分享、支付(第二版
  8. android 的skia 图形引擎库
  9. 微信公众号 修改 应用签名 不生效
  10. Android两种不同的方法去实现图像的放大