横スクロールアクションの敵

ホーム フォーラム CF2.5使用法全般 横スクロールアクションの敵

11件の投稿を表示中 - 1 - 11件目 (全11件中)
  • 投稿者
    投稿
  • #13987
    pussn_boot
    参加者

    横スクロールアクションの敵の判定についてです。

    PMO等を使わずに自作する事を前提として

    ・左右に移動する
    ・壁や足場の端に来るとUターンする
    ・ジャンプする敵もいる
    ・攻撃するとノックバックする

    という挙動を考慮した際に画像のように7つの判定の同期が必要かなと思うんですが、
    敵の数が増えたときに重くならないか心配です。

    いくつか開けるサンプルを手に入れたのですが、
    左右移動しないとか壁をすり抜けて飛行するとかで条件に合う挙動がなく
    参考にはできませんでした。

    一般的に皆さんどうやって作っているのでしょうか?

    Attachments:
    You must be logged in to view attached files.
    #13992
    pussn_boot
    参加者

    判定の数はこのままで、画面外の敵は最初に生成しないという方向で考えたいと思います。

    #13993
    shinon
    参加者

    こんにちは。

    敵の判定はひとつだけにして、壁とか床を種類わけするとかどうでしょう。足場がなくなるところには反転用のオブジェクトを非表示でおいておく感じで。実際やるとなると天井と床はサンドイッチ状にセットでおく感じになると思いますが。あと壁も右側の壁左側の壁を別オブジェクトとして作っておいてこれもサンドイッチ状でセット配置する感じとか……。

    こうしておけば敵がいくら増えても大した負荷にはならないと思いますが、フィールドが大きい場合壁とか天井がどれだけ負荷になるかはなんともいえません。

    Attachments:
    You must be logged in to view attached files.
    #13995
    pussn_boot
    参加者

    >shinon様

    ありがとうございます。それも考えました。
    今現在8方向に移動するリフトの制御を同じように衝突判定で切り替えてるのですが、
    数が増えるとステージ作成が大変なので判定はこのままでいこうかなと思います。

    ただ、For eachオブジェクトが画面スクロール外になると消えてしまいます。
    まだ詳しく確認できてないのですが
    「動作領域から離れすぎてる場合に破壊」のチェックを外してますので
    「表示領域から離れすぎてる場合に無効」の選択肢が原因だと思います。
    軽くする為に画面外のオブジェクトは止めたかったのですが
    デフォルトでオフにする機能が使えないとなれば面倒ですね。

    • この返信は6年、 11ヶ月前にpussn_bootが編集しました。
    #14011
    terami
    参加者

    横から失礼します。

    私もまだ習熟できていないので間違っているかもしれませんが、
    敵が画面内か外かのイベントは条件に敵のX座標<=XRightFrame,敵のX座標>=XLeftFrame(必要ならY座標も)とすれば画面内、敵のX座標>=XRightFrame,敵のX座標<=XLeftFrame(必要ならY座標も)とすれば画面外になります。アクションはフラグを使えば動かせたり止めたりできます。

    横移動のイベントは条件に常に実行でアクションにX座標変更から数式で現在のX座標+変数A(1フレームに動かしたい方向の距離)というやり方をとっています。
    反転も変数で制御させています。
    変数Bに1ずつ加算させて仮に変数B=120の条件のときに、変数Aに変数A*-1というアクションを組むと反転します。その際同じイベント行に変数B=0を入れてください。
    これで120フレーム移動して行ったり来たりします。

    上記のやり方なら判定用の画像は必要ないので軽くなると思います。

    #14013
    pussn_boot
    参加者

    >terami様

    敵の挙動が不変ならいいんですが、ノックバック等プレイヤーの干渉によって変動するので、今後の拡張性も考慮してこの判定数は仕方ないと納得する事にしました。
    Unity使いのプログラマー(脱出専門ですが)数人に聞いた所、代替案が出なかったのでこれで行こうと思います。

    画面外の条件はわかっているのですが、同じコインでも画面外にスクロールするだけで消えるものと消えないものがあったりするバグに遭遇してしまいました。
    それ以降、別の作業をしていたので触れてませんが、デフォルトのプロパティの仕様も検証しないといけなさそうです。

    #14014
    shinon
    参加者

    画面外に行くと消えたり消えなかったりという症状は気になりますね。
    できればデバッグ用にコインの存在数を常に画面内に表示しておいて、実際にオブジェクトが消えているかどうか確かめてみてほしいところです。単純に表示が勝手に非表示(それもおかしい話ですが)になってるだけかもしれないので。あるいは変な座標位置に勝手に飛ばされてるとか……。

    #14033
    pussn_boot
    参加者

    >shinon様

    【表示領域から離れすぎている場合にオブジェクト無効】の無効というのが停止状態だと勘違いしてたのですが、正しくは「移動および衝突への反応はしなくなる」でした。
    なので消えていたのではなく、地面をすり抜けて画面外に落下していたようです。

    ただ、コインに関しては毎回でしたが、敵に関しては始めのフレームでは起こらずに、フレームをリセットした後に起こっていたので、混乱してしまいました。
    消えるのと消えないのがあったのはクローンで作ったはずのコインが一つだけプロパティが変わっていたのとコインと敵の挙動の違いが混同してしまっていました。

    【表示領域から離れすぎている場合にオブジェクト無効】をいいえにすると今の所問題は起きなくなりました。

    #14081
    pussn_boot
    参加者

    敵に複数の判定を持たせて常に動機させる方法で実装していたのですが、Android実機でテストするとものすごく重くなってしまいました。
    PCでのテストプレイだとFPSも安定して問題ないのですが、実機だと敵が5体程同じ画面内にいると処理落ちしてしまいます。

    根本的に作り方を変えてみようとshinon様の案で考え直す事にしました。
    ただ、地形に合わせて手作業で判定を置いていくのは大変なので画像のように自動で生成と間引きをするようにしました。

    結果として実機での動作は安定したのですが、生成の一瞬だけオブジェクト数が5000を越え、間引いた後も500越えしてしまいます。

    ForEachループを回し続けるのはかなり処理的に負担がかかるのでしょうか?
    また、ただ存在するだけの単純なオブジェクトの数はそこまで処理に影響がないのでしょうか?

    Attachments:
    You must be logged in to view attached files.
    #14085
    shinon
    参加者

    自動で判定生成しているかんじなんですね。生成の瞬間にオブジェクト数がけっこうな数になるのが気になりますね。添付画像のようなかんじでするのはだめですか。これはこれでややこしいですが、上下左右から走査していって壁床類に当たったら判定生成するようなかんじです。

    私もフィールド作成するとだいたい壁判定だけでオブジェクト数が300~400くらいは軽くいくことがあるので割と気になってたりしますが、PCで動作させてるかんじでは特に問題になったことはないですね。特に移動などしない位置固定オブジェクトで、あたり判定のみするだけであれば多少数が多くてもそれほど重くならない印象はあります。

    あと、動作を軽くするという点では検証済みかもしれませんがアプリのfpsを30とか24とかに落としてしまうとか(初期値は60)グラフィックモードを1670万色より減色するとか文字列オブジェクトやカウンターオブジェクトは使いすぎないようにするとかでしょうか。

    このあたりはASDさんのお話を伺ってみたいところです。

    Attachments:
    You must be logged in to view attached files.
    #14087
    pussn_boot
    参加者

    >shinon様

    ちょっと難しいですけど、そういうやり方もあるんですね。

    画像のように判定が続くときはスケールを伸ばして増やさないようにできればオブジェクト数もかなり減ると思うんですけど、かなり複雑になりそうで今の所は諦めています。

    あとちょっと話は逸れるんですが、PCとAnndroid実機での動作の違いを発見しました。

    地面や天井の画像の凹凸に忠実にオブジェクトが反応すると都合が悪いので
    ①背景オブジェクトの障害物の「ボックス判定を仕様」にチェックを入れた場合
    ②アクティブオブジェクトの「ファイン判定」のチェックを外した場合
    Androidのみ判定がずれます。

    ①は原因がわからないのですが、②は
    PC:現在再生中のアニメーションシーケンスの大きさで判定を取る
    Android:全アニメーションシーケンスから一番大きい画像で判定を取る
    となっているような気がします。

    検証にそこまで時間を割けられなかったので、両方ともファイン判定なら問題ないという事を踏まえて
    現在はファイン判定にしたブロックから判定を生成して地形は別レイヤーで置くというやり方にしました。

    Attachments:
    You must be logged in to view attached files.
11件の投稿を表示中 - 1 - 11件目 (全11件中)
  • このトピックに返信するにはログインが必要です。