前書き
TopDown Engine の著作権 © More Mountains.
キャラクタの作り方などいろいろと紹介をしましたが、Topdown Engineのスクリプトを組み合わせることでこんな機能を持ったキャラクタも作ることができることを紹介していこうと思います。
今回は「ランダムに動きながらアクションボタンを押すとダイアログメッセージを出してくれるNPC」になります。
必要となる処理としては敵AIの設定と、プレイヤーが一定の範囲にいる場合にボタンを押下した時にダイアログを出す処理の2つが必要なります。
敵AIの設定方法とアクションボタンを押したときの挙動については以下に参考記事があるのでこちらも参照していただくとより理解が深まるかなと思います。
最終的には
- プレイヤーがNPCに近づくと「A」がポップアップする
- この状態でアクションボタン(スペース)を押下するとダイアログメッセージが表示される
- NPCはランダムでうろうろ移動する
といったNPCを作りたいと思います。
作業手順
行う作業としては
- NPCモデルの準備
- NPCのAIを作成
- プレイヤーが近づいてアクションボタンを押したときにダイアログを出す
上記の3つになります。それぞれの設定について説明していきます。
NPCモデルの準備
NPCの要素として
- NPCをランダムに歩かせる
- 一定時間歩いたら待機する
という要素が必要になります。そのためNPCには以下のスクリプトを追加する必要がります。
# TopDown Controller 2D など必須のスクリプトを除く
- CharacterMovement
- AIActionDoNothing
- AIActionMoveRandomly2D
上記3つあれば「NPCが移動」して、「ランダムに動く」ということができます。
スクリプトを設定する場所は以下のキャプチャを参考に設定してみてください。
![ランダムWalkNPCのインスペクター](https://aquaregia31.com/wp-content/uploads/2023/12/image.png)
NPCのAIを作成
NPCにスクリプトを追加して「NPCが移動」し、「ランダムに動く」ことができるようになりました。ただし、このままだとどうやって動くのか設定されていないため、ランダムに動くように指示する必要があります。そのためにはAIBrainで動く条件を設定してあげる必要があります。
以下が一定時間止まって、ランダムに動くためのAIBrainの設定例になります。必ずしもこの設定にする必要はないので参考程度に見ていただけると幸いです。
![AIBrain](https://aquaregia31.com/wp-content/uploads/2023/12/image-2.png)
それぞれのStateについてざっと説明していきます。
Detecting
ActionsにAIActionDoNothingを設定して何もしないことを設定しています。
TransitionsにRandomになる場合とDetectiongの場合を設定しています。分岐する条件はAIDecisionTimeInStateで振り分けています。AIDecisionTimeInStateを使うことで「一定時間が経つまでDoNothingを実行する、一定時間が経過したらRandomに移行する」という条件を作り出しています。
![AIDecisionTimeInState](https://aquaregia31.com/wp-content/uploads/2023/12/image-3.png)
Random
ActionsにAIActionMoveRandomly2Dを設定してランダムにキャラクタを動かすことを設定しています。
Detectingと同様にAIDecisionTimeInStateを使って「一定時間が経つまでMoveRandomを実行する。一定時間が経過したらDetectingに移行する」という条件を作り出しています。
![AIActionMoveRandomly2D](https://aquaregia31.com/wp-content/uploads/2023/12/image-4.png)
アクションボタンを押したときにダイアログを出す設定
ダイアログについてはMinimalSandbox2DにいるGuideのDialogueZoneオブジェクトを使用すると簡単です。MinimalSandbox2DにいるGuideからDialogueZoneが付与されたオブジェクトをコピーしましょう。
↓以下のオブジェクトの子オブジェクトにDialogueZoneがあります。
![Guide](https://aquaregia31.com/wp-content/uploads/2023/12/image-7.png)
NPCモデルの子オブジェクトにGuideからからコピーしたDialogueZoneオブジェクトを設定します。
![RoyalKnight_NPCのヒエラルキー](https://aquaregia31.com/wp-content/uploads/2023/12/image-6.png)
お好みでダイアログメッセージのパラメータを設定をします。ダイアログボックスの出現位置をNPCに追従するようにしたり、ダイアログログボックスの出現時間など設定することができます。以下は参考例になりますが、この状態だとダイアログメッセージはNPCに追従するような形になります。
![DialogueZone](https://aquaregia31.com/wp-content/uploads/2023/12/image-5.png)
動かしてみる
- NPCモデルの準備
- NPCのAIを作成
- プレイヤーが近づいてアクションボタンを押したときにダイアログを出す
上記3つを実装したNPCを動かしてみると以下のようにプレイヤーが近づいた状態でアクションボタンを押すとダイアログメッセージが出るようになります。汎用的なNPCとしては良いのではないでしょうか?
まとめ
今回はランダムに動きながら会話をするNPCの作り方について紹介しました。
Demoなどを見るとダイアログメッセージを表示するのは宝箱だったり、扉だったりで動かないオブジェクトに設定していることが多いかなと思いますが、今回紹介した方法はNPCにダイアログメッセージを追加しただけなので比較的簡単な方法で実装を行っています。
ほかにもDemoにあるオブジェクトから自分なりに拡張するとしたら「ランダムに動く大砲」や「プレイヤーから逃げるステージクリアポータル」などいろいろと思いついたりします。みなさんもTopdown Engineに慣れたらDemoにあるオブジェクトを自分なりに拡張してみてはいかがでしょうか?
次回は複数のAIBrainを切り替える方法について紹介しようと思います。
コメント