美文网首页
Unity中的 GUILayout.TextField实现复制粘

Unity中的 GUILayout.TextField实现复制粘

作者: 不文不武的禾文 | 来源:发表于2020-03-17 23:22 被阅读0次

    前一段时间,在项目中使用他们写的窗口工具的时候,发现有的TextField虽然可以选择,但是不能复制粘贴,然后有同事就去找了解决方案,用一个方法把选择的内容复制粘贴到剪切板上,代码如下:

        public static string HandleCopyPaste(int controlID)
        {
            if (controlID == GUIUtility.keyboardControl)
            {
                if (Event.current.type == UnityEngine.EventType.KeyUp && (Event.current.modifiers == EventModifiers.Control || Event.current.modifiers == EventModifiers.Command))
                {
                    if (Event.current.keyCode == KeyCode.C)
                    {
                        Event.current.Use();
                        TextEditor editor = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
                        editor.Copy();
                    }
                    else if (Event.current.keyCode == KeyCode.V)
                    {
                        Event.current.Use();
                        TextEditor editor = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
                        editor.Paste();
    #if UNITY_5_3_OR_NEWER || UNITY_5_3
                        return editor.text; //以及更高的unity版本中editor.content.text已经被废弃,需使用editor.text代替
    #else
                        return editor.content.text;
    #endif
                    }
                    else if (Event.current.keyCode == KeyCode.A)
                    {
                        Event.current.Use();
                        TextEditor editor = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
                        editor.SelectAll();
                    }
                }
            }
            return null;
        }
    
    image.gif

    然后通过这个方法再把TextField的值传出来。

     string value = "";
                int textFieldID = GUIUtility.GetControlID("TextField".GetHashCode(), FocusType.Keyboard) + 1;
                if (textFieldID != 0)
                    value = HandleCopyPaste(textFieldID) ?? value;
                GUILayout.TextField(value, GUILayout.Width(position.width));
    
    image.gif

    这个方法应该是哪个大神写的底层的解决方案了吧,如果哪天发现其他地方不能复制粘贴,也可以用这个方法试试。

    然后我发现EditorGUILayout这个类里面的TextField却可以复制粘贴,不能复制粘贴那个是GUILayout类里面的TextField,使用方法都是一样的。

        EditorGUILayout.TextField(value, GUILayout.Width(position.width));
    
    image.gif

    应该EditorGUILayout里面封装过的吧,哎,没有源码不知道为什么。

    相关文章

      网友评论

          本文标题:Unity中的 GUILayout.TextField实现复制粘

          本文链接:https://www.haomeiwen.com/subject/talfyhtx.html