6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unreal Engine 4 (UE4) その3Advent Calendar 2020

Day 22

BPオンリーのプロジェクトでのガンビットAIライブラリ「JohnnyGambitLibrary」の使い方

Last updated at Posted at 2020-12-21

#はじめに
この記事はUnreal Engine 4 (UE4) その3 Advent Calendar 2020 の22日目の記事です
以前作成して地道に更新している自作ライブラリのJohnnyGambitLibraryですが、C++プロジェクトを前提としている部分が大きかったのでBPのみで構築するためのHowtoを書きました

#JohnnyGambitLibraryとは?
OSSとして公開している意思決定AIに絞ったゲームAIライブラリです
UE4には標準でbehaviortreeなどの高機能なゲームAIの仕組みがありますが、ゲームのジャンルによっては高機能すぎてオーバースペックだったりします
そんな時に拡張が楽でちょっとした意思決定AIを作成したい時に使うためのライブラリです
特徴としては、導入までをプログラマが対応しておけば後の拡張は最低限のUE4の知識を持つプランナーだけである程度複雑なAIも組めるようになる点です

イメージとしてはFF12のガンビットAIを意識しています
FF12

公開時の記事はこちら
リポジトリはこちら

上記の記事で詳細な解説はしてあるのでご覧ください
構成としては以下のようになっています

JohnnyGambitLibraryの構成図

想定する使用シチュエーション

  • コマンドバトルなどの複雑な自律AIが必要でない時のEnemyAI
  • 簡易的なメタAI
  • プレイヤーがAIを構築できるようなゲーム時の味方AI

などを考えています

#Howto
###環境
UE4.25.4
Windows10

今回はTopDownTemplateにJohnnyGambitLibraryを適用させて画面をクリックしたところが右上、右下、左上、左下のどこか判定するゲームAIを作成します

今回作成したプロジェクトはGithubで公開しています

##STEP 1. プロジェクトにJohnnyGambitLibraryプラグインを追加する
プロジェクトへのPluginの追加方法は色々なところに書かれているので省きます
わからない人は以下の記事を参考にしてみてください
Pluginフォルダを作成してその下に落としてきたソースを配置してプロジェクトのuprojectファイルをダブルクリックしてコンパイル走らせるだけなので初心者でも出来ると思います
CRIさんの導入記事
C++でのPlugin導入方法(途中までは一緒)

##STEP 2. ガンビットAIを使いたいActorへGambitAIComponentクラスを追加する
GambitAIComponentはガンビットAIの本体となるクラス

※画像ではTopDownCharacter
image.png

image.png

##STEP 3. GambitAIの条件判定となるActorのメンバ変数にGambitAIParameterクラスを追加する
GambitAIParameterはGambitAIComponentが条件判定を行う際に必要なパラメータ群を管理するクラスです
GambitAIComponentを持っていないクラスでもGambitAIParameterを持っていればGambitAIの対象に出来ます
※画像ではTopDownCharacterにのみ追加しています

image.png

###STEP 3-2. GambitAIParameterのインスタンスを生成する
BegeinPlayなどで追加したメンバ変数のインスタンスを生成してあげましょう
GambitAIParameterはUObjectしか継承していないのでSpawnActorは使えません
なのでこの記事を参考にしてGambitAIParameterを生成しましょう
image.png

##STEP 4. AIConditionクラスを継承したガンビット(条件判定)クラスを作成する
このクラスがJohnnyGambitLibraryのキモとなります
なるべく、一つのAIConditionで単純な構成にしたほうが後々組み合わせしやすくなります
今回作成するのは以下の4つを作成します

クラス名 概要
Gambit_Left クリックした場所が左側か?
Gambit_Right クリックした場所が右側か?
Gambit_High クリックした場所が上側か?
Gambit_Low クリックした場所が上側か?

STEP 4-2. DoAICondition関数の中身を作成する

作成したAIConditionクラスにはDoAIConditionというそのAIConditionが成立するかどうかの判定する際に呼ばれる関数があります
この関数がTRUEの時そのガンビットは条件を満たしているということになります
Myには自身のGambitAIParameter、TargetListにはターゲットとなる対象のGambitAIParameterが入っているので、GetValueToFloat・GetValueToInt・GetValueToStringのいずれかを使って値を取得し条件判定を作成していきましょう

※今回はターゲット情報はないので使っていません
※画像はGambit_Left
image.png

##STEP 5. FDataTableGambitAISheetを継承したDataTableを作成しAIConditionクラスをアクションを設定していく
ActionConditionClassListには複数のAIConditionクラスが設定可能なので、今回は「右上」「右下」「左上」「左下」となるように組み合わせて設定していく
この時設定したActionIDがヒットした時に取得できることになります

※この時Priorityを設定するとより値の高いものから優先的に条件判定がされます
※同Priorityの場合、より重みがあるアクションがよりHITする確率が高くなります

image.png
image.png

###STEP 5-2. GambitAIComponentを持つActorのBeginPlayなどで作成したDataTableを指定してInitializeAIを行っておく
image.png

##STEP 6. 条件判定につかう値が変動したタイミングでGambitAIParameterにSetParameterをしていく
※画像では画面クリック時にSetParameterしている
image.png

##FINAL STEP 7. GambitAIComponentのThinkActionを実行しGetCurrentActionID関数でヒットしたActionIDを取得する
ThinkActionを実行すれば、自身のGambitAIComponentが持つDataTableに設定された中から条件が合致するものを判定した結果のActionIDがGetCurrentActionID関数で取得できます
そのIDを元にゲーム固有のアクション処理を実行してください
サンプルではPrintStringしているだけです

image.png

#動作結果
image.png

#あとがき
いかがだったでしょうか
機能の内容としてはシンプルなものになっていますし、正直ライブラリといってもコード量もそこまで多くはありません
ですが、behaviortreeが高機能すぎて正直オーバースペックだしこれだけのためにプランナーにbehaviortreeの使い方を覚えてもらうのはちょっと…
というシーンではちょうどいいサイズ感になっているのではないでしょうか
AIConditionクラスの組み合わせで自由に新しい条件判定のアクションが作成できますし、BPの使い方さえマスターすればAIConditionクラスをプランナーだけで作成してもらうことも可能なサイズ感になっています
試しにつかってみていただけるととてもうれしいです

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?