Dear All:
Hello~如果有Xperia Play且常玩遊戲的朋友因該都有發現,目前支援Xperia Game pad的遊戲其實也滿多的,其中UNITY的作品也不少,最近一款讓我比較喜歡的就是“Muffin Knight”,開發商Angry Mob Games在更之前的一款作品“Guerrilla Bob”,早在2011年初就支援了Xperia Play的Game pad。
當時天真的以為UNITY因該直接呼叫Input.GetKey (KeyCode.UpArrow)之類的function就可以解決,並且有提共一個Event讓你去聽,“使用者”目前是否已經打開的Xperia Play的Game Pad,沒甚麼大不了。可惜事情往往被想簡單了,最近碰了才知道,原來UNITY的Script API本身並沒有完整支援Xperia Play的Game Pad,開發者需要透過UNITY提共的JAVA函數庫來啟動這項功能。
很困難嗎?沒有啦~,你只需要先透過UNITY提共的AndroridJavaObject去實體化JAVA函數庫的類別,之後在透過function去check手機目前的狀態,來判斷操作的模式,如下所示:
protected void Awake () { InitAndroidConfigLink(); } private AndroidJavaObject _m_currentConfig = null; private void InitAndroidConfigLink() { using( AndroidJavaClass player = new AndroidJavaClass("com.unity3d.player.UnityPlayer") ) { AndroidJavaObject activity = player.GetStatic ("currentActivity"); _m_currentConfig = activity.Call ("getResources").Call ("getConfiguration"); } }
一切的重點就在你取得_m_currentConfig 的設定,有了這個設定後你就可以自行Check手機的Game Pad是否已經開啟。這部分你可以每個Update檢查或隔幾秒檢察,使用者是否開啟或關閉Game Pad,不過更好的做法我想因該是Coroutine,自動動又方便。來看以下程式碼:
protected void Start () { StartCoroutine( CheckForVirtualGamePadStatus() ); } private IEnumerator CheckForVirtualGamePadStatus() { const int NAVIGATIONHIDDEN_UNDEFINED = 0; //const int NAVIGATIONHIDDEN_NO = 1; const int NAVIGATIONHIDDEN_YES = 2; int nav; while(true) { nav = _m_currentConfig.Get ("navigationHidden"); if( nav == NAVIGATIONHIDDEN_YES || nav == NAVIGATIONHIDDEN_UNDEFINED ) { if( _m_VirtualGamePad == true ) { _m_VirtualGamePad = false; } } else { if( _m_VirtualGamePad == false ) { _m_VirtualGamePad = true; } } yield return new WaitForSeconds(2.0f); } } protected void Update () { if( _m_VirtualGamePad ) { //Do something for Xperia Gamepad... } else { //Do others... } }
接著剩下的就是Key Codes的對應啦!如下表:
Input.GetKey (KeyCode.LeftShift) = Left shoulder Input.GetKey (KeyCode.RightShift) = Right shoulder Input.GetKey (KeyCode.UpArrow) = Up Input.GetKey (KeyCode.LeftArrow) = Left Input.GetKey (KeyCode.RightArrow) = Right Input.GetKey (KeyCode.DownArrow) = Down Input.GetKey ("joystick button 2") = /\ Input.GetKey ("joystick button 1") = [] Input.GetKey ("joystick button 3") = O Input.GetKey ("joystick button 0") = X Input.GetKey (KeyCode.Pause) = SELECT Input.GetKey (KeyCode.Return) = START Input.GetKey(KeyCode.Menu) = Android Menu Input.GetKey(KeyCode.Escape) = Android Back AndroidInput = TouchPad
以上就是UNITY如何支援Xperia Play的Game Pad說明,希望對大家有幫助摟!!原整Script如下: XperiaPlayGamePad.cs
你好,我最近也建了一個有關遊戲程式的網誌,請問可以連結到你的網誌嗎?
回覆刪除OK!當然可以,你也是用UNITY嗎?如果是的話,我跟朋友有成立一個UnityIn的共筆部落,專門技路開發上的問題。
刪除網址是:
http://www.unityin.com/
我用的是Unreal Engine 3,網址是http://unrealrecord.blogspot.com。
回覆刪除Unity在移動平台上很紅,我也有興趣。
這是我的FB,交個朋友吧!
刪除http://facebook.com/EricLinFacebokk