kamihi のブログ

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

UnityでMinecraft風ゲームを作る その9「木を生やす」

今回は「木を生やす」です。


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

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


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

木が生えてますね(・v・)

注意:葉はまだすぐに壊れません。


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

  • Chunk.cs 木を生やすよう変更
  • ChunkManager.cs チャンクの初期化→木を生やす(追加)→メッシュの生成
  • EnumData.cs 変更なし
  • PlayerControl.cs 変更なし
  • TargetControl.cs 変更なし

チャンク表示のタイミングで木を生やしています(ブロックを更新している)。

        //まだ木を生やしていない状態の時呼ばれる、Seed値を決めたRandom関数とパーリンノイズで木を生やす位置を決める
        public void Decoration()
        {
            int randomCount = indexX * 100000 + indexZ * ChunkManager.worldSeed;
            for (int x = 0; x < ChunkManager.chunkWidth; x++)
            {
                for (int z = 0; z < ChunkManager.chunkWidth; z++)
                {

                    float tmpx = (x + indexX * ChunkManager.chunkWidth) + ChunkManager.worldSeed;
                    float tmpz = (z + indexZ * ChunkManager.chunkWidth) + ChunkManager.worldSeed;
                    float noise = Mathf.PerlinNoise(tmpx / 32, tmpz / 32) * 12;
                    int y = (int)(noise) + 6;

                    System.Random rnd = new System.Random(randomCount);
                    if (rnd.Next(0,300) == 0)
                    {
                        ChangeBlock(x, y, z, 5);
                        ChangeBlock(x, y + 1, z, 5);
                        ChangeBlock(x, y + 2, z, 5);
                        ChangeBlock(x, y + 3, z, 5);
                        ChangeBlock(x + 1, y + 3, z + 1, 6);
                        ChangeBlock(x + 1, y + 3, z - 1, 6);
                        ChangeBlock(x - 1, y + 3, z + 1, 6);
                        ChangeBlock(x - 1, y + 3, z - 1, 6);
                        ChangeBlock(x + 1, y + 3, z + 0, 6);
                        ChangeBlock(x + 0, y + 3, z + 1, 6);
                        ChangeBlock(x - 1, y + 3, z + 0, 6);
                        ChangeBlock(x - 0, y + 3, z - 1, 6);
                        ChangeBlock(x, y + 4, z, 5);
                        ChangeBlock(x + 1, y + 4, z + 1, 6);
                        ChangeBlock(x + 1, y + 4, z - 1, 6);
                        ChangeBlock(x - 1, y + 4, z + 1, 6);
                        ChangeBlock(x - 1, y + 4, z - 1, 6);
                        ChangeBlock(x + 1, y + 4, z + 0, 6);
                        ChangeBlock(x + 0, y + 4, z + 1, 6);
                        ChangeBlock(x - 1, y + 4, z + 0, 6);
                        ChangeBlock(x - 0, y + 4, z - 1, 6);

                        ChangeBlock(x + 2, y + 4, z + 0, 6);
                        ChangeBlock(x + 2, y + 4, z + 1, 6);
                        ChangeBlock(x + 2, y + 4, z - 1, 6);

                        ChangeBlock(x - 2, y + 4, z + 0, 6);
                        ChangeBlock(x - 2, y + 4, z + 1, 6);
                        ChangeBlock(x - 2, y + 4, z - 1, 6);

                        ChangeBlock(x + 0, y + 4, z + 2, 6);
                        ChangeBlock(x + 1, y + 4, z + 2, 6);
                        ChangeBlock(x - 1, y + 4, z + 2, 6);

                        ChangeBlock(x + 0, y + 4, z - 2, 6);
                        ChangeBlock(x + 1, y + 4, z - 2, 6);
                        ChangeBlock(x - 1, y + 4, z - 2, 6);

                        ChangeBlock(x, y + 5, z, 5);
                        ChangeBlock(x + 1, y + 5, z + 1, 6);
                        ChangeBlock(x + 1, y + 5, z - 1, 6);
                        ChangeBlock(x - 1, y + 5, z + 1, 6);
                        ChangeBlock(x - 1, y + 5, z - 1, 6);
                        ChangeBlock(x + 1, y + 5, z + 0, 6);
                        ChangeBlock(x + 0, y + 5, z + 1, 6);
                        ChangeBlock(x - 1, y + 5, z + 0, 6);
                        ChangeBlock(x - 0, y + 5, z - 1, 6);

                        ChangeBlock(x + 2, y + 5, z + 0, 6);
                        ChangeBlock(x + 2, y + 5, z + 1, 6);
                        ChangeBlock(x + 2, y + 5, z - 1, 6);

                        ChangeBlock(x - 2, y + 5, z + 0, 6);
                        ChangeBlock(x - 2, y + 5, z + 1, 6);
                        ChangeBlock(x - 2, y + 5, z - 1, 6);

                        ChangeBlock(x + 0, y + 5, z + 2, 6);
                        ChangeBlock(x + 1, y + 5, z + 2, 6);
                        ChangeBlock(x - 1, y + 5, z + 2, 6);

                        ChangeBlock(x + 0, y + 5, z - 2, 6);
                        ChangeBlock(x + 1, y + 5, z - 2, 6);
                        ChangeBlock(x - 1, y + 5, z - 2, 6);

                        ChangeBlock(x, y + 6, z, 5);
                        ChangeBlock(x + 1, y + 6, z + 1, 6);
                        ChangeBlock(x + 1, y + 6, z - 1, 6);
                        ChangeBlock(x - 1, y + 6, z + 1, 6);
                        ChangeBlock(x - 1, y + 6, z - 1, 6);
                        ChangeBlock(x + 1, y + 6, z + 0, 6);
                        ChangeBlock(x + 0, y + 6, z + 1, 6);
                        ChangeBlock(x - 1, y + 6, z + 0, 6);
                        ChangeBlock(x - 0, y + 6, z - 1, 6);
                        ChangeBlock(x, y + 7, z, 6);
                        ChangeBlock(x + 1, y + 7, z + 0, 6);
                        ChangeBlock(x + 0, y + 7, z + 1, 6);
                        ChangeBlock(x - 1, y + 7, z + 0, 6);
                        ChangeBlock(x - 0, y + 7, z - 1, 6);
                        ChangeBlock(x, y + 8, z, 6);

                    }
                    randomCount += y;
                }
            }
            decoration = true;
        }

木を生やす位置は、シード値を決めたRandom関数とパーリンノイズで決めています。長々とChangeBlockしています。

ブロック更新時、毎回メッシュを生成するのをやめ、 refreshフラグを追加し、後でメッシュを更新するようしました。 (木を生やす際、ブロックの更新をたくさんするため)

今回は以上になります。

次回は草を生やします。