unity Behavior Designer使い方 TacticalPack

どうもききです。

今回はunityのAIアセットBehavior Designerに関する記事を書きたいと思います。

今回はBehavior Designerの拡張アセットのTacticalPackについて解説したいと思います。

Behavior Designerの拡張アセットには

MovementPack(移動)

TacticalPack(戦術)

FormationPack(フォーメーション)

と三つに分かれておりTacticalPackは攻撃系のAIを簡単に作成するためのパックになっています。

MovementPackはあらかじめ用意されたタスクを使用すれば簡単に使えましたがTacticalPackはちょっとややこしいのです。

基本的な使い方について

TacticalPackはあらゆる攻撃の処理を汎用化させるためのものだそうです。

例えば銃弾を撃って攻撃したりまたは剣で斬って攻撃したりなど攻撃の処理はゲームによって様々で攻撃やダメージの判定なども全然違ってきます。

それらをAttackタスク一つで終わらせるというのが目的になります。

MovementPackはseek(追跡)タスクとか用意された便利タスクを追加するだけで簡単に使えますがTacticalPackの場合はそうもいきません。

Attack(攻撃)タスクを追加しただけで勝手に攻撃アニメーションや銃弾を撃ってくれるはずがないので攻撃方法を指定する必要がありますね。

クラスの継承する

TacticalPackのAttackタスクでキャラクターに攻撃させるためにはまず別で攻撃に関するスクリプトを用意してIAttackAgentを継承する必要があります。

そこから継承されたいくつかのメソッドを使用します。

public float AttackDistance()
攻撃範囲を指定

public bool CanAttack()
攻撃可能かどうか

public float AttackAngle()
攻撃可能な角度を指定

public void Attack(Vector3 targetPosition)
指定したターゲットに攻撃する(中にアニメーションとか実際の攻撃方法を書いておく)

これらを用意した後で攻撃タスクを実行します。

Behavior Designerで攻撃だけのツリーを構成しようと思ったら結構ややこしいです。

TacticalPackはこれ一発で済むのでこれはこれで便利なのかもしれません。

ダメージ処理に関する記事はまた次回書こうかと思います。

 

unity Behavior Designer使い方スクリプト編

どうもききです。

今回はunity Behavior Designer使い方について解説したいと思います。

今回はタスクの中身のスクリプトについて解説していきたいと思います。

タスク用のスクリプトの書き方ですがまず最初に名前空間にこの3つを宣言します。

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

次にクラスを宣言しクラス名の後に:Conditional、Actionなど条件タスクなのか行動タスクなのか宣言します。

public class currenthpGet : Conditional

次に変数を宣言します。

public SharedGameObject target;

public SharedFloat moveDistance = 2;

Behavior DesignerにはShared型の変数がありますがSharedは共有変数でありpublicは外部のGameObjectと関連付けます。

外部のGameObjectの値が変われば自動的にtargetの値も変わります。

次に

public override void OnStart()
public override TaskStatus OnUpdate()

を継承します。

OnStart()は最初に実行されそれ以降はOnUpdate()の中身が実行されます。

通常のUpdate()メソッドは永続実行ですがBehavior DesignerのOnUpdate()は再評価時に再び実行されるので基本的に一回だけ中身が実行されて止まります。

次に値の代入などについて

Shared変数の中身を取得したい場合は.valueを宣言する必要があります。

var targetPosition = target.Value.transform.position;

Float value = moveDistance.Value + 1など

OnUpdate()の中身を永続的に繰り返したい場合
return TaskStatus.Runningを記述します。

最後にタスクスクリプトにはかならず

return TaskStatus.Failureとreturn TaskStatus.Successを記述しないといけませんFailure(失敗)もしくはSuccess(成功)を返すと終了します。

 

 

 

 

 

 

 

unity Third Person Controller使い方AIを作る

どうもききです。

今回はtpsアセットThird Person Controller使い方を解説したいと思います。

今回は敵AIを作りたいと思います。

まず前回自キャラを作るときにやったように敵キャラを作ります。

次にNavMashAgentとNavMashAgentBridge二つのコンポーネントを追加します。

NavMashAgentはAIのスクリプトで移動させるのに必要なものです。

NavMashAgentBridgeはキャラクターが移動する際に歩くアニメーションが自動で作動してくれるものです。アニメーションタスクを追加しなくてもキャラクターが移動するだけで勝手に歩いてくれるようになります。

 

 

unity PCスペックについて

どうもききです。

今回はunityでゲーム開発をするのに必要なpcスペックについてお話ししたいと思います。

自分はcorei5でグラボはGTX970を積んでます。

2dゲームを開発する場合はノートpcでもなんでもいいんですが

3dゲームの場合そこそこ高スペックなpcが必要になります。

まあゲーム開発するのにグラフィックボードが必要なのかどうかはなんともいえませんが

ノートpcでは苦しいでしょう。

実際テストプレイするだけでも再生にかなりの時間がかかりますし

読み込みだけで作業が進みません。

実際にグラフィックボード積むか積まないかだけでもかなり変わってきます。

高グラフィックのオブジェクトだとテクスチャが表示されなかったりします。

アセットを読み込むにもなんやかんや時間がかかるので

快適にゲーム開発を進めたい場合高スペックpcが必要です。

ゲーム開発用pcとゲーミングpcどちらがいいか悩む人もいますが

普通にゲーミングpcでいいです。

 

 

 

 

unity Behavior Designer使い方 bool比較

どうもききです。
今回はBehavior Designerの比較について解説したいとおもいます。
人間とAIの最大の違いは物事を認知できるかどうかです。

視界にターゲットが入ったらターゲットを認知することは簡単です。

では視界からターゲットが消えたらどうでしょう。
視界から消えた瞬間に消えたという明確な情報をAIは持っていません。
重要なのは視界にいないときではなくさっきいたものが消えたかどうかです。

ではどうすればいいかというと状況Aと状況Bを比較するんです。

Mathタスクにはsetboolやbool comparisonといった便利なタスクが用意されています。

setboolはbool変数のtrueかfalseを設定できるタスク

bool comparisonはbool 1とbool 2を比較できるタスクになります。

まずvariablesでbool変数をつくりそれを運用します。

この画像ではupdateという名のbool変数を作成しました。

 

ではツリーの解説をしていきたいとおもいます。

まずターゲットが視界に入ったらsetboolでさいほど設定したbool変数の値をtrueに設定します。

ターゲットが視界から消えたらこの枝を中止し次に右隣の枝を実行します。

bool comparisonでbool変数がtrueかどうかを判定します。

trueだったらbool変数をfalseに設定して終了します。

この流れで視界から消えたかどうかを認識することが可能です。

 

 

 

unity Third Person Controller使い方part2 AI

どうもききです。
今回はunity Third Person Controllerの使い方を解説していきたいと思います。
今回はAIエージェントの設定方法を解説したいと思います。

設定方法は前回とほぼ同様なので割愛しつつの解説になるとおもいます。

まずcharacterbuilderを開いてヒエラルキー上にあるキャラクターをcharacterにドラッグアンドドロップIsAIAgentのチェックボックスをオンにしてそのままビルドつぎにそのオブジェクトにAIAgentコンポーネントを追加します。

とりあえずこれでダメージ計算等は勝手にやってくれます。Respawnerというコンポーネントが追加されていますがこれはリスポーン(ゲームで死んだときの再生する奴)なので消しといたほうが無難です。1秒だと倒れる前に消えてしまいます。


あとの武器などの設定は前回同様です。
肝心のAIの操作ですが残念なことにこのアセットだけではできません。
できなくはないけど完成プロジェクトというのは既に完成されていてスクリプトの解読が必要になり非常に時間がかかります。
ただこのアセットは統合インテグレーションが多数あって別のアセットで操れるようになってます。
7500円も払ってAI使えないのはえぐいですが自由度が高い分評価が高いのかもしれません。
一応紹介しておくとbehavior designer(AIツリー作成アセット)やinventorypro(アイテムインベントリー作成アセット)などの拡張エディタなどが使えます。
とりあえずこのアセットは自キャラのみになりますね。

unity Behavior Designer使い方part5エネミーの基本的な動作

どうもききです。
今回は前回の記事に続きunity Behavior Designer使い方を解説していきたいと思います。今回は前回までのBehaviortreeの特徴を整理し基本的な流れを解説していきたいと思います。
ゲームの敵キャラクターであるエネミーの基本的な動作としては

ターゲットが視界に入る→追跡→攻撃範囲内→攻撃

の流れになると思います。とりあえずこの最低限の機能をBehaviortreeで再現したいと思います。

こちらがそのBehaviortreeになります。
解説していくと自分が生きている間このAIを継続する。パラレルで二つの動作を同時進行左は自分の現在のHPを常に取得する。

次に右側の動作ですが

何もなければ周囲をパトロールします。ターゲットが視界に入るとターゲットを追跡。攻撃範囲内に入ったら追跡を終了しターゲットの方向に向きつつ攻撃します。(useは武器の使用)

注目してほしいのはアボートタイプです。

lowerprioorityに設定されていると思います。

lowerprioorityは自己の優先なので優先順位が実行可能な場合優先順位が低いほうを停止して高いほうを実行します。

なのでターゲットが範囲内に入ったらseekタスクは停止して左側の枝が実行されます。

ターゲットが範囲外に出て視界にいた場合はまたseekタスクが実行され視界でも範囲内でもなければpatolタスクが実行されます。この処理の流れはRepeaterタスクによって永続し自分が死ぬまで継続されます。

以上が基本的な動作になります。

次回からさらに高度なAIを解説していきたいと思います。

Behavior Designerの使い方part6 Repeater

unity Third Person Controller使い方part3近接武器

どうもききです。

今回はunityでtpsゲームを作れるアセットThird Person Controllerの使い方を解説したいと思います。
Third Person Controller
今回は近接武器の設定方法について解説したいと思います。
このアセットの武器は銃がメインなのですが剣などの近接武器も一応使えます。一応というのはあんまり対応してないような感じで公式にも親切に解説していませんでした。
銃などはRayCastで簡単にダメージ処理が行えますが近接攻撃の場合ヒットボックスの設定とレイヤーの指定が必要になります。
まず剣を装備させます。

次に空のオブジェクトを作ってkatana(剣オブジェクト)と同じ位置に配置(positionの値ををコピーしてペースト)

次に先ほど作った空のオブジェクトにkatanaHitboxと名前をつけMeleeWeaponHitboxスクリプトとBoxColliderとRigidbodyの3つのコンポーネントを追加

次にAttackHitBoxの要素にkatanaHitboxをいれます。
次にAttackOptionのレイヤーをEnemyに設定し敵のレイヤーもEnemyに設定。

最後にサウンドとか衝突効果などを入れて設定完了です。とりあえずこれで近接攻撃でダメージを与えることができます。

本当はダークソウルみたいなゲームをつくりたいならこっちのアセットのほうが優秀なんですがこっちだとAIなどのインテグレーションが使えません。自由に手を加えるのが難しいのが不便でもあります。

Third Person Controller Template

unity アニメーション攻撃処理

どうもききです。
今回はunityで攻撃アニメーションを行ったときに実際にダメージ処理を行う方法について解説したいと思います。
ダメージ処理や当たり判定などは銃弾などは簡単ですが物理的に斬ったり殴ったり直接的な攻撃のダメージ処理は意外に難関なのです。
攻撃アニメーションでダメージと言われてもパッと浮かばないと思います。
では具体的にどうするかというと

攻撃アニメーションしたときに
自分とターゲットの距離が範囲内かつ前方視界にいたら攻撃でダメージ判定でいけます。
bool destase = Vector3.Distance(Target.transform.position, transform.position) <AttackDistance;

bool angle1 = Vector3.Angle(Target.transform.position – transform.position, transform.forward) <60f;

if(destase&&angle1){
ダメージ処理
}
これをアニメーションイベントに埋め込んでおけばOKです

unity Behavior Designer使い方part8 自動探索

どうもききです。
前回の記事に引き続きBehavior Designerの使い方を解説していきたいと思います。
今回はAIの自動探索について解説したいと思います。
AIの基本的な行動パターンとしてターゲットが視界に入ったら追いかける。
ここまではいいですね。
ここからさらに人間に近い思考パターンを加える必要があります。
人間に近い思考パターンとはつまり頭が悪いAIということです。
人間は機械に比べて頭悪いと感じますが逆に頭悪ければ悪いほどAIとしての性能が高いということです。
何が言いたいかというとターゲットが視界から消えるなどのハプニング起こった場合でも千里眼状態では不味いということです。

今回はターゲットが視界から消えた後自動探索するツリーを紹介したいと思います。

このツリーではターゲットを見失ったときターゲットを最後に見た最終地点に設定しその最終地点まで移動(seekタスク)します。
最終地点まで移動したらwanderタスクでターゲットが視界に入るまで辺りを放浪します。
パラレルセレクターは全ての子を実行しどれかがsuccess(成功)を返したら処理を完了します。親タスクに成功が返ることはAIの停止(完了)を意味します。

Until Successは条件付きタスクが成功を返すまで実行するタスク。

can see objectはターゲットが視界に入ったら成功を返すのでターゲットが視界に入るまで永続します。

次に右側ですがseekが条件付きタスクになってます。

このタスクは本来ターゲットを追跡するタスクですがターゲットの位置まで移動すると成功を返します。(今回の場合はターゲットを最後に見た最終地点ですが)

成功を返した場合wanderで辺りを放浪します。

wanderは永続タスクで成功を返さないのでターゲットが視界に入るまでこの処理は実行され続けることになります。