johnnyGameStudio’s blog

無能なゲームプログラマのぼやき ぎーくになりたい Twitter: https://twitter.com/JGS_Developer

【UE4】ガンビットAI made in UE4を公開しました【自作ライブラリOSS】

はじめに

元々僕はFF12のGambitAIがめちゃくちゃ好きで、UnityでGambitAIを作っていました
その時の記事はこちら
johnnygamestudio.hatenablog.com

で、それなりに出来あがって自己満足していたんですがこのブログのアクセス解析を見てみるとこの記事をGoogle検索からみている人がめちゃくちゃ多くてこれはちゃんとライブラリ化して公開したほうがいいなと思いました

f:id:johnnygamestudio:20200901001754p:plain

しかもGoogleで「ガンビットAI」と検索するとなんとこの記事がTOP2にヒットするんですよね
ビックリする

f:id:johnnygamestudio:20200901002111p:plain

そしてOSSとして公開したライブラリはこちら MITライセンスです

github.com

解説

Unityで作ったときはbehaviortreeとステートマシンで無駄に冗長性を持った構造にしていましたが、今回作った構造はとても単純です
ざっくりとした構造は以下のようになっています f:id:johnnygamestudio:20200901012730p:plain

Initialize時にプライオリティごとにソートされているので、ThinkActionを実行するとFF12ガンビットのように上から順繰り条件判定処理を行います
条件判定の方法としてはUAIConditionクラスを継承したBlueprintを複数用意しておいてそれを一つのActionにつき好きなだけ設定することができます

これにより、一つ一つの条件は簡単なモノでも複数の条件判定を重ねることで複雑な条件判定を設定できる且つ組み合わせ次第で新しい条件判定処理を追加実装することなく作成できます つまりは運用上はUAIConditionを少しずつ用意していくだけというのを想定しています

例えば、
「自身のHPが50%以上の場合のみTRUEのUAICondition」
「敵の中に特定の属性を持つ敵がいたらTRUEのUAICondition」
という二つのUAIConditionを組み合わせれば「自身のHPが50%以上の時、敵の中に特定属性を持つモノがいたら実行する」といった処理が出来上がります

UGambitAIComponent::ThinkActionを実行するとUGambitAIComponent::GetCurrentActionでHITしたFGambitActionInfoが取得できます
その中のActionIDを元にしてそこからはいい感じにゲーム側でアクションを実行してください

その他持っている機能

  • プライオリティ機能
  • 重み判定により同じプライオリティなら重みで判定される

HOW TO

1. JohnnyGambitLibraryをC++プラグインとしてプロジェクトに追加する

2. GambitAIComponentを持つキャラクターアクターを用意する

f:id:johnnygamestudio:20200901014726p:plain

3. UAIConditionを継承したBlueprintを作成する

3-2. 作成したBlueprintでDoAICondition関数の中身を作成する

※一応サンプルで「HPが50%以上の時にTRUE」などのCondtionは用意してあります
f:id:johnnygamestudio:20200901015409p:plain

4. FDataTableGambitAISheetを継承したDataTableを作成する

4-2. 作成したDataTableにUAIConditionなどの設定を行う

f:id:johnnygamestudio:20200901015554p:plain

4-3. キャラクターアクター内でUGambitAIComponent::InitializeAIを実行し作成したDataTableを渡す

4-4. 各キャラクターアクターが持つUGambitAIParameterのSetParameterでAIの判定に必要な条件を詰めてあげる

5. いい感じにThinkActionを実行してからGetCurrentActionでヒットしたActionIDを使ってゲーム側のアクション処理を実行する(雑)

こんな感じ(DoActionはゲーム側の関数)
f:id:johnnygamestudio:20200901020630p:plain f:id:johnnygamestudio:20200901020422p:plain

今後の課題

  • ターゲッティング周りが弱い
  • 敵と自身以外で条件を入れられない(環境情報も欲しくない?)
  • ちゃんとしたドキュメントを用意する
  • 採用タイトルをリリースする(自作のヤツ)