スクリプトでspriteオブジェクトにテクスチャを貼 C#


下記のサイトを参考に、3Dのオブジェクト(sprite)にスクリプトでテクスチャを貼ってみた。
スクリプト上で貼るので、ゲーム中の任意のタイミングで貼り替えることができるかと思われ。
また、テクスチャ単体で貼るのではなく、1枚のテクスチャを分割したモノを貼っつけるので試行錯誤。
 

参考

◆Unity - スクリプトでテクスチャを貼る~C# http://dennou-note.blogspot.jp/2014/01/unity_20.html
◆画像を分割で使う方法(SpriteMode:Multiple) http://whitecatoriented.blog.fc2.com/blog-entry-16.html
◆Unity - 続:C#クラスのインスタンス化 http://dennou-note.blogspot.jp/2014/01/unity-c_20.html

spriteオブジェクトにテクスチャを貼る

・テクスチャを貼るspriteオブジェクトを用意(※今回はSpriteObjectという名前で作成)
・テクスチャ用の画像形式ファイルを用意する(※今回使用したのはpngだが、jpgとかでもOKかと)
・上記ファイルを Assets/Resources/Textures フォルダ内に配置する。(Resources フォルダ等が無ければ新規で作成しておく
 

 例: Assets/Resources/Textures/gazou.png
 

※ちなみに、後から確認しやすいようにTexturesフォルダを作成して、その中にファイルを置いたが、
別に Resources フォルダの直下にファイルを置いてしまっても問題なく呼び出しできる。(定数定義の場所指定時に記述を間違えないように注意)

 

スクリプト記述の順番としては

定数定義(画像の置き場所を指定する。Resources以下を読み込む設定っぽい。ファイル拡張子の表記は不要)
定数用の型宣言(型指定して宣言するだけ。)
インスタンス化(定数を利用できるようにする記述。今回はジェネリックスとかいうやつで)
spriteオブジェクトを探してtarget変数として設定(今回はSpriteObjectって名前のオブジェクトとする)
spriteコンポーネントの取得
テクスチャの貼り付け・貼り替え

    ↓

const string BASE_TEXTURE = "Textures/gazou";
Texture BASE_TEXTURE;
BASE_TEXTURE = Resources.Load<Texture>(BASE_TEXTURE);
GameObject target = GameObject.Find("SpriteObject");
SpriteRenderer spriteOb = target.GetComponent<SpriteRenderer>();
spriteOb.sprite = BASE_TEXTURE;


がしかし

テクスチャが1枚で、貼りかえる対象も1個とかなら上記でOKなんですが、
今回は分割した複数のテクスチャを貼るのでチト違う記述が必要。

 

テキトーに要件定義

・定数定義するテクスチャは1枚のままでOK。(今回は、SpriteMode:Multiple で3つに分けた場合を想定)
・分割したテクスチャ画像を一括で読み込んで配列にしておく。
・テクスチャを貼りたいゲームオブジェクトも配列にしておく(タグつけておくと楽かも)。
 ⇒てことで各ゲームオブジェクトにタグを設定しておく。(テクスチャ貼りたいオブジェクトだけでOK)
・どのオブジェクトにこのテクスチャを貼りたい、とかあると思うので、変数に数字を入れといて照合して貼る。
 ⇒てことで各ゲームオブジェクトに別スクリプト(例:SpriteObjectNumber)をつけて、変数に数字を設定。
・ゲームオブジェクト配列をforeachで回すときにコンポーネント取得してスプライトを貼る。

 

スクリプト(C#)

てことでこんな感じ

     ↓

TextureManager.cs
using UnityEngine;
using System.Collections;

public class TextureManager : MonoBehaviour
{
   //定数定義
    const string BASE_TEXTURE = "Textures/gazou";

    void Start () {

    }

    void Update () {

    }

    public void TextureSticker() {
        //テクスチャを貼りたいゲームオブジェクトの配列生成(タグ名は「SpriteObject」)
        GameObject[] spriteObjects = GameObject.FindGameObjectsWithTag("SpriteObject");

        //スプライト画像の配列生成(テクスチャ画像の読み込み)
        Sprite[] sprites = Resources.LoadAll<Sprite>(BASE_TEXTURE);

        foreach (GameObject sp in spriteObjects) {
            //ゲームオブジェクトのスプライトレンダラ設定を取得
            SpriteRenderer spObRender = sp.GetComponent<SpriteRenderer>();

            //別スクリプトの変数を取得
            //(スクリプト名は「SpriteObjectNumber」、変数名は「spObNum」)
            int textureUniqueNumber = sp.GetComponent<SpriteObjectNumber>().spObNum;


            //switch文で、textureUniqueNumber の数字によって処理(貼るテクスチャ)を変える
            switch(textureUniqueNumber)
            {
            case 1: 
                spObRender.sprite = sprites[0];
                break;
            case 2:
                spObRender.sprite = sprites[1];
                break;
            case 3:
                tarSpr.sprite = sprites[2];
                break;
            }

        }
    }
}

 

SpriteObjectNumber スクリプトの記述例

SpriteObjectNumber.cs
using UnityEngine;
using System.Collections;

public class SpriteObjectNumber : MonoBehaviour
{
    //変数もメソッドもpublicにしとかないと外部から読めないので注意。(継承した場合を除く?)

    public int spObNum;

    public void Start () {
        //spObNum = 1; //固有値 他の2つには 2, 3 を設定しとく
    }

    //…これオブジェクトの数が多いと、一個一個スクリプト設定してくのはたいへんだなぁ。
}

 

細かいとこが間違ってるかもなので、参考程度に見ていただけますと幸いです。

※上記スクリプトの "public void Start()" での値の設定はいらないっぽいのでコメントアウトしました。