ゲームでNPC(ノンプレイヤーキャラクター)が自動的に行動を行いますが、これはどうやって行動を決定しているか知っていますか?
よく使われる手法としてファジィ理論と呼ばれる理論があります。
今回はそのファジィ理論を何回かに分けて紹介します。
ゲームだけでなくウェブサイト制作なんかでも生かせる場所があるし、作成する関数自体もそんなに複雑ではないので知っておいて損はありません。
ファジィ理論とは
ファジィとは日本語で曖昧を意味します。
曖昧とは何を指すのか…
例えば、「暑い」「寒い」「若手」「高齢」などを数値化します。
数値化と言っても定義されたものではなく、自身が定義して数値化します。
例えば、室温22度が暑いか寒いかは人それぞれです。
これをn度以下は寒い、n度以上は暑いと定義して0〜1で数値化します。
もしかしたら、普段何気なく使ってるかもしれませんね。
簡単な例として下記の条件の行動が存在するとします。
- 体力が0%〜20%の時は睡眠
- 体力が10%〜30%の時は回復
この時、自身の体力は「15/100」だった時どちらの行動を優先するか。
設計としては範囲の最大値に近い方(20%/30%)を優先します。
- 0%〜20%: 0.75
- 10%〜30%: 0.25
0〜1で表すと上記の結果になり、睡眠を優先するようになります。
ただし、上記の計算は範囲の大きい方(20%/30%)に近い方を比率で算出した場合なので、逆に小さい方(0%/10%)に近い方を優先するのであれば逆の結果になります。
ファジィ理論はこのように、設計によって導き出される数値が変わります。
ファジィ理論はいくつかの計算式(メンバーシップ関数と言います)があり、単体あるいは組み合わせで使うことができます。
このブログでは「傾斜型」「逆傾斜型」「三角形型」「台形型」の4つを紹介します。
傾斜型
最も基本となる形です。
右肩上がりを示しますが、ある特定の間のみを数値化するということもできます。
最初の例題で使用したのはこの傾斜型を利用して算出しています。
利用するパラメータは3つです。
- value … キーとなる数値
- min … 最小の値(これより低い数値は常に0)
- max … 最大の値(これより高い数値は常に1)
function Grade(value, min, max) {
if (value <= min) return 0
if (value >= max) return 1
const diff = max - min
return (value / diff) - (min / diff)
}
See the Pen Fuzzy – Grade by Nobuyuki Kondo (@artprojectteam) on CodePen.0
逆傾斜型
その名の通り傾斜型を反転させたものです。
最小値に近いほうが1になります。
利用するパラメータは傾斜型と同様3つです。
- value … キーとなる数値
- min … 最小の値(これより低い数値は常に1)
- max … 最大の値(これより高い数値は常に0)
function reverseGrade(value, min, max) {
if (value <= min) return 1
if (value >= max) return 0
const diff = max - min
return (max / diff) - (value / diff)
}
See the Pen Fuzzy – ReverseGrade by Nobuyuki Kondo (@artprojectteam) on CodePen.0
サンプル
タグクラウドのような強さによってフォントサイズを変えるような時に簡単に実装できます。
See the Pen Fuzzy – Grade – Sample by Nobuyuki Kondo (@artprojectteam) on CodePen.0
ファジィ理論の関連記事
※関数化したtipsをGitHubにアップしています