1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OnGUI() で重い処理をしたい

Last updated at Posted at 2021-02-26

概要

 エディタ拡張で、ボタンをクリックときに重い処理をすると出るエラーの回避法について書いてあります。

背景

 kumaS-nu/NuGet-importer-for-Unity
 ↑のプロジェクトで、ボタンをクリックしたらインストールするようにしたらエラーが出て、動くけど気持ち悪かったので回避法を見つけました。また、このプロジェクトは以下の記事で宣伝しています。
Unity のプロジェクトに NuGet のパッケージをインポートするエディタ拡張を作ったよ

エラー内容

 こんな感じのコードを書くと、BeginLayoutGroup must be called first. とエラーが起きる。

public async Task OnGUI()
{
    using(new EditorGUILayout.VerticalScope())
    {
        // 重い処理の代わり。
        await Task.Delay(10000);
    }
}

解決法

 結局、スコープ内で待っているのが悪いので最後に待つようにすればいい。順番とかあるときはメソッドとして切り出せばいい。
 あと、例では asyncawait を使っているけどコルーチンにしても問題ない。

public async Task OnGUI()
{
    var tasks = new List<Task>();
    using(new EditorGUILayout.VerticalScope())
    {
        tasks.Add(Heavymethod);
    }
    await Task.WhenAll(tasks);
}

private async Task Heavymethod()
{
    await Task.Delay(10000);
}

あとがき

 やっぱり消せるエラーは無くした方がいい。対処しないといけないエラーを埋もれさせちゃうので。あと、Unity2019 以前はどうやってもエラーは起きるのでどうしようもない。(Unity 公式の C# のリファレンスのソースコードに「ここは私の部門じゃどうしようもないよ」とか書いてあった。)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?