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

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

Unityで画像から画像データを取り出し、他の画像にコピーする

Unityで、オブジェクトの持っている画像データを他のオブジェクトにコピーしたいことがあります。シーンに配置した単なる画像(ビットマップなどの画像ファイル)にもUIのImageにもスプライトが含まれており、このスプライトに画像データが入っています(UIのImageは、インスペクタで「Source Image」というところにプログラマが画像ファイルをセットできる)。結局、オブジェクトからスプライトを取り出してそれを他のオブジェクトにコピーすればよいのですが、スプライトの取り出し方がオブジェクトによって異なり、ぼくは実験して確かめました。いちいち調べるのは大変なので、以下にまとめておきます。

 

①画像から画像へ

    void setSpriteA(string gazoName1, string gazoName2) {

        GameObject go1 = GameObject.Find(gazoName1);

        GameObject go2 = GameObject.Find(gazoName2);

        SpriteRenderer sr1 = go1.GetComponent<SpriteRenderer>();

        SpriteRenderer sr2 = go2.GetComponent<SpriteRenderer>();

        sr2.sprite = sr1.sprite;

    }

 

②ImageからImageへ

    void setSpriteB(string imName1, string imName2) {

        GameObject go1 = GameObject.Find(imName1);

        GameObject go2 = GameObject.Find(imName2);

        Image im1 = go1.GetComponent<Image>();

        Image im2 = go2.GetComponent<Image>();

        im2.sprite = im1.sprite;

    }

 

③画像からImageへ

    void setSpriteC(string gazoName, string imName) {

        GameObject obj = GameObject.Find(gazoName);

        SpriteRenderer sr = obj.GetComponent<SpriteRenderer>();

        GameObject go = GameObject.Find(imName);

        Image im = go.GetComponent<Image>();

        im.sprite = sr.sprite;

    }

 

④スプライトを画像へ

    void setSpriteD(Sprite sp, string gazoName) {

        GameObject go = GameObject.Find(gazoName);

        SpriteRenderer sr = go.GetComponent<SpriteRenderer>();

        sr.sprite = sp;

    }

 

⑤スプライトをImageへ

    void setSpriteE(Sprite sprite, string imName) {

        GameObject go = GameObject.Find(imName);

        Image im = go.GetComponent<Image>();

        im.sprite = sprite;

    }

 

⑥スプライトを画像のGameObjectへ

    void setSpriteF(Sprite sprite, GameObject go) {

        SpriteRenderer sr = go.GetComponent<SpriteRenderer>();

        sr.sprite = sprite;

    }

 

⑦画像のGameObjectから画像のGameObjectへ

    void setSpriteG(GameObject go1, GameObject go2) {

        SpriteRenderer sr1 = go1.GetComponent<SpriteRenderer>();

        SpriteRenderer sr = go2.GetComponent<SpriteRenderer>();

        sr.sprite = sr1.sprite;

    }

 

⑧画像のスプライトを画像のGameObjectへ

    oid setSpriteH(string gazouName, GameObject go) {

        Sprite sp = getSprite(gazouName);

        setSpriteF(sp, go);

    }

 

GameObject.Find()は実行に時間がかかるので、あらかじめ(Start()ルーチンとかで)GameObjectを取得しておき、それを引数にして関数を書き直せばよりよいでしょう。

 

最後に画像からスプライトを取り出す方法です。

 

⑨画像のスプライトを得る

    Sprite getSprite(string gazoName) {

        GameObject go = GameObject.Find(gazoName);

        SpriteRenderer sr = go.GetComponent<SpriteRenderer>();

        return sr.sprite;

    }

 

スプライトはSprite.Create()関数でも作れます。場合によってはこれを使うこともあるでしょう。こうして得たスプライトを上のsetSpriteD(), setSpriteE(), setSpriteF()で利用できます。