public IEnumerator TaskListCoroutine()
        {
            while (CurrentTaskId != Tasks.Count)
            {
                if (CurrentTaskId == -1)
                {
                    yield return(null);
                }

                int tempTaskId = CurrentTaskId;

                // destroy previous hint if any
                if (Hint != null)
                {
                    Destroy(Hint);
                }

                // get the task
                Task task = Tasks[tempTaskId];

                // unlock node
                ChangeLockOfTaskNode(task, false);

                // fire task start event
                if (TaskStartListeners != null)
                {
                    TaskStartListeners.Invoke(task);
                }

                task.DrawTaskHint();
                while (tempTaskId == CurrentTaskId)
                {
                    task.UpdateTaskHint();
                    yield return(null);
                }

                MPO.Release();
                MPO.Deselect(task.GameObject);

                ChangeLockOfTaskNode(task, true);

                // destroy hint if any
                if (Hint != null)
                {
                    Destroy(Hint);
                }

                // run task event coroutine if exists
                if (task.TaskEvent != null)
                {
                    yield return(StartCoroutine(task.TaskEvent.TaskEventCoroutine()));
                }

                yield return(null);
            }

            yield return(null);
        }
 public void Release()
 {
     MPO.Release();
 }