開(kāi)發(fā)環(huán)境
Window7
Unity3D 3.4
MB525defy Android 2.2.1
jdk1.6.0 (7版本貌似不行)
這次說(shuō)一個(gè)比較有趣的內(nèi)容,Android類在Unity上如何調(diào)用的方法,感謝★幻想の貓⌒的分享,話說(shuō)方法來(lái)自網(wǎng)上,羽化只是小做修改,在此感慨國(guó)外牛人多,下面開(kāi)始吧- -
本次學(xué)習(xí):
1. Android類打jar包
2. Unity如何調(diào)用Android
3. 功能分析
1. Android類打jar包
羽化在這還是用網(wǎng)上的那個(gè)例子,用Android類得到Sensor的三個(gè)值,這里把過(guò)程簡(jiǎn)化,畢竟這些都是Android的基礎(chǔ)。
首先打開(kāi)Unity,在Project下創(chuàng)建Plugins文件夾,然后在該文件夾下創(chuàng)建一個(gè)名為Android的子文件夾,再在Android文件夾下創(chuàng)建src文件夾,創(chuàng)建這三個(gè)層級(jí)的文件夾后我們開(kāi)始寫Android類,下面有些部分是需要自己修改的,羽化用自己的習(xí)慣修改了。
CompassActivity.java
- 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;
- }
- }
好了,這個(gè)類放在src文件夾里面,現(xiàn)在是四個(gè)層級(jí)關(guān)系,右擊UnityAndroid選中Show in Explorer,這樣就會(huì)來(lái)到這個(gè)文件夾下,下面打開(kāi)cmd命令控制臺(tái),cd到我們這個(gè)文件夾下,分別輸入這三條語(yǔ)句:
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的環(huán)境變量和要有android 2.2的API。這樣,在Unity里面會(huì)發(fā)現(xiàn)多出來(lái)一個(gè)com的文件夾和Android的jar包,我們打jar包就這樣打好了。
2. Unity如何調(diào)用Android
這里我們還需要新建AndroidMainfest.xml在Android文件夾下,這里要新建個(gè)res文件夾,因?yàn)橛鸹@有用到里面的資源。于是放好后結(jié)構(gòu)就很像Android的項(xiàng)目了。
AndroidMainfest.xml
- <?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>
萬(wàn)事具備,現(xiàn)在寫個(gè)C#來(lái)調(diào)用這個(gè)類了,這個(gè)就放在根目錄下。
CompassJNI.cs
- 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<AndroidJavaObject>("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");
- }
- }
- }
在運(yùn)行的時(shí)候一定要記住把Player Settings里面的Identification的Bundle Identifier改成自己的項(xiàng)目名,羽化這里是Com.LB.UnityAndroid1 。
3. 功能分析
這個(gè)例子是得到Android手機(jī)的Sensor,羽化這里讓X自增長(zhǎng)以示區(qū)別,細(xì)心的人會(huì)發(fā)現(xiàn)羽化這里加了些看似沒(méi)用的語(yǔ)句,比如這里有個(gè)阻止屏幕休眠的語(yǔ)句,這是羽化目前發(fā)現(xiàn)唯一的一個(gè)Unity做不到的功能,多虧了Michael的提醒,不然會(huì)成為一個(gè)盲點(diǎn)。其實(shí)這個(gè)項(xiàng)目里面很多東西可以刪掉,留下jar包和CompassJNI就夠了,大家可以試試,Unity載入jar包貌似是全部載入與名字沒(méi)有關(guān)系,話說(shuō)這個(gè)例子可以用來(lái)添加ADMob,公司里面明哥已經(jīng)實(shí)現(xiàn)出來(lái)了,羽化是不建議加這個(gè),因?yàn)楹軣┤?,原?lái)玩《割繩子》的時(shí)候深有體會(huì)=。= 這里加了羽化博客的廣告,大家不要罵。。。
老樣子項(xiàng)目地址送上:
http://download.csdn.net/detail/libeifs/3616911
原文鏈接:http://blog.csdn.net/libeifs/article/details/6791346