Page 1 of 1

OnCollisionEnterや演算ノードの使い方

Posted: 2017/08/14 02:31
by AnEggJP
スミマセン恥ずかしながら初歩的な使い方が解りません。
https://drive.google.com/open?id=0B_sVQ ... XJwWW9FTTA
キャラクター(JC)がTag(cube)の上に乗ったらキャラクターのモーションを切り替えたいのですがよく解りません。
演算ノードのOnCollisionEnterTransitionなどもマニュアルをみても使い方がよく解らないのですが。。
Arbor2のバージョンは最新2.1.6
windows8.1です。
よろしくお願いします。

Re: OnCollisionEnterや演算ノードの使い方

Posted: 2017/08/14 03:48
by caitsithware
ご確認していただきたい点が2点あります。

1つめ、Tag(cube)はCubeゲームオブジェクトに設定されていますか?

設定されていないとOnCollisionEnterTransitionでIs Check Tagのチェックを付けている場合は、相手のゲームオブジェクトに該当タグを設定しないと次のステートに遷移されません。

2つめ、OnCollisionEnterTransitionから遷移したステートにAnimatorStateTransitionが追加されていますが、ここではAnimatorでのステートに合わせて遷移させたいのではなくモーションを切り替えたいということでしょうか?

もしモーションを切り替えるのでしたら、AnimatorStateTransitionは削除し、代わりにAnimator/CalcAnimatorParameterを追加してください。
CalcAnimatorParameter
CalcAnimatorParameterはAnimatorのパラメータを変更するBehaviourですので、Animator側での遷移条件に合わせて値を設定するようにしてみてください。

この辺りは原則として、名前にTransitionとあるものは条件に従ってステート遷移する専用のBehaviourと覚えていただけると混乱しにくくなるかと思います。

また、今回の場合は演算ノードによる値の受け渡し等は必要なさそうです。
CollisionColliderCalculatorノードは削除してしまっても問題ないかと思います。

以上となります、ご確認よろしくお願いいたします。

Re: OnCollisionEnterや演算ノードの使い方

Posted: 2017/08/15 06:37
by AnEggJP
残念ながら動作しませんでした( ノД`)

>1つめ、Tag(cube)はCubeゲームオブジェクトに設定されていますか?
https://www.dropbox.com/s/jfv5mqw2o339u ... 8.png?dl=0
CubeゲームオブジェクトをTag(cube)に設定しています。

>2つめ、OnCollisionEnterTransitionから遷移したステートにAnimatorStateTransitionが追加されていますが、ここではAnimatorでのステートに合わせて遷移させたいのではなくモーションを切り替えたいということでしょうか?

その通りなのですが動作しませんでした。
https://www.dropbox.com/s/no4tfwxwi86qy ... 4.png?dl=0

runステートに遷移しているようなのですが…(しない時もあり??)

OnCollisionEnterは常駐ステートの中にしかなく、
常駐ステートを作る事が正しいのかもよく解りません。

また次のステートは「開始ステート」になっているのですが
これでいいのかも判りません??
(通常ステートを新規に作る場合は「開始ステート」しかならないので)

ステートの作り方が悪いのか
何か設定が間違っているのかも解らないので(Animetorの遷移はBoolです)
申し訳ないのですがよろしくお願いします。

Re: OnCollisionEnterや演算ノードの使い方

Posted: 2017/08/15 09:53
by caitsithware
スクリーンショットを見た感じ特に問題はなさそうですね・・・

張っていただいたスクリーンショットからは判断できないのでもし間違っていたら申し訳ないですが、
ほかのスクリプトなどで「移動処理中ならAnimatorのrunをtrueにする」ような処理が入っている場合も当然ながら上手く動作しないため、そちらも確認していただければと思います。
もしそういった処理がある場合はStateBehaviourを自作して移動処理を無効にする処理を追加しなければなりません。

ちなみに、コンポーネントそのものを無効にしても大丈夫であればSendEventGameObjectが使えます。
SendEventGameObject
OnStateBegin()の+ボタンを押してイベントを追加し、GameObjectを設定、Functionを無効にしたいコンポーネントのenabledを指定してチェックは付けないでいると該当ステートに遷移した瞬間にコンポーネントが無効になります。
他のステートに遷移した際に有効にしたい場合は有効にしたいステートにもSendEventGameObjectを追加しenabledのチェックを付ければ再び有効になります。

ひとまず今回の件については以上になります。ご確認よろしくお願いします。

最後に補足として、開始ステートや常駐ステートの使いどころについて簡単にですがまとめてみました。
よろしければこちらもご覧ください。

■開始ステート

ゲーム開始時やArborFSMが付いたオブジェクトが生成されたタイミングで一番最初に開始されるステートです。
いわばステートマシンの入り口的なステートになります。
たとえばモンスターが発生した時はよく発生モーションなどが再生されますが、その発生モーションの再生&終了待ちなどを開始ステートで処理するのが適しています。
特に発生モーションなどがない場合でも、一番初めにどういった状態かが重要です。
モンスターを例にすると最初はプレイヤーが近づくまで待機するんでしたら、近づいたら遷移する処理を開始ステートで行うようにします。

今回の場合ですと、開始ステートがCalcAnimatorParameterを処理するようになっていますが、特に開始時にAnimatorのrunを設定する必要がないのでしたら若干無駄な処理になってしまいますので、今一度、開始時がどういう状態かの見直しをしたほうがよいかもしれません。

■常駐ステート

通常のステートの遷移状況によらず、常に処理されつづける特殊なステートです。
たとえば、モンスターの現在ステート(巡回中や攻撃中など、いま行っている状態)に関係なく、HPが0になったら死亡モーションを再生して消したい場合があったとします。
この場合は、HPが0になったかどうかで遷移する常駐ステートを作成して死亡ステートに遷移、死亡ステートでは死亡モーション再生などの処理を行う。というのが適しているかと思います。
このように常駐ステートからの遷移を用いないと、巡回ステートでもHPチェック、攻撃ステートでもHPチェック、とすべてのステートに同じ処理を追加しないといけないため管理が大変になってしまいます。
そんな時に共通の遷移条件を常駐ステートにまとめておけるのが一番の使いどころです。

今回の場合ですと、ステートが2つしかないため特に常駐ステートでも問題ありませんが、後々他のステートが増えた時にもしcubeに触れても強制遷移させたくなく特定の状態の時のみ(例えば移動中の時のみなど)に遷移するのでしたら、
常駐ステートにせず普通のステートにOnCollisionEnterTransitionを付けてrunステートへ遷移する、という形でもよいかと思います。
また、現状の2ステートでいうと開始時はcubeに触れるまで待機するということでしたら、OnCollisionEnterTransitionのステートを開始ステートにするのが適しているということになります。

長くなってしまいましたが以上です、何かの参考になれば幸いです。

Re: OnCollisionEnterや演算ノードの使い方

Posted: 2017/08/16 06:48
by AnEggJP
親切な回答有難う御座います。
自分としては狙撃されてそのあとのリアクションを取らせたい!
という考えでの実験だったので
シーンを作り直してもう一度チャレンジしたいと思います。
銃、弾丸を発射!(弾丸Tag) :arrow: それを受けてOnCollisionEnterもしくはOnTriggerEnter :arrow: アクション(モーションチェンジ)でやってみたいと思います。
長らくご迷惑をお掛けして申し訳御座いませんでした。
うまく使いこなせるように勉強します(^^;)