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)
みたいな感じで複製した方のカメラを利用すれば成功。
コメント