kamihi のブログ

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

UnityでMinecraft風ゲームを作る その11「水を流す」

今回は「水を流す」です。


Googleドライブに保存しておきました。 そこからダウンロードしてみてください。

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

実行するにはレイヤーの設定を行ってください

「Clear」レイヤーの追加

f:id:zekutasiki:20190106135434p:plain

「Clear」レイヤーと「Ignore Raycast(player)」レイヤーの衝突をなくす

f:id:zekutasiki:20190106135450p:plain


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

ブロックの配置が水になっています。

水を配置すると流れると思います。

ついでに原木を消すと葉が消える処理も追加しました。


f:id:zekutasiki:20190113080941p:plain

上の画像のように砂の境界が見えやすいと思います。気になる方はEdit->Project Setting->QualityのAnti AliasingをDisabledにしてみてください


chunk.cs

public List<string> activeBlocks = new List<string>();

アクティブブロックのリストを追加しました。これは現在変化する可能性のあるブロックのリストです

EnumData.cs

            //木ブロック
            blockNo = 5;
            blockList.Add(blockNo, new BlockDatabase());
            blockList[blockNo].texture = new int[6] { 5, 5, 6, 6, 6, 6 };
            blockList[blockNo].impact = 3;

インパクトというのが追加になっていますね。ブロックが変更になった時、インパクトの範囲分、アクティブブロックのリストに追加しています

chunk.cs

        public void Active()
        {
            for (int i = activeBlocks.Count - 1; i >= 0; i--)
            {
                string[] tmpsp = activeBlocks[i].Split('_');
                int tmpBlock = GetBlockTypeSimple(int.Parse(tmpsp[0]), int.Parse(tmpsp[1]), int.Parse(tmpsp[2]));
                if (BlockManager.blockList[tmpBlock].activeProcess == null)
                {
                    activeBlocks.RemoveAt(i);
                }
            }

            List<string> tmp = new List<string>(activeBlocks);
            activeBlocks = new List<string>();


            for (int i = tmp.Count - 1; i >= 0; i--)
            {
                string[] tmpsp = tmp[i].Split('_');
                int tmpBlock = GetBlockTypeSimple(int.Parse(tmpsp[0]), int.Parse(tmpsp[1]), int.Parse(tmpsp[2]));
                if(BlockManager.blockList[tmpBlock].activeProcess != null)
                {
                    if(BlockManager.blockList[tmpBlock].activeProcess(int.Parse(tmpsp[0]), int.Parse(tmpsp[1]), int.Parse(tmpsp[2]), this))
                    {
                        activeBlocks.Add(tmp[i]);
                    }
                }
            }
        }

この辺りでブロックのactiveProcessを呼んでいます。

簡単な説明ですが、以上になります。

次回は未定です。