いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Unityで、RawImageを空間内の好きな位置に表示する

 RawImageを空間内の好きな位置に表示する方法をまとめておきます。このブログ内で何となくあちこちに散らばって書いてあって使いづらいので。

 下の画像を空間内の任意の位置に配置して表示します。
f:id:Inuosann:20210802190620p:plain:w100


準備①
画像はpngで、背景(犬の輪郭の外側)は透過にしておきます。ぼくはWindowsに付属のペイント3Dでやりました。これをUnityに読み込ませます。その際、インスペクタでTextureTypeを「Sprite(2D and UI)」としておきます。
準備②
ヒエラルキーCanvasを追加し、その下(子)にRawImageを追加ます。名前はそれぞれCanvasJikkenn、RawImageJikkennに変更します。インスペクタでCanvasJikkennのRenderModeを「WorldSpace」とします。
準備③
インスペクタでRawImageJikkennのTextureにさっきの犬の画像をセットします。ドラッグ&ドロップすればよいでしょう。

 これで準備完了、あとはコードです。

    void rawImageTest(Vector3 p)
    {
        //キャンバスのlocalPositionをセット
        GameObject go = GameObject.Find("CanvasJikkenn");//①
        RectTransform rtf = go.GetComponent<RectTransform>();//②
        rtf.localPosition = Vector3.zero;//③

        //RawImageのlocalPositionをセット
        GameObject goRaw = GameObject.Find("RawImageJikkenn");//④
        RectTransform rtfRaw = goRaw.GetComponent<RectTransform>();//⑤
        rtfRaw.localPosition = p;//⑥
    }

 これだけです。説明します。
 ①~③で、準備で作ったキャンバスのゲームオブジェクト、RectTransformを取得してlocalPositionを(0f, 0f, 0f)にセットしています。④~⑥で、RawImageのゲームオブジェクト、RectTransformを取得し、localPositionを画像を表示したい位置にセットします。
 例えば

        Vector3 p = new Vector3(0f, 0f, 10f);
        rawImageTest(p);

を実行すると次のような表示になります。
f:id:Inuosann:20210802210454p:plain:w250
シューティングゲームの背景が見えていますが、気にしないでください。画面の真ん中辺りに犬が表示されています! ちなみに……次のコードだと……

        Vector3 p = new Vector3(10f, 0f, 15f);
        rawImageTest(p);

こうなります。
f:id:Inuosann:20210802210322p:plain:w250
右奥の方に表示されます。

 なお、今回は触れていませんが、RawImageはセットされている画像の任意の一部分を表示することもできます。例えば犬の写真の右上1/4を表示することができるのです。その方法については以下を参照してください。
www.omoshiro-suugaku.com

 やはり情報は使いやすい形で、まとめて管理しておかないと役に立ちません。さらに、サンプルのコードは上のように最短のものがよいのです。
 あとひとつ。上のサンプルのコードでは表示のたびにいちいちキャンバスのゲームオブジェクトを取得して、……と繰り返すことになります。最初に1回だけ実行しておけばよい部分はそうしてください。原理を短いコードで分かりやすく説明するのが目的です。実践では無駄がでることがあります。その辺は注意してください。