C# 在C中如何在不丢失引用的情况下将动作作为参数传递#

C# 在C中如何在不丢失引用的情况下将动作作为参数传递#,c#,unity3d,action,C#,Unity3d,Action,我想用C语言在Unity3D中制作一个进度条 我有一个名为(task)ProgressCompleted的操作类型变量,我将在特定函数的末尾调用它 您可以在下面的示例代码中看到: 我试图声明为静态或非静态。一切都没有改变 public class GooglePlayManager : MonoBehaviour { //singleton stuff. public static Action initializationProgressCompleted; pub

我想用C语言在Unity3D中制作一个进度条

我有一个名为(task)ProgressCompleted的操作类型变量,我将在特定函数的末尾调用它

您可以在下面的示例代码中看到:

我试图声明为静态或非静态。一切都没有改变

public class GooglePlayManager : MonoBehaviour {

    //singleton stuff.

    public static Action initializationProgressCompleted;
    public static Action signInProgressCompleted;

public void Initialize() {
        //do some stuff.

        initializationProgressCompleted?.Invoke();
    }

}

public class GameManager : MonoBehaviour {

    public static Action initializationProgressCompleted;

    //singleton stuff.

    #endregion

    private void Start() {
        List<Action> tasks = new List<Action>();
        tasks.Add(GooglePlayManager.initializationProgressCompleted);

        LoadingManager.instance.SetCheckList(tasks);

        GooglePlayManager.instance.Initialize();
    }

}


public class LoadingManager {

   //singleton stuff.

public void SetCheckList(List<Action> tasks) {
        _checkList = new bool[tasks.Count];

        for (int ii = 0; ii < tasks.Count; ii++) {
            tasks[ii] += Progress;
        }
    }

    public void Progress() {
        for (int ii = 0; ii < _checkList.Length; ii++) {
            if (_checkList[ii]) {
                continue;
            } else {
                _checkList[ii] = true;
                break;
            }
        }

        UpdateUI();
    }

}


initializationProgressCompleted
在声明时为空,仅在工作代码中的
+=Test
中初始化。你把它放在别的地方了吗?如果是这样的话,你能分享那个代码吗?我在帖子中添加了完整的代码。第一个调用方法是Start。@Ruzihm我已经在文章中添加了完整的代码,您可以重现这个问题。您的操作为null,即使对它调用+=也会出错,因为它在任何地方都没有初始化。如果您不打算对它调用new,我建议您将代码更改为此<代码>公共静态操作initializationProgressCompleted=委托{}这将保存它,使其不为空,这样您就不必检查它是否为空,您可以直接添加到它。我这样调用时没有错误。另外,若我不以参数表的形式发送,若我使用我在post上共享的类似于工作代码的部分,那个么它在并没有对变量进行任何初始化的情况下确实可以工作。
//ClassA
public static Action initializationProgressCompleted;

public void Initialize() {
        //Complete some tasks.

        initializationProgressCompleted?.Invoke();
    }
//ClassB
private void Func() {
        ClassA.initializationProgressCompleted += Test;
    }

private void Test() {
   //log message
}