一 原因

以为某些原因,需要重写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库的实现

  1. public class SDKActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState)
  4. {
  5. Resources resources = this.getResources();//加载res资源
  6. String packageName = this.getPackageName();//包名
  7. int id = resources.getIdentifier("activity_sdk", "layout", packageName);//获取Activity的layout
  8. super.onCreate(savedInstanceState);
  9. setContentView(id);
  10. //设置Activity中的EditText,为了打开软键盘
  11. final EditText textArea = (EditText)findViewById(resources.getIdentifier("textArea", "id", packageName));
  12. textArea.setText("");
  13. textArea.setBackgroundColor(0x00000000);
  14. textArea.setTextColor(0x00000000);
  15. textArea.setFocusableInTouchMode(true);
  16. textArea.requestFocus();
  17. textArea.setCursorVisible(true);
  18. TextWatcher textWatcher = new TextWatcher() {
  19. @Override
  20. public void onTextChanged(CharSequence s, int start, int before,
  21. int count) {
  22. }
  23. @Override
  24. public void beforeTextChanged(CharSequence s, int start, int count,
  25. int after) {
  26. }
  27. @Override
  28. public void afterTextChanged(Editable s) {
  29. }
  30. };
  31. textArea.addTextChangedListener(textWatcher);
  32. //点击了软键盘的完成
  33. textArea.setOnEditorActionListener(new OnEditorActionListener()
  34. {
  35. @Override
  36. public boolean onEditorAction(TextView arg0, int arg1,KeyEvent arg2)
  37. {
  38. Log.e("点击", "完成");
  39. SendData(0,arg0.getText().toString());
  40. finish();
  41. return true;
  42. }
  43. });
  44. }
  45. // 向unity返回数据
  46. void SendData(int code, String info)
  47. {
  48. UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info);
  49. }
  50. }

代码很简单,就是在OnCreate中设置一下EditText的属性,在点击的软键盘的完成键后SendData向Unity返回数据

还需要一个类用来供Unity调用,用来打开这个Activity,也就是打开这个软键盘

  1. public class AndroidKeyboard
  2. {
  3. Activity context = null;
  4. InputMethodManager inputMethodManager = null;
  5. TextWatcher textWatcher = null;
  6. boolean mode = false;
  7. public AndroidKeyboard()
  8. {
  9. context = UnityPlayer.currentActivity;
  10. inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
  11. }
  12. //打开Activiy,并且显示输入法
  13. public void Open(final String text,final boolean mode)
  14. {
  15. if(context == null)
  16. {
  17. Log.e("unity", "context null when open keyboard");
  18. return ;
  19. }
  20. context.runOnUiThread(new Runnable()
  21. {
  22. @Override
  23. public void run()
  24. {
  25. Log.e("unity", "1111111111111");
  26. Intent intent = new Intent();
  27. intent.setClassName(context, "com.android.keyboardsdk.SDKActivity");
  28. context.startActivity(intent);
  29. }
  30. });
  31. }
  32. }

代码没什么好说的,就是Unity调用Open函数的时候打开这个Activity,并且显示软键盘

六 unity资源设置和AndroidManifest.xml设置

主要是设置上面的Activity的layout和软键盘的属性

附上Acitvity的xml,里面就放了一个EditText

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:layout_gravity="center_vertical|center_horizontal" >
  5. <EditText
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. android:layout_centerHorizontal="true"
  9. android:inputType="textNoSuggestions|textMultiLine"
  10. android:ems="10"
  11. android:imeOptions="actionDone"
  12. android:id="@+id/textArea"
  13. android:layout_alignParentTop="true"
  14. android:layout_alignParentRight="true"
  15. android:layout_alignParentEnd="true"
  16. android:layout_alignParentLeft="true"
  17. android:layout_alignParentStart="true"
  18. android:layout_alignParentBottom="true"
  19. android:textSize="0.01dp"
  20. android:gravity="top" />
  21. </RelativeLayout>

然后需要在Unity的AndroidManifest.xml中设置

  1. <activity
  2. android:configChanges="keyboard|keyboardHidden|orientation"
  3. android:screenOrientation="landscape"
  4. android:windowSoftInputMode="adjustResize|stateVisible"
  5. android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  6. android:name="com.android.keyboardsdk.SDKActivity">
  7. </activity>

主要是注册一下上面创建的Activity,不然在unity调用后打不开

七 unity中调用这个库,并打开软键盘

把上面创建的lib导出后放到unity中就可以提供给unity使用了

  1. 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即可

  1. void OnCustomInputAction(string data)
  2. {
  3.     //data就是软键盘传回来的数据
  4. }

八 替换掉NGUI UIInput的TouchScreenKeyboard.Open,并实现相关的逻辑,因为ngui版本不同,我就不多废话

 

版权声明:本文为July7th原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/July7th/p/6666977.html