2015-04-16 4 views
2

Я использую InputField в своем приложении для Android, чтобы получить строку, когда появляется мягкая клавиатура, когда я вхожу в строку, но теперь я хочу вызвать функцию, когда пользователь нажимает «done» ", как я могу это сделать?
Unity3d 4.6.2f1
done keyКак обнаружить кнопку «done» в softkeyboard Unity3d

+0

выясню способ решить эту проблему я отправил свое решение. –

ответ

4

лучший способ я нашел это подкласс InputField. Вы можете посмотреть источник UnityUI на битбакет. В этом подклассе вы можете получить доступ к защищенному полю m_keyboard и проверить, было ли выполнено нажатие и не отменено, что даст вам желаемый результат. Использование «отправки» EventSystem не работает должным образом. Еще лучше, когда вы интегрируете его в Unity EventSystem.

Что-то вроде этого: SubmitInputField.cs

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections; 
using System.Collections.Generic; 
using System.Text; 
using UnityEngine.Events; 
using System; 
using UnityEngine.EventSystems; 
using UnityEngine.Serialization; 

public class SubmitInputField : InputField 
{ 
    [Serializable] 
    public class KeyboardDoneEvent : UnityEvent{} 

    [SerializeField] 
    private KeyboardDoneEvent m_keyboardDone = new KeyboardDoneEvent(); 

    public KeyboardDoneEvent onKeyboardDone { 
     get { return m_keyboardDone; } 
     set { m_keyboardDone = value; } 
    } 

    void Update() 
    { 
     if (m_Keyboard != null && m_Keyboard.done && !m_Keyboard.wasCanceled) { 
      m_keyboardDone.Invoke(); 
     } 
    } 
} 

Editor/SubmitInputFieldEditor.cs

using UnityEngine; 
using System.Collections; 
using UnityEditor; 
using UnityEngine.UI; 
using UnityEditor.UI; 

[CustomEditor (typeof(SubmitInputField), true)] 
[CanEditMultipleObjects] 
public class SubmitInputFieldEditor : InputFieldEditor 
{ 
    SerializedProperty m_KeyboardDoneProperty; 
    SerializedProperty m_TextComponent; 

    protected override void OnEnable() 
    { 
     base.OnEnable(); 
     m_KeyboardDoneProperty = serializedObject.FindProperty ("m_keyboardDone"); 
     m_TextComponent = serializedObject.FindProperty ("m_TextComponent"); 
    } 


    public override void OnInspectorGUI() 
    { 
     base.OnInspectorGUI(); 
     EditorGUI.BeginDisabledGroup (m_TextComponent == null || m_TextComponent.objectReferenceValue == null); 

     EditorGUILayout.Space(); 

     serializedObject.Update(); 
     EditorGUILayout.PropertyField (m_KeyboardDoneProperty); 
     serializedObject.ApplyModifiedProperties(); 

     EditorGUI.EndDisabledGroup(); 
     serializedObject.ApplyModifiedProperties(); 
    } 
} 
+0

нормально, спасибо за ваш ответ. испытайте это как можно скорее. –

+0

Ты прибил его! Странно, что Unity не имеет этой чрезвычайно общей задачи, решенной из коробки! Протестировано и работает на iOS. Unity 5.4.1f1 – Parmaia

+0

Это работает на iOS, Unity 5.4.0f3 – mnaa

0

Вы должны быть в состоянии достичь того же с помощью этого:

function Update() { 
     Event e = Event.currrent; 
     if (e.type == EventType.keyDown && e.keyCode == KeyCode.Return) 
      //Put in what you want here 
    } 
+0

что такое «e», и кто я могу получить к нему доступ? Я использую C# в unity3d –

+0

'e' - ваша переменная для события. Вы можете использовать этот «Event e = Event.current;» –

+0

, когда я использую ваш код, я получаю массовые исключения для нулевого указателя. но похож на ваш код, я использую 'Input.GetKeyDown (KeyCode.Return)', и теперь он работает в редакторе, но все еще не работает в Android-устройстве. –

 Смежные вопросы

  • Нет связанных вопросов^_^