【番外編】バイオハザードは、実はエンジニアリングの教科書だった
この記事でわかること(ミニ結論)
- バイオハザードのゲームメカニクスはエンジニアリングの基本概念と驚くほど一致する
- アイテムボックス・ゾンビAI・セーブシステムは共有メモリ・ステートマシン・Gitそのもの
- 過去作から最新作レクイエムへの進化はモノリス→マイクロサービスの移行に似ている
- 遊びながら学べるエンジニアリング概念が実はゲームの中に隠れている
はじめに:なぜバイオハザードがエンジニアリングなのか
2026年、バイオハザードRequiemが話題だ。プレイしながらふと気づいた。
「これ、現場でやってることと同じじゃないか?」
鍵を集めてドアを開ける。アイテムを管理する。敵の行動パターンを読む。
ゲームの設計思想とエンジニアリングの設計思想は、驚くほど重なっている。
番外編として、現役エンジニア目線でバイオハザードを解剖してみる。
1. アイテムボックス=共有メモリ/クラウドストレージ
マップ上のどのアイテムボックスにアクセスしても、同じアイテムが入っている。
これはまさにグローバルな共有ストレージの概念だ。
# バイオハザードのアイテムボックスをコードで表現すると...
# ❌ 昔ながらのローカル管理(各ボックスが独立)
box_room_101 = ["ハーブ", "ショットガンの弾"]
box_room_205 = ["ナイフ"] # 別のボックスには別のアイテム
# ✅ バイオハザードの実際の仕組み(共有参照)
# どのボックスも同じストレージを参照している
item_storage = {
"items": ["ハーブ", "ショットガンの弾", "ナイフ"]
}
box_room_101 = item_storage # 同じオブジェクトを参照
box_room_205 = item_storage # 同じオブジェクトを参照
# room_101で追加したアイテムはroom_205からも見える
box_room_101["items"].append("グリーンハーブ")
print(box_room_205["items"])
# → ["ハーブ", "ショットガンの弾", "ナイフ", "グリーンハーブ"]
# room_205からもちゃんと見える!
現実のシステムで言えばAWS S3・Redis・データベースがこれに相当する。
複数のサーバーから同じストレージにアクセスして、常に最新の状態を共有する。
2. ハーブの調合=関数の合成(Function Composition)
グリーンハーブ単体では弱い。でも組み合わせると効果が跳ね上がる。
from dataclasses import dataclass
@dataclass
class Herb:
color: str
heal_power: int
def mix(*herbs: Herb) -> dict:
"""ハーブを調合する関数"""
total_power = sum(h.heal_power for h in herbs)
colors = [h.color for h in herbs]
# 特定の組み合わせでボーナス効果
bonus = 1.0
if "green" in colors and "red" in colors:
bonus = 2.5 # 完全回復
elif colors.count("green") == 3:
bonus = 2.0 # 強化回復
return {
"heal": int(total_power * bonus),
"components": colors
}
green = Herb("green", 30)
red = Herb("red", 20)
blue = Herb("blue", 10) # 毒消し効果
# 単体
print(mix(green))
# → {"heal": 30, "components": ["green"]}
# グリーン+レッド=完全回復
print(mix(green, red))
# → {"heal": 125, "components": ["green", "red"]}
# これはまさに関数合成
# f(x) = green, g(x) = red → h(x) = f(g(x)) で効果倍増
パイプライン処理・ミドルウェアの連鎖・関数型プログラミングの考え方そのものだ。
単体では小さな機能が、組み合わさることで大きな力を発揮する。
3. ゾンビのAI=ステートマシン(有限オートマトン)
ゾンビは「ただ歩いている」ように見えて、実は状態遷移で動いている。
from enum import Enum, auto
class ZombieState(Enum):
PATROL = auto() # 徘徊中
ALERT = auto() # 音・気配を検知
CHASE = auto() # 追跡中
ATTACK = auto() # 攻撃中
STUNNED = auto() # ひるみ中
class Zombie:
def __init__(self):
self.state = ZombieState.PATROL
self.health = 100
def update(self, player_distance: float, heard_noise: bool):
"""毎フレーム状態を更新する"""
# 状態遷移のルール
match self.state:
case ZombieState.PATROL:
if player_distance < 5.0 or heard_noise:
self.state = ZombieState.ALERT
print("🧟 ウッ...(気配を感じた)")
case ZombieState.ALERT:
if player_distance < 3.0:
self.state = ZombieState.CHASE
print("🧟♂️ グァァァ!(発見)")
elif player_distance > 8.0:
self.state = ZombieState.PATROL
case ZombieState.CHASE:
if player_distance < 1.5:
self.state = ZombieState.ATTACK
elif player_distance > 10.0:
self.state = ZombieState.PATROL
print("🧟 (見失った...)")
case ZombieState.ATTACK:
if player_distance > 2.0:
self.state = ZombieState.CHASE
case ZombieState.STUNNED:
# スタン解除後は追跡に戻る
self.state = ZombieState.CHASE
# 実際の動き
zombie = Zombie()
zombie.update(player_distance=4.0, heard_noise=True)
# → 🧟 ウッ...(気配を感じた)
zombie.update(player_distance=2.5, heard_noise=False)
# → 🧟♂️ グァァァ!(発見)
これはUIのボタン状態・通信プロトコルの状態管理・ワークフローエンジンなど、
現実のシステム設計でも至る所で使われている設計パターンだ。
4. 鍵と扉=認証・アクセス制御(RBAC)
特定の鍵がなければドアは開かない。持っていれば開く。それだけ。
from typing import Optional
# アクセス制御の定義
DOOR_PERMISSIONS = {
"laboratory_b2": ["key_card_lv3", "master_key"],
"armory": ["key_card_lv2", "key_card_lv3", "master_key"],
"safe_room": ["key_card_lv1", "key_card_lv2",
"key_card_lv3", "master_key"],
}
class Player:
def __init__(self, name: str):
self.name = name
self.inventory: list[str] = []
def try_open_door(self, door_name: str) -> bool:
required_keys = DOOR_PERMISSIONS.get(door_name, [])
# 所持アイテムに必要な鍵があるか確認
for key in required_keys:
if key in self.inventory:
print(f"✅ {door_name} を開けた({key} を使用)")
return True
print(f"🔒 {door_name} は開かない...鍵が必要だ")
return False
# 実際の動作
player = Player("Chris")
player.inventory = ["herb", "shotgun_ammo", "key_card_lv2"]
player.try_open_door("safe_room")
# → ✅ safe_room を開けた(key_card_lv2 を使用)
player.try_open_door("laboratory_b2")
# → 🔒 laboratory_b2 は開かない...鍵が必要だ
これはそのままJWT認証・OAuth2のスコープ・AWS IAMのポリシーと同じ設計思想だ。
「正しい権限を持つ者だけがリソースにアクセスできる」という原則は変わらない。
5. セーブ&ロード=Gitのコミット&ロールバック
タイプライターでセーブする。失敗したらロードして戻る。
# バイオハザードのセーブ=Gitのコミット
# セーブ(現在の状態を記録)
git add .
git commit -m "ボス前: 回復アイテム3個、弾薬100発の状態"
# ゲームオーバー(何か壊滅的なことが起きた)
# ...💀
# ロード(セーブ地点に戻る)
git reset --hard HEAD~1
# または特定のコミットに戻る
git checkout abc1234
# 実際の開発でも同じ
git commit -m "feat: 新機能追加(テスト通過確認済み)"
# → 新機能が壊滅的にバグってた
git reset --hard HEAD~1
# → セーブ地点に戻れた
そして今回の記事でも紹介したEntire CLIのCheckpointsは、
「なぜそのセーブをしたか」という思考過程まで記録する。
バイオハザードで言えば、セーブ時に「ここでセーブした理由:ボスの第2形態が怖いから」
というメモが自動で残るようなイメージだ。
6. 過去作 vs レクイエム:モノリスからマイクロサービスへ
ここからはエンジニアっぽい視点で、シリーズの進化を語る。
バイオハザード1〜3(1996〜1999年)=モノリスアーキテクチャ
┌─────────────────────────────────┐
│ バイオハザード1 │
│ │
│ ・固定カメラ(単一ビューシステム) │
│ ・限られたマップ(密結合な空間) │
│ ・決められたルート(線形フロー) │
│ ・インクリボン必須(集中型状態管理)│
└─────────────────────────────────┘
全てが密に結合したひとつのシステム。変更しにくいが安定していて予測可能。
初代バイオの洋館はまさに「巨大なモノリシックアプリケーション」だ。
バイオハザード4〜6(2005〜2012年)=サービス指向アーキテクチャ(SOA)
┌──────────┐ ┌──────────┐ ┌──────────┐
│ アクション │ │ カメラ │ │ AI │
│ システム │ │ システム │ │ エンジン │
└──────────┘ └──────────┘ └──────────┘
↕ ↕ ↕
┌─────────────────────────────────────┐
│ 共通ゲームエンジン(バス) │
└─────────────────────────────────────┘
TPS視点の導入・アクション性の強化など、各システムが疎結合になり始めた。
ただし規模が大きくなりすぎて、バイオ6は「何でもあり」な複雑なシステムに。
バイオハザードRequiem(2026年)=マイクロサービス+AIネイティブ
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 物理演算 │ │ AI行動 │ │ 環境破壊 │
│マイクロSVC │ │マイクロSVC │ │マイクロSVC │
└───────────┘ └───────────┘ └───────────┘
↕ ↕ ↕
┌─────────────────────────────────────────┐
│ イベントバス(非同期通信) │
└─────────────────────────────────────────┘
↕ ↕ ↕
┌───────────┐ ┌───────────┐ ┌───────────┐
│ サウンド │ │ レンダリング│ │ ネットワーク│
│マイクロSVC │ │マイクロSVC │ │マイクロSVC │
└───────────┘ └───────────┘ └───────────┘
各システムが独立して動作・更新可能になり、AIが敵の行動を動的に生成する。
プレイヤーの行動に応じてリアルタイムで難易度・敵配置が変化する。
これはまさにクラウドネイティブ・AIネイティブなアーキテクチャだ。
| 観点 | 旧作(1〜3) | 中期(4〜6) | レクイエム |
|---|---|---|---|
| アーキテクチャ | モノリス | SOA | マイクロサービス |
| 敵AI | ルールベース | ビヘイビアツリー | LLMベース動的生成 |
| セーブ | インクリボン(手動・有限) | チェックポイント(自動) | クラウドセーブ(常時同期) |
| マップ | 固定・線形 | 半オープン | フルオープンワールド |
| デプロイ | パッケージ一括 | パッチ配信 | ライブアップデート(ホットフィックス) |
まとめ:ゲームはエンジニアリングの縮図だった
バイオハザードを通じて見えてくるエンジニアリングの概念をまとめると:
| ゲームの要素 | エンジニアリングの概念 |
|---|---|
| アイテムボックス | 共有メモリ・クラウドストレージ |
| ハーブの調合 | 関数合成・パイプライン |
| ゾンビのAI | ステートマシン |
| 鍵と扉 | 認証・アクセス制御(RBAC) |
| セーブ&ロード | Gitコミット&ロールバック |
| シリーズの進化 | モノリス→マイクロサービス |
ゲームをプレイしながら、実は設計パターンを学んでいた。
エンジニアリングの概念は難しそうに見えて、実は身近なところに隠れている。
次にバイオハザードをプレイするとき、少し違う目線で楽しめるかもしれない。
この記事は番外編です。現役半導体エンジニアがゲームをエンジニア視点で解剖するシリーズです。
情報ソース:
- バイオハザードシリーズ(カプコン)
- 現場エンジニアの経験と妄想
Discussion