Unity中的 GUILayout.TextField实现复制粘贴功能

49 篇文章 1 订阅
15 篇文章 9 订阅

 前一段时间,在项目中使用他们写的窗口工具的时候,发现有的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;
    }

然后通过这个方法再把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));

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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的Unity ECS 技能编辑器的实现代码: 首先,我们需要创建一个名为“Skill”的组件,该组件存储技能的属性信息,例如技能名称、类型、伤害值等。在 ECS ,我们使用结构体存储组件数据。例如: ```csharp public struct Skill : IComponentData { public string name; public SkillType type; public int damage; } ``` 在上面的代码,我们定义了一个名为“Skill”的结构体,该结构体实现了 IComponentData 接口。我们在结构体定义了技能的名称、类型和伤害值等属性。SkillType 是一个枚举,表示技能的类型。 接下来,我们需要定义一个名为“SkillSystem”的系统,该系统负责处理技能的创建、编辑和删除等操作。例如: ```csharp public class SkillSystem : ComponentSystem { protected override void OnUpdate() { // 处理技能的创建、编辑和删除等操作 } public void CreateSkill(string name, SkillType type, int damage) { // 创建一个新的技能 Entity entity = EntityManager.CreateEntity(); EntityManager.AddComponentData(entity, new Skill { name = name, type = type, damage = damage }); } public void EditSkill(Entity entity, string name, SkillType type, int damage) { // 编辑一个已有的技能 EntityManager.SetComponentData(entity, new Skill { name = name, type = type, damage = damage }); } public void DeleteSkill(Entity entity) { // 删除一个已有的技能 EntityManager.DestroyEntity(entity); } } ``` 在上面的代码,我们定义了一个名为“SkillSystem”的系统,该系统继承自 ComponentSystem,用于处理技能的创建、编辑和删除等操作。在“CreateSkill”函数,我们使用 EntityManager 创建一个新的实体,并将 Skill 组件添加到该实体。在“EditSkill”函数,我们使用 EntityManager 更新指定实体的 Skill 组件数据。在“DeleteSkill”函数,我们使用 EntityManager 销毁指定实体。 最后,我们可以在 Unity 的 Inspector 界面创建一个名为“SkillEditor”的自定义编辑器,该编辑器用于创建、编辑和删除技能。例如: ```csharp [CustomEditor(typeof(SkillSystem))] public class SkillEditor : Editor { private SkillSystem system; private string name; private SkillType type; private int damage; void OnEnable() { system = target as SkillSystem; } public override void OnInspectorGUI() { base.OnInspectorGUI(); EditorGUILayout.Space(); EditorGUILayout.LabelField("Create New Skill"); name = EditorGUILayout.TextField("Name", name); type = (SkillType)EditorGUILayout.EnumPopup("Type", type); damage = EditorGUILayout.IntField("Damage", damage); if (GUILayout.Button("Create")) { system.CreateSkill(name, type, damage); } EditorGUILayout.Space(); EditorGUILayout.LabelField("Edit Skill"); foreach (var entity in system.GetEntities<Skill>()) { Skill skill = EntityManager.GetComponentData<Skill>(entity); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Edit")) { name = skill.name; type = skill.type; damage = skill.damage; } EditorGUILayout.LabelField(skill.name); EditorGUILayout.EndHorizontal(); } name = EditorGUILayout.TextField("Name", name); type = (SkillType)EditorGUILayout.EnumPopup("Type", type); damage = EditorGUILayout.IntField("Damage", damage); if (GUILayout.Button("Save")) { system.EditSkill(entity, name, type, damage); } EditorGUILayout.Space(); EditorGUILayout.LabelField("Delete Skill"); foreach (var entity in system.GetEntities<Skill>()) { Skill skill = EntityManager.GetComponentData<Skill>(entity); if (GUILayout.Button(skill.name)) { system.DeleteSkill(entity); } } } } ``` 在上面的代码,我们创建了一个名为“SkillEditor”的自定义编辑器,并将其附加到我们的“SkillSystem”对象上。在编辑器,我们可以创建、编辑和删除技能。在“Create New Skill”部分,我们可以输入新技能的名称、类型和伤害值,并使用“Create”按钮创建新技能。在“Edit Skill”部分,我们可以查看已有的技能,并使用“Edit”按钮编辑技能。在“Delete Skill”部分,我们可以查看已有的技能,并使用按钮删除技能。 希望这个简单的代码可以帮助您实现 Unity ECS 技能编辑器的功能
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值