【Unity】Unity InputField撤销、还原功能 (Undo、Redo)

Unity InputField撤销、还原功能 Ctrl+Z、Ctrl+Y

转载 原地址]

需要修改源码 直接上C#代码

代码`.

// InputFieldUndo.cs
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class InputFieldUndo : InputField
{
    protected Stack<Action> undoStack = new Stack<Action>();
    protected Stack<Action> redoStack = new Stack<Action>();

    protected Event m_ProcessingEvent = new Event();

    public override void OnUpdateSelected(BaseEventData eventData)
    {
        if (!isFocused)
            return;

        bool consumedEvent = false;
        while (Event.PopEvent(m_ProcessingEvent))
        {
            if (m_ProcessingEvent.rawType == EventType.KeyDown)
            {
                consumedEvent = true;
                if (ProcessUndo(m_ProcessingEvent))
                {
                    var shouldContinue = KeyPressed(m_ProcessingEvent);

                    if (shouldContinue == EditState.Finish)
                    {
                        DeactivateInputField();
                        break;
                    }
                }
            }

            switch (m_ProcessingEvent.type)
            {
                case EventType.ValidateCommand:
                case EventType.ExecuteCommand:
                    switch (m_ProcessingEvent.commandName)
                    {
                        case "SelectAll":
                            SelectAll();
                            consumedEvent = true;
                            break;
                    }
                    break;
            }
        }

        if (consumedEvent)
            UpdateLabel();

        eventData.Use();
    }

    private bool ProcessUndo(Event e)
    {
        if (e.keyCode == KeyCode.U && e.control)
        {
            if (undoStack.Count > 0)
            {
                StackPush(redoStack);
                undoStack.Pop()();
            }
            return false;
        }
        else if (e.keyCode == KeyCode.R && e.control)
        {
            if (redoStack.Count > 0)
            {
                StackPush(undoStack);
                redoStack.Pop()();
            }
            return false;
        }
        else if (ShouldRecord(e))
        {
            redoStack.Clear();
            StackPush(undoStack);
        }
        return true;
    }
    // restrict undo recording to relevant key presses
    private bool ShouldRecord(Event e)
    {
        switch (e.keyCode)
        {
            case KeyCode.None:
            case KeyCode.LeftShift:
            case KeyCode.RightShift:
            case KeyCode.LeftControl:
            case KeyCode.RightControl:
            case KeyCode.LeftAlt:
            case KeyCode.RightAlt:
                return false;
        }
        return true;
    }

    private void StackPush(Stack<Action> stack)
    {
        var oldText = text;
        var oldPos = caretPosition;
        stack.Push(() =>
        {
            text = oldText;
            caretPosition = oldPos;
        });
    }
}
Unity中的InputField是一种常见的用户输入控件,常常用于收集用户的文字或数字输入。在使用InputField时,为了提高开发效率和代码可维护性,我们可以将其工具化,将常用的设置和功能封装成一个可复用的组件,以便在需要时快速使用。 以下是实现InputField工具化的一些步骤: 1. 创建一个新的GameObject,将Unity中的InputField组件拖拽到它上面,然后重命名为“InputFieldTool”。 2. 在InputFieldTool中添加一个新的Script组件,命名为“InputFieldToolScript”。 3. 在InputFieldToolScript中添加一些公共变量,这些变量将代表InputField的一些常用设置和功能。例如: - public Text placeholderText; // 占位符文本 - public Text inputText; // 输入文本 - public bool interactable; // 是否可交互 - public bool readOnly; // 是否只读 - public bool multiLine; // 是否多行输入 - public int characterLimit; // 字符限制 - public InputField.ContentType contentType; // 输入类型 - public InputField.InputType inputType; // 输入方式 - public InputField.LineType lineType; // 行类型 - public InputField.CharacterValidation characterValidation; // 字符验证 4. 在InputFieldToolScript中添加一个初始化函数,用于将InputField的各种设置应用到公共变量上。例如: ``` public void Init() { placeholderText.text = GetComponent<InputField>().placeholder.GetComponent<Text>().text; inputText.text = GetComponent<InputField>().text; interactable = GetComponent<InputField>().interactable; readOnly = GetComponent<InputField>().readOnly; multiLine = GetComponent<InputField>().multiLine; characterLimit = GetComponent<InputField>().characterLimit; contentType = GetComponent<InputField>().contentType; inputType = GetComponent<InputField>().inputType; lineType = GetComponent<InputField>().lineType; characterValidation = GetComponent<InputField>().characterValidation; } ``` 5. 在InputFieldToolScript中添加一个更新函数,用于将公共变量的值更新到InputField中。例如: ``` public void UpdateInputField() { GetComponent<InputField>().placeholder.GetComponent<Text>().text = placeholderText.text; GetComponent<InputField>().text = inputText.text; GetComponent<InputField>().interactable = interactable; GetComponent<InputField>().readOnly = readOnly; GetComponent<InputField>().multiLine = multiLine; GetComponent<InputField>().characterLimit = characterLimit; GetComponent<InputField>().contentType = contentType; GetComponent<InputField>().inputType = inputType; GetComponent<InputField>().lineType = lineType; GetComponent<InputField>().characterValidation = characterValidation; } ``` 6. 在InputFieldToolScript中添加一个重置函数,用于将InputField恢复到默认值。例如: ``` public void Reset() { GetComponent<InputField>().text = ""; GetComponent<InputField>().interactable = true; GetComponent<InputField>().readOnly = false; GetComponent<InputField>().multiLine = false; GetComponent<InputField>().characterLimit = 0; GetComponent<InputField>().contentType = InputField.ContentType.Standard; GetComponent<InputField>().inputType = InputField.InputType.Standard; GetComponent<InputField>().lineType = InputField.LineType.SingleLine; GetComponent<InputField>().characterValidation = InputField.CharacterValidation.None; } ``` 7. 最后,在Unity中使用InputFieldTool时,只需将它拖拽到场景中即可。在需要对InputField进行设置和操作时,可以直接在InputFieldToolScript中的公共变量中修改,然后调用UpdateInputField函数将更改应用到InputField中。 通过上述步骤,我们就实现了InputField的工具化,可以更方便地在代码中对其进行设置和操作,提高开发效率和代码可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊的成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值