特定レイヤーを無視してReadPixelsで指定ピクセルの色を取得する方法

Texture2D.ReadPixelsは表示画面の指定座標のピクセルを取得するもの。

そのピクセルの色を取得することができます。

参考にしたのはこちらの記事です。

タップしている画素の色を取得する - テラシュールブログ
Unityでカーソルが当たっている場所の色を取得するサンプル。Texture2D.ReadPixelsで画面のピクセルが取得できるので、その1ドットだけ取得して色を抽出している。画面全体に対して行うと重いが、1ドット程度なら余裕。

ただ、このReadPixelsは表示されている画面の特定ピクセルの色を取得するため、ある特定のレイヤーを無視する、といったことはできません。

やりたいこと

上から俯瞰する視点の2Dゲームで、プレイヤーの足元の地面の色によって処理を分岐させたかった。

地面の色が赤色のところに立っていたらゲームオーバー、みたいな。

つまり、プレイヤーのSpriteに被っている部分の地面の色を取得したい。

試してみたこと(失敗例)

じゃあ、ReadPixelsの直前にプレイヤーのSprite Rendererを非アクティブにして、ReadPixelsが終わったら再びアクティブにすればいいんじゃね?ということで、


playerRenderer.enabled = false;
tex.ReadPixels(new Rect(pos.x, pos.y, 1, 1), 0, 0);
playerRenderer.enabled = true;

みたいなことをやってみました。

が、ReadPixelsを呼び出しているのが、描画が終わった直後に呼び出されるイベント関数OnPostRender()内なので、その中でSprite Rendererをどうこうやっても意味のない様子。
(OnPostRender()とか正直いまいち理解してないけど)

解決方法

じゃあ、カメラを2つ用意しちゃえ!ということで、
画面表示用のmainカメラと、ピクセル取得用のカメラの2つを用意しました。

もともとあったMain Cameraを複製して、TagをMainCamera以外にします。(これ忘れがち)

その後、CameraコンポーネントのCulling Maskで無視したいレイヤーのチェックを外します。

あとはピクセルの座標を取るときに

playerHiddenCamera.WorldToScreenPoint(playerTrans.position)

みたいな感じで複製した方のカメラを利用すれば成功。

コメント