首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一新输入系统调用统一事件只触发一个函数一次

问统一新输入系统调用统一事件只触发一个函数一次
EN

Stack Overflow用户
提问于 2022-08-24 16:14:15
回答 1查看 368关注 0票数 0

我试图使用新的输入系统来调用统一事件,但是由于某种原因,在触发一个事件之后,无法触发其他事件。更准确地说,我正在尝试将输入系统与这段视频的撤销/重做系统的稍微修改的版本结合起来。

首先,我使用public static List<ICommand> Undoable;和public static List<ICommand> Redoable;代替了视频中显示的public static List<ICommand> CommandHistory。

我尝试触发的函数的一个例子:(这来自Test类)

代码语言:javascript
复制
int i = 0;
public void Execute()
{
    Test();
}

private void Test()
{
    i++;
    Debug.Log($"test No.{i}"); 
}

public void Undo()
{
    Test();
}

我试着从CommandInvoker中使用

代码语言:javascript
复制
public void Test()
{
    CommandInvoker.AddCommand(new Test());
}

然后我试着在上面使用撤销:

代码语言:javascript
复制
public void Undo(InputAction.CallbackContext ctx)
{
    Debug.Log(CommandInvoker.Undoable.Count - 1);

    ICommand c = CommandInvoker.Undoable[CommandInvoker.Undoable.Count - 1];

    c.Undo();

    CommandInvoker.Undoable.Remove(c);

    CommandInvoker.Redoable.Add(c);
}

为了安全起见,我甚至添加了callbackContext,但这一点也没有帮助。

我不知道代码有什么问题,所以我添加了一些调试日志:

Debug.Log($"buffer count after adding command: {commandBuffer.Count}");中的AddCommand()

Debug.Log($"buffer count after execution: {commandBuffer.Count}");到update()

最后,在我将c添加到Update()中的列表之后,

这就是我在控制台中得到的:第一次调用测试操作:

添加命令后的缓冲区计数:1 添加命令后的缓冲区计数:2 第1号试验 执行后的缓冲区计数:1 不可撤销的行动:1 执行后的缓冲区计数:0 不可撤销的行动:2 可撤销的操作:3第二次调用测试操作: 无法采取的行动:4 不可撤销的行动:5 可撤消的操作:6调用撤消操作后: -1 ArgumentOutOfRangeException:索引超出了范围。必须是非负的,并且小于集合的大小。参数名称:索引 ArgumentOutOfRangeException在执行“已执行”的密钥绑定和快捷方式/撤消/键盘/ctrl、/Keyboard/z的回调时 -1 ArgumentOutOfRangeException:索引超出了范围。必须是非负的,并且小于集合的大小。参数名称:索引 ArgumentOutOfRangeException在执行'keybinds和快捷方式/撤消/键盘/ctrl,/Keyboard/z‘的“取消”回调时

除了关闭范围错误之外,在解决第一个问题后,我将尝试修复这些错误:测试操作只执行一次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-25 15:00:16

因此,不管怎么说,结果是关掉你的电脑真的会对一些错误产生奇迹。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73476482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档