マイクラで雪合戦ゲームを作る


狙い

  • カスタム雪玉を当てられた人は、自身のスコアが-1されるというゲームシステムを作りたい

前回振り返り

  • カスタム雪玉の作り方と、投げた後に雪玉で発生する効果についてコマンドを使って設定できるようにした

全体設計図(mermaid)

  • ゲーム開始時の初期設定ブロック、雪玉補給用の都度補給ブロック、カスタム雪玉の効果設定用の常時作動ブロックの3つのグループで構成される

各ブロックの設定コマンド一覧

ステップ説明コマンド例 (例として)実行方法・タイミング
0. スコアボードのリセット既存のスコアをリセットし、クリーンな状態にする/scoreboard players reset @a Life一括実行(ゲーム開始前に実行)<br>※Impulse (Needs Redstone)
1. スコアボードの初期設定プレイヤーのライフ管理用 Objective「Life」と、ゲーム開始用トリガー Objective「GameStart」を作成する/scoreboard objectives add Life dummy "ライフ"<br>/scoreboard objectives add GameStart trigger "ゲーム開始"一括実行(サーバー起動時・データパックロード時)<br>※Impulse (Needs Redstone)
2. ゲーム開始トリガー実行プレイヤーまたは管理者が /trigger コマンドでゲーム開始の合図を送る/trigger GameStart set 1個別実行(必要に応じ手動実行)
3. プレイヤーの初期化全プレイヤーのライフを初期値(例:10)に設定し、ライフをサイドバーに表示する/scoreboard players set @a Life 10<br>/scoreboard objectives setdisplay sidebar Life一括実行(ゲーム開始時にまとめて実行)<br>※Impulse (Needs Redstone)
4. 既存エンティティのクリア前回分の残骸(カスタム雪玉)の雪玉エンティティを削除してクリーンな状態にする/kill @e[type=minecraft:snowball,nbt={Item:{tag:{display:{Name:'{"text":"カスタム雪玉"}'}}}}]一括実行(ゲーム開始前に実行)<br>※Impulse (Needs Redstone)
5. ゲーム開始の通知チャットメッセージと音声で全プレイヤーにゲーム開始を通知する/tellraw @a {"text":"ゲームスタート!","color":"gold"}<br>/playsound minecraft:entity.player.levelup master @a ~ ~ ~ 1 1一括実行(開始関数内でまとめて実行)<br>※Impulse (Needs Redstone)
6. カスタム雪玉の配布各プレイヤーにカスタム雪玉(名前付き雪玉)を配布する。<br>(投射体となる雪玉が後の判定対象となる)/give @p minecraft:snowball{display:{Name:'{"text":"カスタム雪玉"}'}} 1一括実行または個別実行(ゲーム開始時に実行)<br>※Impulse (Needs Redstone)
6a. カスタム雪玉にタグ付け投擲されたカスタム雪玉に識別用タグ「customSnowball」を付与する。<br>(CustomName の情報が投射体に引き継がれない場合に対応)/execute as @e[type=minecraft:snowball,nbt={Item:{tag:{display:{Name:'{"text":"カスタム雪玉"}'}}}}] unless entity @s[tag=customSnowball] run tag @s add customSnowball常時実行(リピート型コマンドブロックまたは定期実行関数)<br>※Repeating (Always Active)
7. カスタム雪玉の着弾検知 & スコア減少着弾(inGround:1b)したカスタム雪玉(タグ「customSnowball」付き)が、半径1ブロック以内のプレイヤーに命中した場合、ライフを1減少させる/execute as @e[type=minecraft:snowball,tag=customSnowball,nbt={inGround:1b}] at @s if entity @a[distance=..1] run scoreboard players remove @a[distance=..1] Life 1常時実行(リピート型または定期実行関数)<br>※Repeating (Always Active)
8. 着弾地点でのエフェクト発生着弾地点にパーティクルやエフェクト(例:happyVillager)を発生させ、視覚的なフィードバックを与える/execute as @e[type=minecraft:snowball,tag=customSnowball,nbt={inGround:1b}] at @s run summon minecraft:area_effect_cloud ~ ~ ~ {Duration:20,Particle:"happyVillager"}常時実行(リピート型または定期実行関数)<br>※Repeating/Chain (Always Active)
9. 着弾後の雪玉除去判定済みの雪玉(タグ「customSnowball」付き、着弾済み)を削除し、同一雪玉による複数回の処理を防止する/kill @e[type=minecraft:snowball,tag=customSnowball,nbt={inGround:1b}]常時実行(リピート型または定期実行関数)<br>※Chain (Always Active)

実際の動作

振り返り

  • 雪合戦で使えるスコアボードシステムの実装ができた。雪合戦以外にも応用が効きそうなテクニックだと感じた。
  • 雪玉の当たり判定が渋い。足元ピンポイントに投げないと当たらないのでこれは設定を調整する必要がある。
  • 今後はコマンドブロックを使わないシステムの実装をしてみたい
  • 全く別のゲームシステムを実装できないか検討したい。 e.g. ポケモンシステム
,