进度指示器 - MRTK2

Progress Indicators

示例场景

可以在 ProgressIndicatorExamples 场景中找到有关如何使用进度指示器的示例。 此场景演示了 SDK 中包含的每个进度指示器预制件。 它还演示了如何将进度指示器与一些常见异步任务(例如场景加载)结合使用。

Progress Indicator Examples 1

示例:打开、更新和关闭进度指示器

进度指示器实现 IProgressIndicator 接口。 可以使用 GetComponent 从 GameObject 检索此接口。

[SerializedField]
private GameObject indicatorObject;
private IProgressIndicator indicator;

private void Start()
{
    indicator = indicatorObject.GetComponent<IProgressIndicator>();
}

IProgressIndicator.OpenAsync()IProgressIndicator.CloseAsync() 方法返回任务。 建议在异步方法中等待这些任务。

MRTK 的默认进度指示器预制件在放入场景中时应处于非活动状态。 调用进度指示器的 IProgressIndicator.OpenAsync() 方法时,进度指示器将自动激活,并停用它们的 GameObject。 (此模式不是 IProgressIndicator 接口的要求。)

将指示器的 Progress 属性设置为从 0 到 1 的值可更新其显示的进度。 设置其 Message 属性可更新其显示的消息。 不同的实现可能以不同的方式显示此内容。

private async void OpenProgressIndicator()
{
    await indicator.OpenAsync();

    float progress = 0;
    while (progress < 1)
    {
        progress += Time.deltaTime;
        indicator.Message = "Loading...";
        indicator.Progress = progress;
        await Task.Yield();
    }

    await indicator.CloseAsync();
}

指示器状态

指示器的 State 属性确定哪些操作有效。 调用无效的方法通常会导致指示器报告错误且不执行任何操作。

State 有效操作
ProgressIndicatorState.Opening AwaitTransitionAsync()
ProgressIndicatorState.Open CloseAsync()
ProgressIndicatorState.Closing AwaitTransitionAsync()
ProgressIndicatorState.Closed OpenAsync()

AwaitTransitionAsync()可用于确保指示器在使用之前完全打开或关闭。

private async void ToggleIndicator(IProgressIndicator indicator)
{
    await indicator.AwaitTransitionAsync();

    switch (indicator.State)
    {
        case ProgressIndicatorState.Closed:
            await indicator.OpenAsync();
            break;

        case ProgressIndicatorState.Open:
            await indicator.CloseAsync();
            break;
        }
    }