一 原因
以為某些原因,需要重寫Unity游戲中Android的軟鍵盤的樣式,然而unity對android和ios的ios的軟鍵盤都有封裝,在Unity中TouchScreenKeyboard.Open可以打開一個軟鍵盤,然而對這個軟鍵盤的操作函數少的可憐,所以有了這篇文章.
二 目的
本文的主要目的是重寫NGUI的UIInput,也就是TouchScreenKeyboard.Open函數,調用自己寫的Android原生的鍵盤
三 准備
需要Android的環境 jdk sdk 還有eclise,不會安裝的請百度自行安裝,unity 和 ngui插件
四 實現原理
首先需要建立一個Android的工程,里面內容很簡單,只要一個Activity和一個EditText,並且當打開這個工程Activity的時候,自動彈出一個軟鍵盤,這很容易實現,當unity中有需要打開軟鍵盤的時候,unity跳轉到這個Activity,按下軟鍵盤的完成鍵把數據傳回到Unity.
五 Android庫的實現
public class SDKActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { Resources resources = this.getResources();//加載res資源 String packageName = this.getPackageName();//包名 int id = resources.getIdentifier("activity_sdk", "layout", packageName);//獲取Activity的layout super.onCreate(savedInstanceState); setContentView(id); //設置Activity中的EditText,為了打開軟鍵盤 final EditText textArea = (EditText)findViewById(resources.getIdentifier("textArea", "id", packageName)); textArea.setText(""); textArea.setBackgroundColor(0x00000000); textArea.setTextColor(0x00000000); textArea.setFocusableInTouchMode(true); textArea.requestFocus(); textArea.setCursorVisible(true); TextWatcher textWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }; textArea.addTextChangedListener(textWatcher); //點擊了軟鍵盤的完成 textArea.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView arg0, int arg1,KeyEvent arg2) { Log.e("點擊", "完成"); SendData(0,arg0.getText().toString()); finish(); return true; } }); } // 向unity返回數據 void SendData(int code, String info) { UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info); } }
代碼很簡單,就是在OnCreate中設置一下EditText的屬性,在點擊的軟鍵盤的完成鍵后SendData向Unity返回數據
還需要一個類用來供Unity調用,用來打開這個Activity,也就是打開這個軟鍵盤
public class AndroidKeyboard { Activity context = null; InputMethodManager inputMethodManager = null; TextWatcher textWatcher = null; boolean mode = false; public AndroidKeyboard() { context = UnityPlayer.currentActivity; inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); } //打開Activiy,並且顯示輸入法 public void Open(final String text,final boolean mode) { if(context == null) { Log.e("unity", "context null when open keyboard"); return ; } context.runOnUiThread(new Runnable() { @Override public void run() { Log.e("unity", "1111111111111"); Intent intent = new Intent(); intent.setClassName(context, "com.android.keyboardsdk.SDKActivity"); context.startActivity(intent); } }); } }
代碼沒什么好說的,就是Unity調用Open函數的時候打開這個Activity,並且顯示軟鍵盤
六 unity資源設置和AndroidManifest.xml設置
主要是設置上面的Activity的layout和軟鍵盤的屬性
附上Acitvity的xml,里面就放了一個EditText
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_vertical|center_horizontal" > <EditText android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:inputType="textNoSuggestions|textMultiLine" android:ems="10" android:imeOptions="actionDone" android:id="@+id/textArea" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" android:textSize="0.01dp" android:gravity="top" /> </RelativeLayout>
然后需要在Unity的AndroidManifest.xml中設置
<activity android:configChanges="keyboard|keyboardHidden|orientation" android:screenOrientation="landscape" android:windowSoftInputMode="adjustResize|stateVisible" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" android:name="com.android.keyboardsdk.SDKActivity"> </activity>
主要是注冊一下上面創建的Activity,不然在unity調用后打不開
七 unity中調用這個庫,並打開軟鍵盤
把上面創建的lib導出后放到unity中就可以提供給unity使用了
AndroidJavaObject _input= new AndroidJavaObject("com.android.keyboardsdk.AndroidKeyboard");
_input.Call("Open", text, multiLines);
這兩行代碼很好理解,就是new了一個AndroidKeyboard類的實例(上面你自己創建的),並且調用了Open函數
最后還要接收一下Android軟鍵盤傳回來的消息,就是SendData函數傳遞回來的
UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info);
需要在unity創建一個名字為Plugins的GameObject,然后掛上一個腳本,實現函數OnCustomInputAction即可
void OnCustomInputAction(string data)
{
//data就是軟鍵盤傳回來的數據
}
八 替換掉NGUI UIInput的TouchScreenKeyboard.Open,並實現相關的邏輯,因為ngui版本不同,我就不多廢話