6 列 × 12 段の盤面に、赤・緑・青の光る玉が 2〜4 個のかたまりで落ちてきます。 同じマスに 3 色そろえると白になって消えます。
| 重ねると | 結果 |
|---|---|
| 赤 + 緑 | 黄(あと青で白) |
| 緑 + 青 | シアン(あと赤で白) |
| 赤 + 青 | マゼンタ(あと緑で白) |
| 同じ色 | 光を失って灰色のおじゃま玉になる |
かたまりは形を保ったまま積まれます。混ざるのは各列のいちばん下の玉だけで、その上の玉は光ったまま乗ります。
白ができると、上下左右に隣り合った灰色の玉が浄化されて消えます。空いたマスに上の玉が落ち、そこでまた白が生まれれば連鎖。
制限時間は 60 秒。スコアは 白 × 100 × 連鎖数 + 浄化 × 30 なので、連鎖を狙うほど伸びます。 積み切ってもその場で終わります。
- A / D、または ← / → … 落とす列を選ぶ
- Space(↓ / Enter でも可) … 落とす
- マウスクリックでも、その列に直接落とせます
落とす前に出る点線の輪が、置いた結果を先に見せてくれます。白い輪なら白ができ、灰色の輪と × なら濁ります。
画像も音声ファイルも持っていません。 盤面の玉・着地予測・炸裂エフェクトは OrbSpriteFactory が実行時に Texture2D へ描き、効果音 24 本は ProceduralAudio がサイン波を積んで合成します。WebGL のビルドサイズを抑えるためです。
例外は画面 UI の PNG 3 枚(タイトル・ルール説明・リザルト)だけで、日本語の組版はコード生成では作れないため画像にしています。
玉は「発光するガラス玉」として描いています。球面の法線から拡散反射とスペキュラを作り、内部発光・縁の明線・底の三日月(ガラスを通った光が焦点を結ぶ弧)を重ねています。濁った玉だけは発光も光暈も持たず、周囲の光を鈍く反射するだけです。
効果音は A の純正長三和音(赤 440 / 緑 550 / 青 660 Hz = 4:5:6)に閉じ込めてあります。倍音が整数比で噛み合ってうなりが出ないので、3 音が 1 つの響きに溶けます。濁りの音だけが和音の外(495 Hz)にあり、見なくても「光を失った」と分かります。
Assets/Scripts/Core/ はゲームルールだけを持ち、UnityEngine を参照しません。Unity を起動せずにテストを回せるので、ルールの検証が速く回ります。
主要なファイルだけ抜き出したものです。
Assets/Scripts/
├── Core/ ゲームルール(UnityEngine 非依存)
│ ├── Board 盤面。落下・混色・濁り・浄化・重力
│ ├── ColorMixer 光の加法混色の判定
│ ├── ColorSupply 次の色の抽選。盤面を見て重みを変える
│ ├── Piece 落ちてくる玉のかたまり
│ ├── PieceShapes かたまりの形 17 種
│ └── LightColor RGB のビットフラグ(R=1, G=2, B=4 → 7 で白)
├── View/
│ ├── GameController 進行。Unity のライフサイクルと 1 手の順序
│ ├── GameHud 画面の文字と図(OnGUI)
│ ├── GameInput キーボードとマウスの読み取り
│ ├── PiecePresentation 待機中のピース・ゴースト・NEXT
│ ├── DropPresentation 落下・着地・白の炸裂
│ ├── BoardRenderer 盤面に置かれた玉とグリッド
│ ├── OrbSpriteFactory 玉のスプライトをコードで描く
│ ├── GameColors 配色と発光の強さ
│ └── LandingRows 着地段の計算(ゴーストと落下で共有)
└── Audio/
├── ProceduralAudio 波形合成の基盤
├── SoundLibrary 効果音 24 本の設計
└── GameAudio 再生と発音管理
Assets/Editor/ 開発ツール(ビルドに含まれない)
├── BuildTools WebGL ビルドと設定の適用
├── PreviewCapture エディタを開かずに画面を PNG で書き出す
├── OrbProbe 玉の輝度を測って明るさの序列を検証する
├── AudioProbe 効果音を WAV に書き出して数値で検分する
└── EffectPreview 演出用スプライトを並べて確認する
Tests/CoreTests.cs ルールのテスト 94 件
Tools/serve.py WebGL ビルドを手元で開くための配信スクリプト
Unity 6000.0.45f1(WebGL モジュール)で作っています。
- Unity Hub でこのフォルダを開く(6000.0.45f1 / WebGL モジュール)
Assets/Scenes/Main.unityを開いて Play
玉のスプライトも効果音も実行時に生成するので、初回の Play まで待ち時間があります。
Unity を起動せず、同梱の Roslyn でコンパイルして走らせます(94 件)。
UNITY=/Applications/Unity/Hub/Editor/6000.0.45f1/Unity.app/Contents # macOS
MONO="$UNITY/MonoBleedingEdge/bin/mono"
CSC="$UNITY/MonoBleedingEdge/lib/mono/msbuild/Current/bin/Roslyn/csc.exe"
"$MONO" "$CSC" -langversion:latest -nologo -out:coretests.exe \
Assets/Scripts/Core/*.cs Tests/CoreTests.cs
"$MONO" coretests.exeTests/CoreTests.cs は Assets/ の外にあるので、ゲームのビルドには含まれません。
以下は macOS の例です。UNITY_BIN は環境に合わせて読み替えてください。
UNITY_BIN=/Applications/Unity/Hub/Editor/6000.0.45f1/Unity.app/Contents/MacOS/Unity
"$UNITY_BIN" -batchmode -quit -projectPath . \
-executeMethod Masshiro.EditorTools.BuildTools.BuildWebGL \
-buildPath Build/WebGLBuildTools.Configure が画面サイズ(960×600)・Gzip 圧縮・例外設定をまとめて適用します。
decompressionFallback を false にしているので、出力は .data.gz 形式です。Content-Encoding: gzip を返すサーバーでないと起動しません(素の python3 -m http.server では読み込めない)。同梱のスクリプトを使ってください。
python3 Tools/serve.py Build/WebGL 8080エディタを開かずに確認できます。
# 盤面を PNG で書き出す(-nographics は付けないこと。描画できず真っ黒になる)
"$UNITY_BIN" -batchmode -quit -projectPath . \
-executeMethod Masshiro.EditorTools.PreviewCapture.Capture \
-outputPath preview.png -width 2560 -height 1440
# 玉の輝度を測る。原色 < 中間色 < 白、濁りが最暗、を検証する
"$UNITY_BIN" -batchmode -quit -projectPath . \
-executeMethod Masshiro.EditorTools.OrbProbe.Run -outputPath orbs.tsv
# 効果音を WAV に書き出し、長さ・振幅・スペクトルを表にする
"$UNITY_BIN" -batchmode -quit -projectPath . \
-executeMethod Masshiro.EditorTools.AudioProbe.Run -outputDir sounds/OnGUI の内容は PreviewCapture に写らないので、UI の確認は WebGL ビルドで行います。
PreviewCapture に -saveScene を付けると Assets/Scenes/Main.unity を作り直します。シーンの構成(GameSceneBuilder)を変えたときだけ使ってください。
MIT License。詳細は LICENSE を参照してください。
コード・画像・音(の生成コード)すべてを含みます。
Unity 製ゲームジャム unity1week(お題「しろ」)への投稿作を、個人の趣味として制作したものです。所属する組織とは関係ありません。
