SlideShare a Scribd company logo
1 of 30
Download to read offline
適度に弱い敵AIの作り方
2015/07/25
自己紹介
• 名前
ドドリゲス雄蔵(@dodoyuzo)
• 職業
ゲームプログラマ 10年くらい
• 言語
C/C++やC#を主に使用しています
敵AIとは何か
• ※この先、プログラムのコードは1行も出てきません
敵AIとは何か
・アクションゲーム、RPG、シミュレーション
さまざまなジャンルのゲームに登場する"敵AI“
・ここでは、人間の代わりにキャラクターを動かし
人間の対戦相手を務めるプログラムを指します
NPC
1P 2P 3P
これ
COM
敵AIをどのようにプログラミングしますか?
条件式 行動
プレイヤーが3m以内にいる プレイヤーに対して近接攻撃
プレイヤーが10m以内にいる プレイヤーに対して射撃攻撃
自分のHPが10%未満 味方を食べて回復する
その他 プレイヤーを探す
・シンプルな実装方法
条件式とそれに合致した場合の行動を用意し
上から順番に条件式を評価します
優先順位、条件式、行動が明確で調整と実装がしやすいです
優先度
敵AIをどのようにプログラミングしますか?
・この方法ではすべての敵AIが
条件さえ満たせば全く同じ行動をとってしまう問題もあります
つまり、条件式によっては常に手加減無しの敵AIが出来上がってし
まいます。
・難易度によって敵AIをある程度弱くしたい場合
何かしらの対策が必要になります。
・ではどうしたら、敵AIは弱くなるでしょうか?
敵AIを弱くしたい
A案.AIの更新処理を遅くする
敵AIの反応や行動が遅くなりますので、必然的に弱くなります
ただ、"単に行動の遅い敵AI"にもなってしまいます
強いAI弱いAI
60F に 1回更新 1F に 1回更新
敵AIを弱くしたい
B案.難易度別に敵AIの条件式と行動を用意する
ゲームバランスの調整もしやすい方法です
「条件さえ満たせば全く同じ行動をとってしまう問題」が残りますが
ゲームルールによっては問題にならない場合もあります
条件式 行動
プレイヤーが3m以内にいる プレイヤーに対して近接攻撃
プレイヤーが10m以内にいる プレイヤーに対して射撃攻撃
自分のHPが10%未満 味方を食べて回復する
その他 プレイヤーを探す
条件式 行動
プレイヤーが3m以内にいる プレイヤーに対して近接攻撃
プレイヤーが10m以内にいる プレイヤーに対して射撃攻撃
自分のHPが10%未満 味方を食べて回復する
その他 プレイヤーを探す
条件式 行動
プレイヤーが3m以内にいる プレイヤーに対して近接攻撃
プレイヤーが10m以内にいる プレイヤーに対して射撃攻撃
自分のHPが10%未満 味方を食べて回復する
その他 プレイヤーを探す
難易度:イージー用 難易度:ノーマル用 難易度:ハード用
敵AIを弱くしたい
C案.AIの行動に弱点を用意しておく
B案同様に難易度、もしくは敵キャラクターごとにAIを用意します
プレイヤーがゲームプレイを繰り返し、敵AIの弱点を理解する事で
徐々にゲームの展開を有利に進められるゲームデザインを構築で
きます
パターンC
・4m以内にプレイ
ヤーがいると逃げる
パターンB
・2~3mのプレイ
ヤーに対して攻撃し
ない
パターンA
・同じプレイヤーに対
して3秒に1回までし
か攻撃できない
敵AIを弱くしたい
D案.AIはそのままで、敵のパラメータを弱くする
HPや攻撃力を下げれば、弱くなります
敵AIが約束された動きをするので、それをプレイヤーが逆手にとっ
て
有利に状況を進めるゲームデザインを構築できます
Lv.1 HP 6 Lv.99 HP 999
AIは同じ弱い敵 強い敵
敵AIを弱くしたい
• A案.AIの更新処理を遅くする
• B案.難易度別に敵AIの条件式と行動を用意する
• C案.AIの行動に弱点を用意しておく
• D案.AIはそのままで、敵のパラメータを弱くする
• これらはあくまで一例です。
上記のケースのいずれか
もしくはその複合で求めていた結果を得られる場合もあります
敵AIを弱くしたい
しかし、上記のケースでは不十分な場合もあります。
もうちょっと自然に
しかし露骨に手を抜いている訳ではないが、適度に弱くしたい
それも、パラメータでは無くAIの動きで見せたい場合です。
以下の方法はあくまで一例です
ゲームジャンルや実装方法によってベストな答えは違いますので
こういうやり方もあるんだな、程度で見て下さい
適度に弱いAIを作りたい
• まずAIの取りうる行動を全て書き出します
• 例えばコインを取る、相手を攻撃する、ゴールに向かう、などです
コインを取る
相手を攻撃
ゴールに向かう
適度に弱いAIを作りたい
• 次にその行動にプライオリティを設定します
• コインを集めるのがメインのゲームルールであれば
"コインを取る"の行動のプライオリティを高めにします
コインを取る
相手を攻撃
ゴールに向かう
Priority 100
Priority 60
Priority 40
適度に弱いAIを作りたい
• ゲームルールにあわせて
相手を攻撃する、相手よりも先にゴールする、など
プライオリティを調整します
コインを取る
相手を攻撃
ゴールに向かう
Priority 0
Priority 80
Priority 40
適度に弱いAIを作りたい
• 次にその行動を“どの程度、実行しやすいか?"を調べます
• 具体的には対象物との距離を測り、有効距離内であればその割合
を算出します
NPC 1.0
0.0
この範囲を有効距離とする
中心だと 1.0
適度に弱いAIを作りたい
• 例えば敵AIの近くにコインがあったとします。
これらをコインA、コインBとし、それぞれ距離が違うものとします
この範囲を有効距離とする
NPC
この範囲を有効距離とする
A
B
0.5
0.2
適度に弱いAIを作りたい
• 同じコインでも、AよりもBの方が近いので
“コインBを取る”という行動のプライオリティが高くなります
NPC
この範囲を有効距離とする
A
B
0.5
0.2
コインAを取る
Priority 100 A
0.2
× = 20
コインBを取る
Priority 100 B
0.5
× = 50
適度に弱いAIを作りたい
• こうして、その敵AIが取りうる全ての行動の
プライオリティを算出して、高い順番にソートします
行動 プライオリティ
コインBを取る 50
1Pを攻撃する 35
コインAを取る 20
挑発 10
適度に弱いAIを作りたい
• こうすると、一番プライオリティの高い行動が
その状況で本来取るべき"最適な行動"になります。
つまり"強い行動"です
行動 プライオリティ
コインBを取る 50
1Pを攻撃する 35
コインAを取る 20
挑発 10
強い
適度に弱いAIを作りたい
• では、2位以下はというと
"その行動も間違えではないが、最適ではない"行動になります
この順位が下がるにつれて、どんどん場違いな行動になっていきます
行動 プライオリティ
コインBを取る 50
1Pを攻撃する 35
コインAを取る 20
挑発 10
大体あってる
間違いではない
それは大きな
ミステイク
適度に弱いAIを作りたい
• もうお分かりかと思いますが。
行動のプライオリティが1位のものだけではなく
2位未満の行動もたまに取るようにすると、敵AIは適度に弱くなっていき
ます
行動 プライオリティ
コインBを取る 50
1Pを攻撃する 35
コインAを取る 20
挑発 10
採用率70%
採用率15%
採用率10%
採用率5%
適度に弱い
適度に弱いAIを作りたい
• この手法のポイントは、2位以下の行動でも
人間であれば実行しても不思議ではないものが、ある点です
上位3つまで、など範囲を限定すれば、不自然さはだいぶ低くなります
行動 プライオリティ
コインBを取る 50
1Pを攻撃する 35
コインAを取る 20
挑発 10
大体あってる
間違いではない
それは大きな
ミステイク
適度に弱いAIを作りたい
この方法に加えて
「A案.AIの更新処理を遅くする」を併用すると
“反応はすこぶる早いけど、行動はデタラメ“
“実行するまで腰が重いけど、行動は正確“
といった特徴付けから
「反応も遅いし、行動もデタラメ」といった超弱いAIも作れます
実装時のメリット
ゲームルールに最適化されたAI
執拗に攻撃するAI
ゴールに近づくプレイヤーを妨害するAI
• AIに性格付けを行いやすくなります
ゲームルールに基づいた行動のプライオリティを高くすれば
ゲームルールに向いたAIになります
何か特定の行動のプライオリティを高くすれば
ゲームルールを無視して、その行動を優先するAIになります
実装時のメリット
• AIの調整や別パターンを作成する場合でも
行動のプライオリティと有効距離割合の値を書き換えるのみで
処理そのものに手を加える部分が少なくて済みます
AIの処理はとにかく複雑になりがちなので
数値パラメータにまとめられれば、調整が非常に行い易い
向くゲームジャンル
・アクション
・対戦全般
本来は人間が操作するはずの部分を代行するNPCとしてのAIを使用
するジャンル
実行できる行動の種類が多いほど、優先順位の2位以下を
選択しても不自然に見えにくい
向かないゲームジャンル
・シューティング
・RPG
・戦略シミュレーション
AIの振る舞いをプレイヤーが理解、予測する事でゲームの展開を有利に
進める事ができるジャンル
行動の選択肢が少なくて、優先順位の2位以下の行動が目立つものや
詰将棋のように1ターン1ターンを計算して進めるジャンルなど
総括
• 敵AIの作りは、ジャンルによって様々
• 強いAIは作れても、弱いAIは工夫しないと不自然に見えてしまう
• シンプルに実装できて調整しやすいのなら、それがベスト
ご清聴ありがとうございました

More Related Content

What's hot

ゲームAI入門(後半)
ゲームAI入門(後半)ゲームAI入門(後半)
ゲームAI入門(後半)Youichiro Miyake
 
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版小林 信行
 
ゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめSugimoto Chizuru
 
【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについて
【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについて【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについて
【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについてUnity Technologies Japan K.K.
 
ゲームAI入門(前半)
ゲームAI入門(前半)ゲームAI入門(前半)
ゲームAI入門(前半)Youichiro Miyake
 
「3Dゲームをおもしろくする技術 」のいろいろな読み方
「3Dゲームをおもしろくする技術 」のいろいろな読み方「3Dゲームをおもしろくする技術 」のいろいろな読み方
「3Dゲームをおもしろくする技術 」のいろいろな読み方Kouji Ohno
 
ノベルゲーム動的演出の考え方
ノベルゲーム動的演出の考え方ノベルゲーム動的演出の考え方
ノベルゲーム動的演出の考え方tuna cook
 
MMORPGで考えるゲームデザイン(2014年改訂版)
MMORPGで考えるゲームデザイン(2014年改訂版)MMORPGで考えるゲームデザイン(2014年改訂版)
MMORPGで考えるゲームデザイン(2014年改訂版)Katsumi Mizushima
 
攻略リニアカラー改訂版
攻略リニアカラー改訂版攻略リニアカラー改訂版
攻略リニアカラー改訂版小林 信行
 
ぷよぷよ AI 人類打倒に向けて
ぷよぷよ AI 人類打倒に向けてぷよぷよ AI 人類打倒に向けて
ぷよぷよ AI 人類打倒に向けてmayahjp
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作るtorisoup
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するTakahito Tejima
 
ゲームをおもしろくする技術 「ゲームとお笑い」
ゲームをおもしろくする技術 「ゲームとお笑い」ゲームをおもしろくする技術 「ゲームとお笑い」
ゲームをおもしろくする技術 「ゲームとお笑い」Kouji Ohno
 
GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社
GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社
GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社Game Tools & Middleware Forum
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編Unity Technologies Japan K.K.
 
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法小林 信行
 
エターナらないゲーム開発
エターナらないゲーム開発エターナらないゲーム開発
エターナらないゲーム開発Kohki Miki
 
ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)Youichiro Miyake
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話torisoup
 
UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計Masahiko Nakamura
 

What's hot (20)

ゲームAI入門(後半)
ゲームAI入門(後半)ゲームAI入門(後半)
ゲームAI入門(後半)
 
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
 
ゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめ
 
【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについて
【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについて【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについて
【Unite Tokyo 2018 Training Day】ProBuilderで学ぶレベルデザイン レベルデザインについて
 
ゲームAI入門(前半)
ゲームAI入門(前半)ゲームAI入門(前半)
ゲームAI入門(前半)
 
「3Dゲームをおもしろくする技術 」のいろいろな読み方
「3Dゲームをおもしろくする技術 」のいろいろな読み方「3Dゲームをおもしろくする技術 」のいろいろな読み方
「3Dゲームをおもしろくする技術 」のいろいろな読み方
 
ノベルゲーム動的演出の考え方
ノベルゲーム動的演出の考え方ノベルゲーム動的演出の考え方
ノベルゲーム動的演出の考え方
 
MMORPGで考えるゲームデザイン(2014年改訂版)
MMORPGで考えるゲームデザイン(2014年改訂版)MMORPGで考えるゲームデザイン(2014年改訂版)
MMORPGで考えるゲームデザイン(2014年改訂版)
 
攻略リニアカラー改訂版
攻略リニアカラー改訂版攻略リニアカラー改訂版
攻略リニアカラー改訂版
 
ぷよぷよ AI 人類打倒に向けて
ぷよぷよ AI 人類打倒に向けてぷよぷよ AI 人類打倒に向けて
ぷよぷよ AI 人類打倒に向けて
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
ゲームをおもしろくする技術 「ゲームとお笑い」
ゲームをおもしろくする技術 「ゲームとお笑い」ゲームをおもしろくする技術 「ゲームとお笑い」
ゲームをおもしろくする技術 「ゲームとお笑い」
 
GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社
GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社
GTMF 2017:プランナーが見るべきKPIとシリコンスタジオの分析ノウハウ シリコンスタジオ株式会社
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
 
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
 
エターナらないゲーム開発
エターナらないゲーム開発エターナらないゲーム開発
エターナらないゲーム開発
 
ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
 
UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計
 

適度に弱い敵aiの作り方