【问题标题】:Timer for functions with any parameters具有任何参数的函数的计时器
【发布时间】:2019-05-27 15:27:44
【问题描述】:

我正在与 unity 合作,但在这种情况下,这只是一个 c# 问题。有没有办法制作一个可以使用任何参数运行任何功能的计时器?我一直在使用委托将函数放入计时器类或协程中,但我不知道如何将任何参数放入委托中。

另外,有很多像我这样的问题,但不同之处(因为我找不到任何专门解决我要问的问题)是我希望能够运行一个函数,我想要的任何函数,不管经过指定的秒数后,它可能需要或不需要什么参数。本质上,我希望能够运行一个需要浮动时间和委托函数的协程。它等待 time 秒,然后运行委托函数。但是,如果需要,我需要能够为函数输入参数,所以如果我想运行一个简单的函数

Debug.Log(评论)

将注释作为字符串参数后,或

Debug.Log(数字)

将数字作为浮点参数后。

总而言之,我怎样才能等待 x 秒来执行函数 y,并将 y 更改为我想要的任何内容,而无需创建一组新的委托和函数?

如果这是一个重复的问题或易于访问的信息,我深表歉意,因为经过大约一个小时的搜索,我无法找到任何答案。

【问题讨论】:

  • Debug.Log() 之所以有效,是因为它需要一个参数:一个对象。 C# 中的一切都是对象。那是你要找的吗?或者,也许您正在寻找通用类型? Func<T,U>等?
  • 如果参数量保持不变,使输入对象可以工作,但如果我想在之后使用两个参数执行 Debug.Log(comment + number) 怎么办?有什么方法可以让委托接受 0 到 100 个参数,所有这些参数都是对象?
  • @HackerMan,是的,它是possible。问题是在您的情况下,您必须传递对象数组,然后检查每个元素的类型,然后进行强制转换,然后最后做您想做的事情。你确定可以做任何事情的写作功能是你需要的吗?
  • 不确定但也许你可以使用Timerdocs.microsoft.com/en-us/dotnet/api/…
  • 您是否也尝试过this one?它似乎能够处理参数..

标签: c# unity3d timer delegates coroutine


【解决方案1】:

似乎不可能有我想要的灵活解决方案,但我通过创建一组零/一/二/等来解决它。参数委托和协程,所以如果我想等待 5 秒来运行一个名为 debugHello 的函数并将“hello”作为 debugHello 的参数,我会将 debugHello 放入名为 debugHelloMeth 的 oneParamMeth 的委托实例中,然后执行 StartCoroutine(oneParamMethTimer(5 , debugHellometh, "你好")); .这样,至少对于 void 函数,只要我创建一对新的委托和协程来配合它们,我就可以做尽可能多的参数。

编辑:DerHugo 的评论效果更好!比我的干净很多。

【讨论】:

    【解决方案2】:

    我会使用 lambda 函数。

    IEnumerator MyCoroutine(float delay, System.Action action)
    {
        yield return new WaitForSeconds(delay);
        action();
    }
    

    然后

    float number = 1.0f;
    string comment;
    StartCoroutine(MyCoroutine(0.5f, () =>
        {
            Debug.Log(number);
            Debug.Log(comment);
        });
    
    Vector3 tmp = Vector3.zero;
    StartCoroutine(MyCoroutine(1.0f, () =>
        {
            transform.position = tmp;
        });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多