AIを学習しておりますが こちらの意味がわからず。。
ビヘイビア ツリーのクイックスタートガイド
ビヘイビアツリーを読み込む際に
Event Begin Play ではなく
Event On Possess こちらを使用している理由は?
図のように
Event On Possess でつなぐと character をGETできず
Event Begin Play ではうまく動作します。
ご存知の方、アドバイスよろしくお願いします!!
AIを学習しておりますが こちらの意味がわからず。。
ビヘイビア ツリーのクイックスタートガイド
ご存知の方、アドバイスよろしくお願いします!!
以下の例のようにPossessをプレイヤーが実行するようにしたりすると、それぞれのキャラクターがPossessされたときにそれぞれOn Possessが実行されると思います。
というわけで
ビヘイビアツリーを読み込む際に
Event Begin Play ではなく
Event On Possess こちらを使用している理由は?
ですが、これはPossessした後にAIの実行が始める必要があるのでこうしたのだと思います。が、今回に限っては
ので、BeginPlayの後にRun Behavior Treeしても動作はほぼ同じはずです。
あとSet Value as Objectの方ですが、On PossessでGet Player Characterが失敗する理由は
良く分からないです。しかし、成功するならSet Value as ObjectだけBegin Playから実行するか、
あるいはAIコントローラではなくキャラクターのBegin Playで実行しても良いかもしれません。
上記回答に補足です
OnPossess時点でGetPlayerCharacterが失敗している理由は、PlayerControllerの初期化タイミングが間に合っていないのだと思われます
起動時の各Actorの初期化は並行して実行されるので、各Actorが最速のタイミングで別Actorの情報を取りに行くと、まだActorが存在せず、取得できない事があります
BeginPlayで問題が出ないのは、初期化タイミングに間に合ったからでしょう
起動時のBeginPlayはある程度足並みを揃えて呼ばれるようなので、Assetが事前にロードされているEditor上であれば全部揃ってから呼ばれる可能性が高いです
OnPossessはBeginPlayとは別のタイミング(Possessされた瞬間)に実行されるので、タイミングが合わないことが考えられます
今回の場合だとBeginPlayよりOnPossessのほうが早いタイミングで呼ばれるのでしょう
このあたりの動きはEditorとPackage(事前ロードの有無)でも変わってくるので、Editor上では動いたのにPackageでは動かない、という事も起こりえます
ですのでそのあたりを認識し、別のActorを参照するものはそのタイミングでそのActorが本当に存在するのかどうかきちんとチェックしつつ処理を行う必要があります
ご回答ありがとうございます! Posessの説明ありがとうございます。
該当する文献があまりなく理解が進みました。
GetPlayerCharacterが失敗している理由もなるほどです。
誤解ないように
ビヘイビア ツリーのクイックスタートガイドでは
別のやり方でPlayerCharacterを参照しているのでこちらでは
うまく参照できます。
ただ、「[Auto Possess AI] 設定を [Spawned] にすると
こんなふうになってしまいます。w
AutoPossessAIをSpawnedにすると、Play時にLevelに置かれている場合にAIControllerが生成されません
なので、最初からLevel置いて動かすには PlaceInWorld
か PlaceInWorld or Spawned
に設定しておく必要があります
また、Character(CharacterMovement)はControllerがPossessされていないときに物理計算を行わない機能があります
無効化する場合はCharacterMovementの Run Physics with No Controller
をONにしてください
なるほど、どうり僕のテストでも宙に浮くままでした。
”無効化する場合はCharacterMovementの Run Physics with No Controller
をONにしてください”
これは知らなかったので悩んでいました、もっと勉強します。
ありがとうございました。