ゲームを作っていると、
「NPCに村の中を歩かせたい」
「プレイヤーが近づいたら反応させたい」
「一定時間ごとに別の行動をさせたい」
といった仕様を考えることがあります。
こうしたNPCの行動を作るときに重要なのが、どんな条件で、どの行動を選ぶのかを整理することです。
ゲームプランナーの場合、プログラムそのものを書くのではなく、
「通常時は何をするのか」
「プレイヤーが近づいたらどうするのか」
「複数の条件が同時に成立したら、どの行動を優先するのか」
といった行動ルールを考えます。
この記事では、村人NPCを例にしながら、ゲームプランナーがNPCの行動パターンをどのように考えるのかを解説します。
ゲームにおけるアルゴリズムとは?

アルゴリズムとは、簡単にいうと目的を達成するための処理手順やルールのことです。
ゲームではさまざまな場所でアルゴリズムが使われますが、この記事では主にNPCがどのような条件で、どの行動を選択するのかという行動ロジックについて扱います。
例えば村人なら、
「普段は歩く」
「プレイヤーを発見したら近づく」
「一定時間が経過したら立ち止まる」
といったルールを設定できます。
難しく考える必要はなく、ゲームプランナーとしてはまず、
条件 → 行動
の組み合わせとして整理すると考えやすくなります。
NPCの行動は、まず基本行動から考える
NPCごとにすべての行動を一から考えると、仕様が複雑になりやすくなります。
そこで、まずNPCに共通する基本行動を作り、そこへ個別の行動を追加していく方法があります。
例えば村人なら、
「村の中を歩く」
という基本行動を用意します。
そこへNPCごとに、
「立ち止まって考える」
「プレイヤーへ近づく」
「椅子に座る」
といった特徴を追加します。
共通部分を作っておけば、NPCごとの差分だけを考えればよくなるため、仕様も整理しやすくなります。
村人A・B・Cで行動パターンを考えてみる

例えば、村人A・村人B・村人Cという3人のNPCがいるとします。
まず全員に共通する基本行動を決めます。
基本行動
村人は村の中を歩きます。
移動中に進めない場所へ到達した場合は、進行方向を変更して再び移動します。
ここをベースとして、NPCごとに行動を追加します。
村人A|一定時間ごとに考える
村人Aには、
歩き始めてから5秒経過すると「考える」モーションを行う。
モーションが終了したら再び歩き始める。
という行動を追加します。
これだけでも、
歩く → 考える → 歩く
という変化が生まれます。
村人B|プレイヤーを見つけると近づいてくる
村人Bには、
プレイヤーが半径10m以内に入った場合、プレイヤーに向かって走る。
という行動を追加します。
この場合は、
通常時 → 歩く
プレイヤー発見 → プレイヤーへ近づく
という条件分岐ができます。
村人C|複数の行動を持たせる
村人Cには、村人Aと村人Bの特徴を両方持たせ、さらに、
10秒ごとに「座る」モーションを行う。
という行動を追加するとします。
ただし、
座っている間は、プレイヤーが近づいても反応しない。
という条件も設定します。
こうすることで、
歩く
考える
プレイヤーへ近づく
座る
という複数の行動を持つNPCになります。
同じ村人でも、基本行動に少しずつ条件や行動を追加することで個性を作ることができます。
条件が重なったときは優先順位を決める
NPCの行動を増やしていくと、複数の条件が同時に成立することがあります。
例えば村人Cが、
「座る時間になった」
と同時に、
「プレイヤーが半径10m以内に入った」
場合です。
このとき、
座るのか?
プレイヤーへ近づくのか?
を決めておかなければなりません。
今回の例では、
座っている間は、プレイヤーが近づいても反応しない
と決めています。
つまり、
座る行動 > プレイヤーへ近づく行動
という優先順位になります。
行動パターンを考えるときは、行動そのものだけでなく、条件が重なった場合にどちらを優先するのかまで決めておくことが重要です。
ここが曖昧だと、実装するときにプログラマー側で判断しなければならなくなります。
NPCの行動は「状態」で考えると整理しやすい
NPCの行動が増えてきたら、現在どの状態なのかを分けて考えると整理しやすくなります。
今回の村人なら、
歩いている状態
考えている状態
座っている状態
プレイヤーへ近づいている状態
と分けられます。
そして、
歩く
↓
5秒経過
↓
考える
↓
モーション終了
↓
歩く
のように、どの条件で次の状態へ移るのかを決めます。
これが状態遷移の考え方です。
ゲームプランナーが仕様を作る場合も、
「NPCは何をするのか」
だけでなく、
「どんな条件でその行動を開始し、どんな条件で終了するのか」
まで考えておくと、かなり実装しやすくなります。
逆に「全部できるNPC」から行動を削ってもいい

先ほどは、
基本行動を作る
↓
行動を追加する
という方法でした。
逆に、最初に多くの行動を持ったNPCを作り、そこから行動を削っていく方法もあります。
例えば、
歩く
考える
座る
プレイヤーへ近づく
逃げる
会話する
という行動を持つ村人をベースとして、
村人Aは「近づく」を削る。
村人Bは「座る」を削る。
村人Cはすべて使う。
という作り方です。
こちらも、共通部分を使いながらNPCごとの差を作れる方法です。
どちらが正しいというわけではなく、作るNPCの数やゲームの仕様によって使いやすい方法を選べばよいと思います。
NPCの仕様では開始条件と終了条件を書く
NPCの行動仕様を書くときは、行動名だけを書くよりも、
いつ始まるのか
何をするのか
いつ終わるのか
をセットで考えると分かりやすくなります。
例えば、
行動:プレイヤーへ近づく
開始条件:プレイヤーが10m以内に入る
行動内容:プレイヤーへ向かって走る
終了条件:プレイヤーとの距離が2m以下になる、またはプレイヤーが15m以上離れる
という形です。
さらに複数の行動があるなら、
優先順位:座る > 会話 > プレイヤーへ近づく > 通常移動
のように決めておくこともできます。
こうしておけば、プログラマーから見てもNPCが何をすればよいのか分かりやすくなります。
数式を書くより「条件と行動」を明確にする

ゲームプランナーがNPCの行動仕様を考える場合、必ずしもプログラム内部の計算方法まで決める必要はありません。
重要なのは、
「何をしたいのか」
「どんな条件で行動するのか」
「行動をいつ終了するのか」
「複数の条件が成立したら何を優先するのか」
を明確にすることです。
例えば、
プレイヤーにいい感じで近づいてください。
だけでは、仕様としては不足しています。
何m以内で反応するのか。
歩くのか走るのか。
どの距離まで近づくのか。
途中でプレイヤーが離れたらどうするのか。
障害物があったらどうするのか。
こうした条件を決めるのが、ゲームプランナー側の重要な仕事です。
一方で、その動きをプログラム上でどのような処理として実現するかは、プログラマーと相談しながら決めていきます。
職種ごとに得意分野があるので、プランナーがすべての実装方法まで決める必要はありません。
ただし、
「いい感じによろしく!」だけで投げるのは仕様ではありません。
ゲームプランナーとして、少なくとも目的・条件・行動・優先順位は説明できるようにしておく必要があります。
NPCの行動パターンを考えるときのポイント
NPCの行動を作るときは、最初から大量の行動を細かく作るよりも、まず基本行動を決め、そこから条件を追加していくと整理しやすくなります。
特に、
- 通常時は何をするのか
- 何が起きたら別の行動へ変わるのか
- その行動はいつ終わるのか
- 条件が重なった場合は何を優先するのか
- 複数のNPCで共通化できる部分はないか
を考えておくと、仕様が作りやすくなります。
まとめ
NPCの行動パターンを考えるときは、難しいアルゴリズムから考える必要はありません。
まず、
条件 → 行動
という単純な形から考えます。
そこへNPCごとの行動を追加し、条件が増えてきたら優先順位や状態遷移を整理します。
ゲームプランナーとして重要なのは、プログラムそのものを書くことではなく、
「このNPCは、どんな状況で、なぜこの行動をするのか」
を仕様として説明できることです。
基本行動をうまく共通化しておけば、少ない仕様でも複数のNPCに違いを作ることができ、調整もしやすくなります。


コメント