Unityの立方体のuvをいじくる

Visual Studio Tools for Unity 1.9 公開されましたね.
UnityのC#Visual studio で書けるってすばらしい.
えっ? Express edition では使えない!? (゚д゚)!

orz

気を取り直して,今日の本題です. Unity の立方体の各面に,それぞれ別の絵を表示させたい時ってありすよね.
例えば,サイコロとか.
別のソフトで,テクスチャ込の立方体モデルを作ってそれを読み込ませるのが順当な手だとは思うんですが,それはめんどくさい o(`ω´*)oプンスカプンスカ!!
というわけで,C#でメッシュのuvをいじってなんとかしてみたいと思います.
(そっちのがめんどくさいだろというツッコミはスルー

UnityのCubeは六面体,当然ですが,面が6個あります. その面は4つの頂点を持っており,それぞれの面の頂点を別物ととらえると6x4=24個の頂点があります.
この24頂点のuv値を,表示させたい画像に合わせて変更してあげればいいわけです.

それぞれの頂点は,下図のような関係にあると思われます.
(まちがってたらごめんんさい 

f:id:rinor:20140808161155p:plain

この図を参考に,スクリプト上で,gameObjectから取得したメッシュのUVを書き換えてあげればOKです.
ソースコードは以下のような感じにして,下記のようなサイコロ画像を読み込ませればたぶん大丈夫です.

f:id:rinor:20140808164621p:plain

using UnityEngine;

public class UVChange : MonoBehaviour
{

    Vector2[] uv = new Vector2[24];

    void Awake()
    {
        // 1の面
        uv[2].x = 0.0f; uv[2].y = 0.0f;
        uv[3].x = 1.0f / 6.0f; uv[3].y = 0.0f;
        uv[0].x = 0.0f; uv[0].y = 1.0f;
        uv[1].x = 1.0f / 6.0f; uv[1].y = 1.0f;

        // 2の面
        uv[4].x = 1.0f / 6.0f; uv[4].y = 0.0f;
        uv[5].x = 2.0f / 6.0f; uv[5].y = 0.0f;
        uv[8].x = 1.0f / 6.0f; uv[8].y = 1.0f;
        uv[9].x = 2.0f / 6.0f; uv[9].y = 1.0f;

        // 3の面
        uv[23].x = 2.0f / 6.0f; uv[23].y = 0.0f;
        uv[21].x = 3.0f / 6.0f; uv[21].y = 0.0f;
        uv[20].x = 2.0f / 6.0f; uv[20].y = 1.0f;
        uv[22].x = 3.0f / 6.0f; uv[22].y = 1.0f;

        // 4の面
        uv[19].x = 3.0f / 6.0f; uv[19].y = 0.0f;
        uv[17].x = 4.0f / 6.0f; uv[17].y = 0.0f;
        uv[16].x = 3.0f / 6.0f; uv[16].y = 1.0f;
        uv[18].x = 4.0f / 6.0f; uv[18].y = 1.0f;

        // 5の面
        uv[15].x = 4.0f / 6.0f; uv[15].y = 0.0f;
        uv[13].x = 5.0f / 6.0f; uv[13].y = 0.0f;
        uv[12].x = 4.0f / 6.0f; uv[12].y = 1.0f;
        uv[14].x = 5.0f / 6.0f; uv[14].y = 1.0f;

        // 6の面
        uv[6].x  = 5.0f / 6.0f; uv[6].y  = 0.0f;
        uv[7].x  = 6.0f / 6.0f; uv[7].y  = 0.0f;
        uv[10].x = 5.0f / 6.0f; uv[10].y = 1.0f;
        uv[11].x = 6.0f / 6.0f; uv[11].y = 1.0f;
    }



    // Use this for initialization
    void Start()
    {
        MeshFilter mf = gameObject.GetComponent<MeshFilter>();
        mf.mesh.uv = uv;
    }

    // Update is called once per frame
    void Update()
    {

    }
}