本文为繁体,为了大家阅读方便转换为简体版本,原址如下:
http://otaru.tw/?p=5736
用 Unity 开发 Google Glass 应用简易基础教学
小樽拿到Google Glass已经超过一年,也做了些开发,也发现了许多问题,基本上可以理解为何Google原先定下2014要普及化的豪语至今悄悄的没有下文,不过分析留待有机会再说吧
小樽之前由于计划案的关系,设计过一款基于智能型眼镜的,以文化保存与发展为目标的游戏化 (Gamification) 的适地性服务 (LBS) APP,概念的简易原型影片如下:(这里用截 图表示,视频位置在 htt ps://www.youtube.com/watch?feature=player_embedded&v=ZYxs-PEqPjY)
当然由于时间和经费有限,在结案时并没有办法作到这么炫,但是基于这项设计所需要的一些基础技术,包含 Google Glass + iBeacon 实现室内定位与互动的技术,在小樽网罗的团队强大伙伴们共同努力下,事实际有被完成的唷,而且这个游戏的手机板原形也有真的作出来,虽然计划已经结束所以 已经没有额外的费用可以继续把原型更完整化,但是不用担心,小樽个人一定会想办法把最终版的程序开发完,希望研究成果能真的能造服环境。
好~ 碎碎念就到此,基于这个计划开发过程中,团队有研究是否能将Unity发布的Android apk移植给Glass用,如果可以将省去很多原型开发的力气-至少对于游戏画面如何Render和GUI的制作可以省去非常多力气,但是有 Glass 的人就已经很少了,更别提同时会制作Unity又有眼镜的团队,所以网络上当然找不到资料啦~官网也不会有囉,但是小樽运气很好,找到一位非常强大的台大 资工强者成鑫大大,他原本就会写glass的原生程序,有提供可能的一些线索,小樽就到Unity中找对应可能衔接作输入的指令,很幸运的在一个晚上找到 了可以让Glass触控版输入到Unity中的方法,并且也成功将发布的apk安装到Glass中测试无误,谦虚的成鑫大大觉得这没有甚么了不起大家都作 的到,但是对小樽来说已经太猛了~而基于我们都没有觉得需要藏私甚么-越多人会就有机会让更多人一起开发作出更多好东西,也有机会认识更多强者朋友,于是 由小樽汇整写出此篇教学,让之后有需要的朋友们可以参考
首先,Google Glass受限于输入的模式以语音和侧边触控板为主,官方语音系统目前只接受英文,并且有干扰各种问题,用侧面触控版控制是比较可行的方案,但是触控手势 的指令并不直接对应Android行动装置系统的确认/返回/前后滑及HOME,后来发现需要以比照触控面板的输入模式,自己判断手势滑动的”触控点数” 和”位移坐标”在Unity中写入上述事件,因此在本范例中,我们将glass触控版侦测到的触碰行为,以作标的形式透过GUI显示在画面中,首先我们打 开一个新的Unity项目,并在 摄影机上写入一个c#的Script内容如下,比较关键的地方小樽以经有写注解: - using UnityEngine;
- using System.Collections;
- public class NewBehaviourScript : MonoBehaviour {
- GUIStyle style;
- string text;
- // Use this for initialization
- void Start () {
- initialStyle();
- }
-
- // Update is called once per frame
- void Update () {
- if(AndroidInput.touchCountSecondary > 0){ //如果有偵測到觸控點
- text = "x:"+
- AndroidInput.GetSecondaryTouch(0).position.x+"\ny:"+ //顯示X作標
- AndroidInput.GetSecondaryTouch(0).position.y; //顯示Y作標
- }else{
- text = "no touch";
- }
- }
- void OnGUI(){
- GUI.Label(new Rect(0,0,Screen.width,Screen.height),text,style);
- }
- private void initialStyle(){
- style = new GUIStyle();
- style.fontSize = 60;
- style.normal.textColor = Color.white;
- style.alignment = TextAnchor.MiddleCenter;
- }
- }
复制代码其中侦测到处控点那边,意思是如果有一个或以上的手指触碰行为发生则执行显示作标的显示,因此如果想写多点处控行为可以自己改写,其他程序码小樽就不解释了,如果完全看不懂可以配合Help查阅喔 写完以后要进行发布,发布的时候有几个要注意的关键步骤,请来到Android发布设定作调整 首先因为Glass是横向的显示,预设的显示配置请选择横向 (如下),否则发布到Glass你会看到只有中间1/3的画面
其次关于app name的部份,Bundle Identifier请确认与你原本设定的company Name和Product Name有一致,虽然说有时候没有对应也没关系,但是建议还是一致比较保险,最下面的API最低版本请选Android 4.4 (因为对应当前Glass的Android版本)
由于我们要发布进Glass还需要透过Android的IDE作一些修正,所以请勾选发布成Google Android Project的形式,之后便会发布出一个项目资料夹
到上面为止是在Unity中要完成的步骤,接下来我们需要透过Android的编译器来修改apk的进入点来符合Glass的需求,关于安装 Android Studio或使用Eclipse+Android SDK的部份看个人喜好都可以,完全没有使用过的朋友可能要先去Google一下基本安装和环境设定,小樽这里就不赘述
小樽是透过Eclipse来完成后面动作,我们要从一个已经存在的Android项目来开启新项目如下
下一步以后选择我们刚刚从Unity发布出来的项目,另外请确认你的SDK里面已经有安装4.4.2的Glass Development Kit Preview 这项,如下图,否则你没办法发布程序到眼镜里喔
将从项目的属性设定中将Android library改为”Glass Development Kit Preview” 4.4.2
在项目的 AndroidManifest.xml 中,原始的code排版跟没排一样很难阅读,可以用快速键 ctrl+shift+f 自动整理,接下来步骤(或参阅文章最后的整篇原始码): 去掉android:debuggable=”false” 加入
(1) - <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT"/>
复制代码(2) - android:theme="@android:style/Theme.DeviceDefault"
复制代码(3) - <action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
复制代码(4) - <meta-data
- android:name="com.google.android.glass.VoiceTrigger"
- android:resource="@xml/voiceinput_trigger" />
复制代码完成上述步骤后,建立一个叫voiceinput_trigger的xml档,内容复制下方贴上 - <?xml version="1.0" encoding="utf-8"?>
- <trigger keyword="@string/voice_trigger">
-
- <!--other voice input -->
- <!--
- <input prompt="@string/gesturedemo_voice_prompt" />
- -->
- <!-- what a need in my app, if not access,it will disable this app -->
- <!--
- <constraints camera="true" network="true" microphone="true" />
- <constraints network="true" microphone="true" />
- -->
- </trigger>
复制代码将这个 voiceinput_trigger.xml 放入res/xml 里(如果没有这个资料夹自己建一个) 在res/values/strings.xml加入进入点,app name请填入你自己的app name - <string name="voice_trigger">app name</string>
复制代码完成后选择要发布的装置~请接上你的Glass,如果SDK有正确安装应该是会找到如下
按下确定~大功告成,程序就会Compiler到你的Glass中,可以用点选或语音(当然是英文)的方式启动你写好的APP囉,如果你使用本教学中的触控案例,你会看到当手碰到测版的时候画面显示作标的变化值,剩下的就交由各位自行发展啦~ - <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.Company.GoogleGlassInputSample"
- android:installLocation="preferExternal"
- android:theme="@android:style/Theme.NoTitleBar"
- android:versionCode="1"
- android:versionName="1.0" >
- <supports-screens
- android:anyDensity="true"
- android:largeScreens="true"
- android:normalScreens="true"
- android:smallScreens="true"
- android:xlargeScreens="true" />
- <application
- android:icon="@drawable/app_icon"
- android:label="@string/app_name" >
- <activity
- android:name="com.Company.GoogleGlassInputSample.UnityPlayerNativeActivity"
- android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale"
- android:label="@string/app_name"
- android:launchMode="singleTask"
- android:theme="@android:style/Theme.DeviceDefault"
- android:screenOrientation="landscape" >
- <intent-filter>
- <action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
- </intent-filter>
- <meta-data
- android:name="unityplayer.UnityActivity"
- android:value="true" />
- <meta-data
- android:name="unityplayer.ForwardNativeEventsToDalvik"
- android:value="false" />
-
- <meta-data
- android:name="com.google.android.glass.VoiceTrigger"
- android:resource="@xml/voiceinput_trigger" />
- </activity>
- </application>
- <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT"/>
- <uses-sdk
- android:minSdkVersion="19"
- android:targetSdkVersion="20" />
- <uses-feature android:glEsVersion="0x00020000" />
- </manifest>
复制代码 |