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
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略Takayasu Beharu
 
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】Unity Technologies Japan K.K.
 
ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)Youichiro Miyake
 
自動LOD生成を可能にする3Dキャラクターパイプラインセミナー
自動LOD生成を可能にする3Dキャラクターパイプラインセミナー自動LOD生成を可能にする3Dキャラクターパイプラインセミナー
自動LOD生成を可能にする3DキャラクターパイプラインセミナーKLab Inc. Creative
 
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜narumi_
 
ゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめSugimoto Chizuru
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~UnityTechnologiesJapan002
 
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術Unity Technologies Japan K.K.
 
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​KLab Inc. / Tech
 
UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座Yuichi Ishii
 
はじめてのAI~ 愛のあるAIを作ろう
はじめてのAI~ 愛のあるAIを作ろうはじめてのAI~ 愛のあるAIを作ろう
はじめてのAI~ 愛のあるAIを作ろうMasahiko Nakamura
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたTakahiro Miyaura
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVCAimingStudy
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件Grenge, Inc.
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!Unity Technologies Japan K.K.
 
UniTask入門
UniTask入門UniTask入門
UniTask入門torisoup
 
UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計Masahiko Nakamura
 

What's hot (20)

多機能ボイチャを簡単に導入する方法
多機能ボイチャを簡単に導入する方法多機能ボイチャを簡単に導入する方法
多機能ボイチャを簡単に導入する方法
 
ゲームAI入門(前半)
ゲームAI入門(前半)ゲームAI入門(前半)
ゲームAI入門(前半)
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略
 
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
 
ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)
 
自動LOD生成を可能にする3Dキャラクターパイプラインセミナー
自動LOD生成を可能にする3Dキャラクターパイプラインセミナー自動LOD生成を可能にする3Dキャラクターパイプラインセミナー
自動LOD生成を可能にする3Dキャラクターパイプラインセミナー
 
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
 
ゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめ
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
 
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
 
UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座
 
はじめてのAI~ 愛のあるAIを作ろう
はじめてのAI~ 愛のあるAIを作ろうはじめてのAI~ 愛のあるAIを作ろう
はじめてのAI~ 愛のあるAIを作ろう
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
UniTask入門
UniTask入門UniTask入門
UniTask入門
 
UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計
 

適度に弱い敵aiの作り方