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