2012年1月11日 星期三

UNITY + Xperia Game pad



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

4 則留言:

  1. 你好,我最近也建了一個有關遊戲程式的網誌,請問可以連結到你的網誌嗎?

    回覆刪除
    回覆
    1. OK!當然可以,你也是用UNITY嗎?如果是的話,我跟朋友有成立一個UnityIn的共筆部落,專門技路開發上的問題。

      網址是:
      http://www.unityin.com/

      刪除
  2. 我用的是Unreal Engine 3,網址是http://unrealrecord.blogspot.com

    Unity在移動平台上很紅,我也有興趣。

    回覆刪除
    回覆
    1. 這是我的FB,交個朋友吧!
      http://facebook.com/EricLinFacebokk

      刪除

LinkWithin

Related Posts Plugin for WordPress, Blogger...