Page 1 of 1

ParameterContainerのGetComponentについて

Posted: 2019/09/24 11:37
by Shirasu
viewtopic.php?f=6&t=2568 : FSMの演算ノードGet Parameterでコンテナを選択すると編集不可になる
viewtopic.php?f=3&t=155 : 外部スクリプトからのParameterContainerの操作

上記トピックに関連した質問です。

Arbor3.6.3, Unity2019.2.6f1で開発中のプロジェクトにおいて、複数のArborFSMと一つのParameterContainerを持つオブジェクトの、Containerだけを他のスクリプトでGetComponentしようとしましたが、正しくGetできませんでした。

ParameterContainerの位置を全てのFSMより上にしてもGetできず、ArborFSMを全て消すと正しくGetできました。
ミニマムなプロジェクトで再現しようとしましたが、どうしても正しくGetできてしまいました。

この正しくGetできない現象は仕様でしょうか、なにか環境の問題でしょうか?
また、不定のオブジェクトのパラメータが知りたい(GetComponentせざるを得ない)という状況において、パラメータを外部スクリプトに任せる以外の解決策はありませんか?

Unity初心者ゆえ至らぬ点があるかもしれませんが、ご教示いただけますと幸いです。

Re: ParameterContainerのGetComponentについて

Posted: 2019/09/24 13:04
by caitsithware
Shirasu wrote: 2019/09/24 11:37 Containerだけを他のスクリプトでGetComponentしようとしましたが、正しくGetできませんでした。
いくつか確認していただきたい点があります。
  • 正しくGetできないというのは、「GetComponentの戻り値がnullになっていた」ということでしょうか?
  • nullでない場合、GetComponentで取得したいParameterContainerと同じGameObjectにあるというArborFSMに内部パラメータ(ArborEditorウィンドウのサイドパネルでのパラメータ)を設定していて、その内部ParameterContainerが取得されてしまっていますか?
上記2点により、もし内部ParameterContainerが取得されていましたら仕様となります。
(ArborFSMはInspectorからは不可視のParameterContainerを持っており、Unityは不可視かどうかにかかわらずGetComponentするという仕様)

この場合、本来取得したいというParameterContainerを子オブジェクトに移動するなどして、1オブジェクト内に1コンポーネントにして確実に取得できるようにするなどの対応が必要です。

もしnullの場合は、GetComponentするGameObjectが間違っている可能性がありますので、今一度Get周りをご確認ください。
Shirasu wrote: 2019/09/24 11:37 また、不定のオブジェクトのパラメータが知りたい(GetComponentせざるを得ない)という状況において、パラメータを外部スクリプトに任せる以外の解決策はありませんか?
不定のオブジェクトからGetComponentせざるを得ない状況というのは具体的にはどのような状況でしょうか?
公開に支障がない範囲で具体的な内容を教えていただければより詳しい解決策が見つかるかもしれません。

Re: ParameterContainerのGetComponentについて

Posted: 2019/09/24 14:28
by Shirasu
早速のお返事ありがとうございます。

確認しました所、たしかにArborFSMの内部Containerが参照されていました。Unity側の仕様だったのですね。

後半の質問については、余談ですが、例えばリアルタイムストラテジーゲームのように多数のユニットが現れ消える状況で、各ユニットが攻撃相手のパラメータ(かメソッド)をGetしたがるという状態のことを言っていました。どうしても敵ユニットが時間と共に別物(不定)になるので。

ともあれ、ParameterContainerを子オブジェクトに避難するというのは盲点でした。これで間違いなくGetComponentできるので、後半の疑問は解決いたしました。

迅速丁寧なご対応をいただき、ありがとうございました。大変勉強になりました。

Re: ParameterContainerのGetComponentについて

Posted: 2019/09/24 23:02
by caitsithware
ひとまず解決できそうということで良かったです。
Shirasu wrote: 2019/09/24 14:28 各ユニットが攻撃相手のパラメータ(かメソッド)をGetしたがるという状態のことを言っていました。
攻撃&ダメージ処理に関しては、
「攻撃する側とダメージ受ける側のどちらがなんのステータスを持っていて、そのステータスをどう受け渡すのがスマートか」
という問題のようですね。

余談として、あくまで私の考えですが、
  • 攻撃する側が持つ攻撃力等のステータスのみをダメージ受ける側のTakeDamageメソッドに受け渡し
  • 受ける側は受け取った攻撃力等と自身の防御力等を考慮してダメージ値計算、ライフを減らす
という形式が良いと思います。
この利点としては、相手がなんのパラメータを持っているか直接見に行く必要がなく、TakeDamageメソッド呼び出しで受け渡すステータスさえあれば、ユニットによる攻撃以外にも地形ダメージだろうとなんだろうと応用が利く(攻撃側もTakeDamage呼び出しだけで済むのでスッキリ)
という点です。

あくまで一例なので、ご参考までに。
(ダメージ処理以外でも相手のパラメータ知りたい場面もあるかとは思いますが、ここではひとますダメージ処理に限った話にしています)