Unity调用Android。。。哈哈。。可以干坏事啦。。。。。。
羽化的文章啊。。。。好文章要分享。。。嘻嘻嘻。。。。。。
原址: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 ?- 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) {
- }
- };
- @Override
- protected 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);
- }
- @Override
- protected void onResume()
- {
- if (Config.DEBUG) Log.d(TAG, "onResume");
- super.onResume();
- mSensorManager.registerListener(mListener, mSensor,
- SensorManager.SENSOR_DELAY_GAME);
- }
- @Override
- protected 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;
- }
- }
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 ?- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.LB.UnityAndroid1"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".CompassActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- intent-filter>
- activity>
- application>
- <uses-permission android:name="android.permission.WAKE_LOCK"/>
- manifest>
<?xml version="1.0" encoding="utf-8"?>
万事具备,现在写个C#来调用这个类了,这个就放在根目录下。
CompassJNI.cs
[csharp] view plain copy print ?- using UnityEngine;
- using System.Collections;
- using System;
- public class CompassJNI : MonoBehaviour
- {
- static float xValue;
- static float yValue;
- static float zValue;
- // 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<float>("getX");
- yValue = cls_CompassActivity.CallStatic<float>("getY");
- zValue = cls_CompassActivity.CallStatic<float>("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");
- }
- }
- }
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
更多相关文章
- 【Android(安卓)Developers Training】 16. 暂停和恢复一个Activ
- android APK 调用G—sensor驱动的过程
- 禁止其他应用访问自己的组件
- Android百度地图坑之Error inflating class com.baidu.mapapi.ma
- Android日常开发(18)android 调用 vue methods 方法,提示"Uncaught
- android反编译工具Apktool安装与使用
- Android四大组件基本介绍及其生命周期
- Android系统文件夹结构的说明
- android suspend and resume