概要
エディタ拡張で、ボタンをクリックときに重い処理をすると出るエラーの回避法について書いてあります。
背景
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);
}
}
解決法
結局、スコープ内で待っているのが悪いので最後に待つようにすればいい。順番とかあるときはメソッドとして切り出せばいい。
あと、例では async
・await
を使っているけどコルーチンにしても問題ない。
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# のリファレンスのソースコードに「ここは私の部門じゃどうしようもないよ」とか書いてあった。)