查看: 5639|回复: 3
打印 上一主题 下一主题

[经验分享] Unity调用Android

[复制链接]
.    

3797

主题

11

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
32328
精华
41

活跃会员 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2013-1-16 20:35:52 |只看该作者 |倒序浏览
开发环境
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
◦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;

◦}

◦}



好了,这个类放在src文件夹里面,现在是四个层级关系,右击UnityAndroid选中Show in Explorer,这样就会来到这个文件夹下,下面打开cmd命令控制台,cd到我们这个文件夹下,分别输入这三条语句:
1.> javac CompassActivity.java -classpath D:UnityEditorDataPlaybackEnginesandroidplayerinclasses.jar -bootclasspath D:android-sdk-windowsplatformsandroid-8android.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
◦<?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>


万事具备,现在写个C#来调用这个类了,这个就放在根目录下。
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");

◦        }

◦    }

◦}



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


【来源:互联网】

更多精彩教程,尽在web3D纳金网http://www.narkii.com/college/
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏1 支持支持0 反对反对0
回复

使用道具 举报

0

主题

1

听众

126

积分

设计实习生

Rank: 2

纳金币
298
精华
0

最佳新人

沙发
发表于 2013-11-19 23:43:10 |只看该作者
Thanks for sharing thank you so much thank you very much!
回复

使用道具 举报

0

主题

3

听众

2200

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2013-11-19 23:53:08 |只看该作者
谢谢楼主分享
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2013-11-20 00:33:28 |只看该作者
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-23 09:44 , Processed in 0.121364 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部