Как передать Action в качестве параметра, не теряя ссылки в C # - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь создать индикатор прогресса в Unity3D с использованием языка C #.

У меня есть переменная типа Action с именем (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();
    }

}

Я инициализирую это действие, отправленное в качестве параметра другой функции, но оно не работает. Когда я пытался вызвать действие, действие кажется нулевым.

С другой стороны, я могу инициализировать его напрямую, без отправки в качестве параметра.

Рабочий код:

//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
}
...