Skip to content

Art-5: 環境・ステージビジュアルデザイン

4 テーマ ビジュアル早見(SVG)

全ダンジョンテーマのビジュアル比較。詳細コンセプトアートは Art-Concept 参照。

Data Grid

Neon Arcade

Glitch Core

Void Rift

方向性

Minecraft Dungeons 風のボクセル環境 × シンセウェーブネオン

環境レイヤー(ロビー・ダンジョン)は 1x1x1 のブロック(キューブ) を基本単位としたタイル構成で構築する。キャラクターレイヤー(FF7ローポリ)とは異なる系統だが、フラットシェーディング・ネオンアクセント・トップダウン55度俯瞰カメラによって統一感を保つ。

2層構造の再確認(Art-1)

  • キャラクター層: FF7ローポリ(3頭身デフォルメ、手続き的アニメーション)
  • 環境層: Minecraft Dungeonsボクセル(1x1x1ブロック、InstancedMesh)

本ドキュメントは 環境層 のビジュアル仕様を扱う。

ブロック基本仕様

ブロックサイズ・単位

要素備考
ブロックの1辺1.0 unitMinecraft Dungeonsと同じく 1x1x1
標準部屋サイズ6x6 〜 18x18 ブロックdungeon.md 準拠
標準天井高4 ブロック(4.0 units)俯瞰のため視認性優先
壁厚1 ブロック(壁は実体)外側は発光エッジで装飾
キャラクター基準身長1.8 units(約2ブロック)3頭身デフォルメの都合

ブロックのバリエーション(全テーマ共通の構造)

カテゴリ役割特性
Base Block床・壁の大部分を構成テーマの基調色、フラット塗り
Accent Block要所に混ぜてパターンを作る基調色の明度違い or 彩度違い
Special Block破壊可能・仕掛けテーマ固有のメカニカル意匠
Neon-lit Block発光ブロック(ライン・看板)MeshBasicMaterial + Bloom対応

Three.js実装の核

全ブロックは共通の BoxGeometry(1, 1, 1) を 1 つだけ生成し、InstancedMesh に色・位置・回転をバインドして描画する。 DrawCallはテーマあたり 4〜6(Base / Accent / Special / Neon / Destructible / Prop)に収まることを目標とする。

ロビー空間

ロビーは帰還・編成・ミッション選択を行うハブ空間。落ち着いた夕暮れムードで、プレイヤーの休憩所としての印象を持たせる。

全体レイアウト

        ┌─────────────────────────────────────────────┐
        │                                             │
        │             🌌 背景: 深紫シンセ空 🌌          │
        │                                             │
        │   ╭─ Customize Zone ─╮                      │
        │   │  🪞 鏡 / 装備棚    │                      │
        │   │  アバター確認       │                      │
        │   ╰──────────────────╯                      │
        │                                             │
        │   ⬢ Central Plaza (中央広場) ⬢               │
        │   ・浮遊パーティクル                          │
        │   ・ホログラムのゲームロゴ                    │
        │                                             │
        │  🟣 Mission   🌈 Vibeverse   🔴 Revenge     │
        │  Portal      Portal         Portal          │
        │  (左)       (中央奥)      (右・条件付)  │
        │                                             │
        │   📊 Stats Terminal(自分の戦績ホログラム)   │
        │                                             │
        └─────────────────────────────────────────────┘
             サイズ: 30x30 units(約30x30ブロック)

ロビーのブロックパレット

ブロックHEX用途マテリアル
Base (床タイル)#2d1b4eメインの床ブロックMeshLambertMaterial
Accent (床ライン)#4a2d7a床模様・区画境界MeshLambertMaterial
Wall (腰壁)#1a0b2eロビー外周の腰壁MeshLambertMaterial
Neon-lit (床光帯)#ff4dff床に走るネオンラインMeshBasicMaterial + Bloom
Neon-lit (縁取り)#00e5ffプラットフォーム縁MeshBasicMaterial + Bloom
Prop (ホログラム台座)#7a5cffStats Terminal等の基部MeshLambertMaterial

エリア構成

エリア位置主な要素
Central Plaza中央 (0, 0)ホログラムロゴ、浮遊パーティクル、集合ポイント
Customize Zone左奥 (-8, -6)装備棚(ブロック柱 + 浮遊武器アイコン)、鏡(反射シェーダの代わりに青いパネル)
Mission Portal手前左 (-6, 6)紫色のリフト(後述)
Vibeverse Portal中央奥 (0, -10)虹色のリフト(後述)
Revenge Portal手前右 (6, 6)赤色のリフト(条件達成時のみ出現)
Stats Terminal右奥 (8, -6)ホログラムパネルで戦績表示

Ambient Props(雰囲気オブジェクト)

プロップビジュアル実装
浮遊パーティクル小さなシアン/マゼンタの粒が上昇THREE.Points + gradient texture
ホログラムロゴ半透明の「Rift Survivors」文字が回転Plane + AlphaBlend + ワイヤーフレーム
データストリーム壁に沿って 0/1 の文字列が下から上へ流れるカスタムシェーダ or CanvasTexture
ネオンサイン看板各ポータル上方に浮かぶピクトグラムMeshBasicMaterial + Bloom
床スキャンライン床を周期的に走る横スキャン光シェーダで時間経過と共に移動

ロビー背景(スカイ)

  • 空は 深紫グラデーション背景#1a0b2e#3d1a5e
  • 地平線付近に薄いシアンライン(シンセウェーブ定番の格子遠近)
  • 星は小さな白点を THREE.Points で約200個配置

ダンジョン4テーマ

各テーマは dungeon.md の解放条件 に準じて出現する。

テーマ解放条件基調色ムード
Data Grid初期青緑 × シアン静謐・サイバー
Neon Arcade6F〜10F帯ピンク × マゼンタ賑やか・レトロ
Glitch Core11F〜14F帯パープル × 黒(紫/緑破損)不穏・破壊的
Void Rift15Fボスフロア白 × 青(漆黒背景)神秘・浮遊

ブロックパレット俯瞰


テーマ1: Data Grid(データグリッド)

コンセプト: デジタル空間。格子状の回路パターンが床・壁を走り、シアンの発光が脈打つ。Minecraft Dungeonsの「End」ステージにサイバー色を重ねたイメージ。

ブロックパレット

種別ブロック名HEX用途マテリアル
BaseGrid Floor#0d3b4a床全般MeshLambertMaterial (roughness未指定、フラット)
AccentCircuit Tile#1a6b7a回路模様の混在タイルMeshLambertMaterial
WallData Wall#0a2a38壁ブロックMeshLambertMaterial
Neon-litLine Strip#00e5ff床・壁を走る青緑ラインMeshBasicMaterial + Bloom
SpecialNumeric Panel#4affc9数字/コードが流れるパネルCanvasTexture + emissive
DestructibleData Cache#2fe6b8データモニュメント(破壊可)MeshLambertMaterial + クラック頂点カラー

床・壁・天井マテリアル

ベース色発光特徴
#0d3b4aグリッドラインのみ #00e5ff 発光2x2 ブロックごとに十字の回路パターン
#0a2a38縦方向のライトストリップ #00e5ff一定間隔でNumeric Panelを埋め込み
天井非描画(俯瞰カメラのため省略)遠景は霧で暗転

プロップ

  • データモニュメント: 1x1x3 の浮遊する発光柱。中央に #4affc9 のコア。破壊でEXPジェム。
  • エネルギーピラー: 2x2x4 のブロック塔。上部から #00e5ff の光輪。
  • 浮遊コード粒子: THREE.Points で「0」「1」「HEX」文字の sprite が上昇。

テーマ2: Neon Arcade(ネオンアーケード)

コンセプト: 80年代アーケードゲームセンター。アーケード筐体・ネオン看板・ピンク/紫のフロア。Minecraft Dungeonsの賑やかな街区にシンセウェーブを重ねる。

ブロックパレット

種別ブロック名HEX用途マテリアル
BaseArcade Floor#2d0a4e床(チェッカー柄の暗部)MeshLambertMaterial
Base2Arcade Floor Light#4e1a7a床(チェッカー柄の明部)MeshLambertMaterial
AccentPurple Wall#6a1b9a壁基調MeshLambertMaterial
Neon-litPink Sign#ff2dd4ネオン看板ラインMeshBasicMaterial + Bloom
Neon-lit2Cyan Accent#00e5ff補色アクセントMeshBasicMaterial + Bloom
SpecialArcade Cabinet#ffe600 画面部アーケード筐体(1x1x2)CanvasTexture(古典ゲーム画面)
DestructibleCrate#8d4e1a破壊可能な木箱MeshLambertMaterial

床・壁・天井マテリアル

ベース色発光特徴
#2d0a4e / #4e1a7a縁取り #ff2dd42x2ブロックチェッカーパターン、縁にピンクライン
#6a1b9aネオンサインが埋め込み高さ3〜4ブロック、上端にシアンライン
天井非描画代わりに背景にピンク/シアン斜め格子

プロップ

  • アーケード筐体: 1x1x2 ブロック、前面にアニメ画面テクスチャ(簡易ドット絵)
  • ネオンサイン: 壁掛けの浮遊文字(「PLAY」「HI-SCORE」など)
  • 破壊可能クレート: 1x1x1 の木箱、破壊でコイン/ジェム
  • 電撃トラップ床: 通電時 #ffe600#ff2dd4 の明滅(dungeon.md 環境ハザード参照)

テーマ3: Glitch Core(グリッチコア)

コンセプト: 崩壊・バグった世界。破損ブロック、浮遊する欠片、紫の侵食ライン。Minecraft Dungeonsの「Creepy Crypt」にグリッチノイズとエラー表示を重ねる。グリッチ属性 = パープル/バイオレット(docs/gameplay/combat.md:192 準拠)。

ブロックパレット

種別ブロック名HEX用途マテリアル
BaseCorrupted Floor#0f0a2e床(欠けあり)、Deep VioletMeshLambertMaterial
AccentBroken Tile#2d1b4e崩壊した床の境界MeshLambertMaterial
WallGlitch Wall#0a0520壁基調(紫黒)MeshLambertMaterial
Neon-litCorruption Line#a855f7グリッチ属性の侵食ラインMeshBasicMaterial + Bloom
Neon-lit2Glitch Violet#9d00ffバグ表現ラインMeshBasicMaterial + Bloom
SpecialUnstable Floor#c77dff不安定床(崩壊ギミック)、明るい紫MeshLambertMaterial + 点滅
FloatingDebris Shard#4c1d95浮遊する欠片(0.3x0.3x0.3)MeshLambertMaterial

床・壁・天井マテリアル

ベース色発光特徴
#0f0a2eクラックに沿って #a855f7一部のブロックが欠落して奈落が見える
#0a0520縦に #9d00ff のグリッチストライプランダムに欠けた壁、破損面から紫光
天井非描画背景は深紫グラデーション #0a0520#2d1b4e

プロップ

  • 浮遊する欠片: 小さなブロック(0.3 scale)が宙に漂い、回転する
  • 不安定床: 踏むと3秒で崩壊、1秒前からひび割れエフェクト
  • グリッチテキスト: 壁に「ERROR」「CORRUPT」などの紫テキストが走る
  • 破損モニュメント: かつてのデータモニュメントが砕けた残骸

グリッチエフェクト演出

  • ChromaticAberration を強めに(通常の1.5倍)
  • ブロック全体がランダムに1フレーム瞬時にオフセット(シェーダで時間ベース)
  • EffectComposer に時間変動の RGB シフトを追加

テーマ4: Void Rift(ヴォイドリフト)

コンセプト: 虚空の裂け目。浮遊する岩ブロック、漆黒の床、白と青の星空背景。Minecraft Dungeonsの「End」に近いが、より抽象的で神秘的。

ブロックパレット

種別ブロック名HEX用途マテリアル
BaseVoid Stone#05050f床基調(ほぼ黒)MeshLambertMaterial
AccentFloating Rock#1a2040浮遊岩ブロックMeshLambertMaterial
EdgeRift Edge#4da6ff床端の青い縁光MeshBasicMaterial + Bloom
Neon-litStar Light#ffffff白の発光点MeshBasicMaterial + Bloom
SpecialRift Crack#8f6cff次元亀裂(床出現攻撃)カスタムシェーダ(うねり)
DestructibleVoid Crystal#a3d9ff破壊可能な青水晶MeshLambertMaterial + emissive

床・壁・天井マテリアル

ベース色発光特徴
#05050f#4da6ff島状に浮かぶ不規則な床、周囲は奈落
なし(空間が抜けている)壁の代わりに Void(漆黒 + 星空)
天井星空ドーム白点 #ffffff遠景に薄青のネビュラグラデーション

プロップ

  • 浮遊岩ブロック: 2〜4ブロックの塊が宙に漂う(移動パターンは sin 波)
  • Void Crystal: 1x1x2 の青い水晶柱、破壊でEXP
  • 次元亀裂: 床に出現する楕円の #8f6cff エフェクト(1.5秒後に攻撃発動)
  • 背景の星: THREE.Points 3000個、奥行きに応じた大きさ

ポータルオブジェクト

ロビーおよびダンジョン内に配置される 4 種類のポータル。すべて 2x2 ブロックの台座 + 中央に2.5x3.0 のリフト面 で構成する。

ポータル共通構造

    ╔═══════════╗
    ║  リフト面  ║   ← 2.5 x 3.0 の平面、シェーダでうねる
    ║  (shader)  ║
    ╠═══════════╣
    ║   台座     ║   ← 2 x 1 x 2 のブロック(4ブロック)
    ╚═══════════╝
      ↑ 浮遊パーティクルがリフト面から上昇
要素実装
台座InstancedMeshのブロック4個(テーマ色)
リフト面PlaneGeometry(2.5, 3.0) + カスタムフラグメントシェーダ
浮遊粒子THREE.Points 50〜100個、上昇+ゆらぎ
光源PointLight 1基(減衰強め、距離4.0)

ポータル色別仕様

ポータルコア色外縁色粒子色用途
Mission Portal(紫リフト)#a855f7#6a1b9a#d8b4feミッション開始
Vibeverse Portal(レインボー)グラデ #ff2d75#ffd400#00ff88#00f0ff#a855f7(HSL hue 4秒周期)#ffffff全色混在外部ゲームへ遷移(docs/art/color-script.md 定義と整合)
Escape Portal(シアン渦)#00e5ff#4da6ff#a3f5ffダンジョン脱出
Revenge Portal(赤リフト)#ff1744#8b0000#ff6b6b前回シードで再挑戦

ポータル個別デザイン詳細

Mission Portal(ミッションポータル)

  • リフト面: 紫のうねり、中央に白い渦
  • 台座: ロビーの Prop ブロック(#7a5cff)4個
  • アニメーション: リフト面が時間経過でうねる(shader: sin(uv.x*5 + time)
  • 接近時: リフト面が明るくなり、粒子が増量

Vibeverse Portal(Vibeverseポータル)

  • リフト面: 虹色グラデーション(HSL で hue を時間回転)
  • 台座: 白 #ffffff のブロック4個 + 縁に金色 #ffe600
  • アニメーション: 虹色の回転、粒子が全色ランダム
  • 外観: 他のポータルより一回り大きい(2.5x2.5 台座)

Escape Portal(脱出ポータル)

  • リフト面: シアン渦巻き(shader: atan(uv.y, uv.x) で回転)
  • 台座: テーマ色で自動合わせ(例: Data Gridではシアン強調)
  • アニメーション: 中心に向かって吸い込まれる動き
  • 出現タイミング: ミッション目標達成時に部屋中央にスポーン

Revenge Portal(リベンジポータル)

  • リフト面: 赤いうねりに黒いノイズ(ボス戦警告色と統一。グリッチ属性とは別系統)
  • 台座: 黒 #0a0a0f + 赤ライン #ff1744
  • アニメーション: グリッチ効果(1秒ごとに画面が一瞬歪む)
  • 出現条件: 前回死亡時のみロビー右側に生成

Three.js 実装方針

InstancedMesh による環境描画

描画戦略の核

環境レイヤーは 1部屋あたり200〜500ブロック を配置する。これを個別のMeshにすると数百DrawCallになるため、ブロック種別ごとに InstancedMesh を1つに集約する。

typescript
// ブロック種別ごとに InstancedMesh を生成
interface BlockInstance {
  type: 'base' | 'accent' | 'wall' | 'neon' | 'special' | 'destructible';
  mesh: THREE.InstancedMesh;
  maxCount: number;
}

function createThemeInstancedMeshes(theme: DungeonTheme): BlockInstance[] {
  const geometry = new THREE.BoxGeometry(1, 1, 1);
  const instances: BlockInstance[] = [];

  for (const type of Object.keys(theme.palette)) {
    const material = type === 'neon'
      ? new THREE.MeshBasicMaterial({ color: theme.palette[type] })
      : new THREE.MeshLambertMaterial({ color: theme.palette[type], flatShading: true });

    const mesh = new THREE.InstancedMesh(geometry, material, 2000);
    mesh.instanceMatrix.setUsage(THREE.DynamicDrawUsage);
    instances.push({ type, mesh, maxCount: 2000 });
  }
  return instances;
}

// ブロック配置
function placeBlock(instance: BlockInstance, index: number, x: number, y: number, z: number) {
  const matrix = new THREE.Matrix4().setPosition(x, y, z);
  instance.mesh.setMatrixAt(index, matrix);
  instance.mesh.instanceMatrix.needsUpdate = true;
}

テーマ別タイルアトラス

各テーマのテクスチャは テーマごとに分離された独立アトラス として管理し、ダンジョン突入時に 遅延ロード する(docs/art/style-guide.md の遅延ロード戦略・ロード予算に準拠)。ロビーではいずれのダンジョンテクスチャも読み込まず、ロビー表示後バックグラウンドで先読みを開始する。

アトラスサイズ内容ロードタイミング
data-grid.png256x256床/壁/Special/Destructibleロビー表示後(バックグラウンド)
neon-arcade.png256x256同上同上
glitch-core.png256x256同上同上
void-rift.png256x256同上同上

各アトラス内は 64x64 のタイルを 4x4=16枚 配置。数字・回路・ドット絵・グリッチなど。現在のダンジョンテーマに対応する1枚のみを GPU に常駐させ、他テーマは texture.dispose() で解放する。

ブロックバリアントと頂点カラー

同じ InstancedMesh 内でも色をわずかにばらつかせるため、instance color attribute を活用して単調さを軽減する。

typescript
const color = new THREE.Color(themeBaseColor);
const variant = 0.95 + Math.random() * 0.1; // ±5%の明度揺らぎ
color.multiplyScalar(variant);
mesh.setColorAt(index, color);
mesh.instanceColor!.needsUpdate = true;

破壊可能ブロック

v1 スコープでは破壊演出を限定

style-guide.md の記載どおり、v1 ではブロック単位の破壊は ボス戦アリーナ崩壊など演出の一部 に限定する。通常のDestructibleブロックは「破壊フラグのON/OFFで非表示」に留め、破片シミュレーションは実装しない。

破壊時のフォールバック演出:

  • InstancedMesh の対象indexを matrix.scale=0 にして瞬時消去
  • 代わりに THREE.Points で 8〜12個の小さな発光粒子を0.5秒散らす

ポータルシェーダ

リフト面は共通の ShaderMaterial を使い、uniformで色・パターンだけ切り替える。

glsl
// fragment shader(概念)
uniform float uTime;
uniform vec3 uCoreColor;
uniform vec3 uEdgeColor;
uniform int uMode; // 0=ripple, 1=rainbow, 2=swirl, 3=glitch

varying vec2 vUv;

void main() {
  vec2 centered = vUv - 0.5;
  float r = length(centered);
  float ripple = sin(r * 12.0 - uTime * 3.0) * 0.5 + 0.5;
  vec3 col = mix(uCoreColor, uEdgeColor, smoothstep(0.2, 0.5, r));
  col *= 0.7 + ripple * 0.6;
  gl_FragColor = vec4(col, 1.0 - smoothstep(0.4, 0.5, r));
}

ライティング

ライト用途強度
AmbientLight全体の薄明かり(テーマ色)0.3〜0.5
HemisphereLight上下で色差をつける(Void Riftは使用しない)0.2
PointLight (最大4)ポータル・ボス・プレイヤー光源距離4〜6で減衰

ポイントライト制約

style-guide.md の制約どおり、同時点灯PointLightは 最大4つ まで。ネオン発光のほとんどは MeshBasicMaterial + UnrealBloomPass で表現する。

ポストプロセス

パス用途備考
UnrealBloomPass全テーマでネオン発光強調threshold 0.8, strength 1.2
ChromaticAberrationGlitch Core は強め(1.5x)モバイルは無効
Custom GlitchShaderGlitch Core 専用、時間ベースのRGBシフトv2 以降で拡張可

描画パフォーマンス見積もり

項目Draw Callポリゴン
環境ブロック(1テーマ・最大6種類)6部屋あたり 2,000〜6,000(500ブロック×12triangle)
ポータル(4種)4〜8各100程度
プロップ(Points + 少量Mesh)3〜5パーティクル1000粒
エフェクト(ポストプロセス含む)~5
合計(1ダンジョン画面内)~25< 10,000(画面内)

Draw Call目標 < 100 のうち、環境レイヤーは 30以下 に収める。残りはキャラクター・敵・UI・VFXで使用。

アセット予算

アセットサイズ目安備考
タイルアトラス(テーマごと×4)1 枚あたり 64〜128KB(合計 256〜512KB)PNG 圧縮後、ダンジョン突入時に該当テーマのみロード
ポータルシェーダ(GLSL文字列)< 5KBバンドル内
粒子用 gradient texture16x16, < 2KBradial gradient
背景(星空等)手続き生成テクスチャ不要
環境レイヤー合計< 600KB初回2MB制約内で十分に収まる

デザイン禁則事項(環境レイヤー)

  • 写実的なブロック質感(石壁のPBRテクスチャなど)
  • ブロックのベベル・角丸(ハードエッジを維持)
  • ブロック以外の複雑な曲面形状(球体・円柱の多用)
  • テーマ色の逸脱(他テーマのネオン色を混ぜない)
  • v1 でのリアルタイムブロック破壊(演出用途のみ)

関連ドキュメント