【问题标题】:Using callbacks/anonymous functions/delegates? [duplicate]使用回调/匿名函数/委托? [复制]
【发布时间】:2019-08-15 06:04:46
【问题描述】:

我的班级有以下功能:

public void RenderStylePrefabs()
{
    foreach (Renderer renderer in gameObject.GetComponentsInChildren<Renderer>())
    {
        if (gameObject.GetComponent<AvatarStyle>().prefabs.ContainsValue(renderer.name))
        {
            renderer.enabled = true;
        }
    }
}

public void UnrenderAllPrefabs()
{
    foreach (Renderer renderer in gameObject.GetComponentsInChildren<Renderer>())
    {
        renderer.enabled = false;
    }
}

注意它们是如何使用相同的 foreach 循环的。

我怎样才能把它变成这样的东西:

public void RenderStylePrefabs()
{
    RenderLoop({
        if (gameObject.GetComponent<AvatarStyle>().prefabs.ContainsValue(renderer.name))
        {
            renderer.enabled = true;
        }
    });
}

public void UnrenderAllPrefabs()
{
    RenderLoop({
        renderer.enabled = false;
    });
}

private void RenderLoop(doStuff)
{
    foreach (Renderer renderer in gameObject.GetComponentsInChildren<Renderer>())
    {
        doStuff();
    }
}

我不确定如何正确执行此操作。我正在阅读代表之类的内容,但对我来说有点困惑。

【问题讨论】:

    标签: c#


    【解决方案1】:

    您对使用委托的想法是正确的。

    RenderLoop() 方法应如下所示:

    private void RenderLoop(Action<Renderer> doStuff)
    {
        foreach (Renderer renderer in gameObject.GetComponentsInChildren<Renderer>())
        {
            doStuff(renderer);
        }
    }
    

    然后您可以从其他方法中调用它,例如(相应更改):

    RenderLoop((renderer) => renderer.enabled = true);
    

    renderer 周围的括号在这种情况下是可选的,但如果委托有多个参数,则需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多