UniTaskを利用して”画素を取得する既存のコルーチン”を書き換えています。
C#
1 //既存のコルーチン 問題なく動く 2 private IEnumerator spoitCoroutine() 3 { 4 //描画終わってから色を取り出すために遅らせる 5 yield return new WaitForEndOfFrame(); 6 7 //Inputした座標の色をinputPosColorに保持させる 8 Vector2 inputPos = Input.mouseposition; 9 _tex2D.ReadPixels(new Rect(inputPos.x, inputPos.y, 1, 1), 0, 0); 10 _inputPosColor = _tex2D.GetPixel(0, 0); 11 Debug.Log("Color Change 触れた場所の色:" + _inputPosColor); 12 13 _runCoroutine = null; 14 } 15 16 //呼び出し側 17 if (_runCoroutine == null) 18 { 19 _runCoroutine = StartCoroutine(spoitCoroutine()); 20 } 21
しかし、UniTaskを利用した場合、下記のエラーが消えず困っております。
ReadPixels was called to read pixels from system frame buffer, while not inside drawing frame.
```C#
private async UniTaskVoid spoitAsync()
{
//描画終わってから色を取り出すために遅らせる
await UniTask.Yield(PlayerLoopTiming.PostLateUpdate);
//Inputした座標の色をinputPosColorに保持させる Vector2 inputPos = Input.mouseposition; _tex2D.ReadPixels(new Rect(inputPos.x, inputPos.y, 1, 1), 0, 0); _inputPosColor = _tex2D.GetPixel(0, 0); Debug.Log("Color Change 触れた場所の色:" + _inputPosColor); }
//呼び出し側
spoitAsync().Forget();
調べた限りでは、UnityのAPIはメインスレッド内でしか動かない等の記事がありましたので、 下記のようにメインスレッドに処理を戻しましたが、ダメでした。 ```C# await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); await UniTask.SwitchToMainThread();
PlayerLoopTiming.PostLateUpdateがWaitForEndOfFrameと実行のタイミングが違うのではないか、、、
と仮説を立てて検証中です。原因がわかる方いらっしゃいましたら教えてください。
Unity Ver2019.3.0f6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。