kamihi のブログ

作成したゲームの情報や作り方を掲載します

UnityでMinecraft風ゲームを作る その5「テクスチャを貼る」

今回はテクスチャを貼っていこうと思います。(実験的公開版よりテクスチャの読み込み方を改善しています)


ソースや設定方法は長くなるので、Googleドライブに保存しておきました。 そこからダウンロードしてみてください。

UnityでMinecraft風ゲームを作る - Google ドライブ


f:id:zekutasiki:20190103095114p:plain
実行結果

さらにマイクラっぽくなりましたね。


スクリプトの主な変更は以下の通りです

  • Chunk.cs uvListを追加、BlockDatabaseのtextureの番号から座標を計算し面に貼り付ける処理を追加
  • ChunkManager.cs マテリアルの名前をblockMaterialに変更
  • EnumData.cs BlockManager、BlockDatabaseを追加
  • PlayerControl.cs 変更なし
  • TargetControl.cs 変更なし

Chunk.csの変更箇所

        List<Vector2> uvList = new List<Vector2>();

uvの情報を格納するリストを追加しました

            mesh.SetUVs(0, uvList);

Meshにuvをセットする処理を追加

void AddFaceList(int block, Direction direction)
        {
            //テクスチャの座標を計算
            float px = BlockManager.blockList[block].texture[(int)direction] % 32;
            float py = 0;
            uvList.Add(new Vector2((0 + px) / 32F, py / 32F));
            uvList.Add(new Vector2((1 + px) / 32F, py / 32F));
            uvList.Add(new Vector2((1 + px) / 32F, (1 + py) / 32F));
            uvList.Add(new Vector2((0 + px) / 32F, (1 + py) / 32F));

            faceList.Add(faceCount + 0);
            faceList.Add(faceCount + 1);
            faceList.Add(faceCount + 3);
            faceList.Add(faceCount + 1);
            faceList.Add(faceCount + 2);
            faceList.Add(faceCount + 3);

            faceCount += 4;
        }

AddFaceListに渡すのもが増えました。テクスチャの座標を計算してuvListに追加しています。画像に対するtexture番号は左下から始まります。今回は一番下の列しか使わないためpyは0にしました。


EnumData.csの変更箇所

    public class BlockDatabase
    {
        //Top, Bottom, Right, Left, Front, Backの順で格納
        public int[] texture;
    }

    static public class BlockManager
    {
        static public Dictionary<int, BlockDatabase> blockList = new Dictionary<int, BlockDatabase>();

        static public void Init()
        {
            //ブロックエリア
            //未定義
            int blockNo = 0;
            blockList.Add(blockNo, new BlockDatabase());
            blockList[blockNo].texture = new int[6] { 0, 0, 0, 0, 0, 0 };
            //空気
            blockNo = 1;
            blockList.Add(blockNo, new BlockDatabase());
            blockList[blockNo].texture = new int[6] { 0, 0, 0, 0, 0, 0 };
            //草ブロック
            blockNo = 2;
            blockList.Add(blockNo, new BlockDatabase());
            blockList[blockNo].texture = new int[6] { 1, 3, 2, 2, 2, 2 };
            //土ブロック
            blockNo = 3;
            blockList.Add(blockNo, new BlockDatabase());
            blockList[blockNo].texture = new int[6] { 3, 3, 3, 3, 3, 3 };
            //石ブロック
            blockNo = 4;
            blockList.Add(blockNo, new BlockDatabase());
            blockList[blockNo].texture = new int[6] { 4, 4, 4, 4, 4, 4 };
        }
    }

Init()はChunkManager.csのはじめに呼んでいます。呼ばれたらblockListを生成しています。BlockDatabaseのtextureは画像の位置になります。土ブロック、石ブロックは追加してありますが、今回使用しません。


次回はブロックを置くところを作成したいと思います。