[UnityIN] SONY Xperia Game Pad + UNITY3D

Dear All: ( 文章轉載自UnityIN )
Hello~如果有Xperia Play且常玩遊戲的朋友因該都有發現,目前支援Xperia Game pad的遊戲其實也滿多的,其中UNITY的作品也不少,最近一款讓我比較喜歡的就是“”,開發商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

UnityIN 作者:Bric Lin, 
Email: ericlin09@gmail.com
曾任職台灣某遊戲公司研發Game Engine,專攻Rendering技術與遊戲開發,目前為獨立開發團隊CocosPlay主程式

Tags:


Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *