Event On Possess ってなんですか? ブラックボードでGETできない。

AIを学習しておりますが こちらの意味がわからず。。
ビヘイビア ツリーのクイックスタートガイド


ビヘイビアツリーを読み込む際に
Event Begin Play ではなく
Event On Possess こちらを使用している理由は?


図のように
Event On Possess でつなぐと character をGETできず
Event Begin Play ではうまく動作します。

ご存知の方、アドバイスよろしくお願いします!!

  1. Unreal Engineでのキャラクターは、PlayerControllerまたはAIControllerがキャラクターを「Possessする(持つ)」という構造になっています。それで、この「Possessする瞬間」がOn Posessです。

以下の例のようにPossessをプレイヤーが実行するようにしたりすると、それぞれのキャラクターがPossessされたときにそれぞれOn Possessが実行されると思います。

  1. それで今回の例なのですが、1-7で 「[Auto Possess AI] 設定を [Spawned] に変更することを推奨します。」の操作をしていると思うんです。
    ビヘイビア ツリーのクイックスタートガイド | Unreal Engine ドキュメント
    そうするとレベル上にキャラクターが作られたときにAIがPossessし、ここでOn Possessが1回実行されます。

というわけで

ビヘイビアツリーを読み込む際に
Event Begin Play ではなく
Event On Possess こちらを使用している理由は?

ですが、これはPossessした後にAIの実行が始める必要があるのでこうしたのだと思います。が、今回に限っては

  • [Auto Possess AI] 設定を [Spawned]にしている
  • そのままAIがPossessするキャラクターはそのままで変わらない

ので、BeginPlayの後にRun Behavior Treeしても動作はほぼ同じはずです。

あとSet Value as Objectの方ですが、On PossessでGet Player Characterが失敗する理由は
良く分からないです。しかし、成功するならSet Value as ObjectだけBegin Playから実行するか、
あるいはAIコントローラではなくキャラクターのBegin Playで実行しても良いかもしれません。

@Moss333

上記回答に補足です

OnPossess時点でGetPlayerCharacterが失敗している理由は、PlayerControllerの初期化タイミングが間に合っていないのだと思われます
起動時の各Actorの初期化は並行して実行されるので、各Actorが最速のタイミングで別Actorの情報を取りに行くと、まだActorが存在せず、取得できない事があります

BeginPlayで問題が出ないのは、初期化タイミングに間に合ったからでしょう
起動時のBeginPlayはある程度足並みを揃えて呼ばれるようなので、Assetが事前にロードされているEditor上であれば全部揃ってから呼ばれる可能性が高いです
OnPossessはBeginPlayとは別のタイミング(Possessされた瞬間)に実行されるので、タイミングが合わないことが考えられます
今回の場合だとBeginPlayよりOnPossessのほうが早いタイミングで呼ばれるのでしょう

このあたりの動きはEditorとPackage(事前ロードの有無)でも変わってくるので、Editor上では動いたのにPackageでは動かない、という事も起こりえます
ですのでそのあたりを認識し、別のActorを参照するものはそのタイミングでそのActorが本当に存在するのかどうかきちんとチェックしつつ処理を行う必要があります

1 Like

@jgoamakf
@T_Sumisaki

ご回答ありがとうございます! Posessの説明ありがとうございます。
該当する文献があまりなく理解が進みました。
GetPlayerCharacterが失敗している理由もなるほどです。

誤解ないように
ビヘイビア ツリーのクイックスタートガイドでは
別のやり方でPlayerCharacterを参照しているのでこちらでは
うまく参照できます。

image

ただ、「[Auto Possess AI] 設定を [Spawned] にすると
こんなふうになってしまいます。w

AutoPossessAIをSpawnedにすると、Play時にLevelに置かれている場合にAIControllerが生成されません
なので、最初からLevel置いて動かすには PlaceInWorldPlaceInWorld or Spawned に設定しておく必要があります

また、Character(CharacterMovement)はControllerがPossessされていないときに物理計算を行わない機能があります
無効化する場合はCharacterMovementの Run Physics with No Controller をONにしてください

2 Likes

なるほど、どうり僕のテストでも宙に浮くままでした。

”無効化する場合はCharacterMovementの Run Physics with No Controller をONにしてください”

これは知らなかったので悩んでいました、もっと勉強します。

ありがとうございました。

1 Like