🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

5483閲覧

Unityでザワールドのような仕組みを実装したい

rin09

総合スコア5

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2019/12/05 05:11

Unity(2D)で横スクロールアクションを制作したいと思っています。
実装したいアクションの仕組みを説明します。
・プレイヤーが魔法のようなものを唱えると前方の一定範囲に特別な空間のようなものができ、その空間の中では敵の動きがスローモーションになる。
・その空間の中で敵に剣で攻撃しても敵は動かず、プレイヤーがその空間を解いた瞬間に蓄積されていた力、ダメージが反映されて吹っ飛ぶ。

ジョジョの「ザ・ワールド」、ゼルダの伝説ブレスオブザワイルドの「ビタロック」の対象が完全停止しないバージョン、のような感じです。

この一通りの仕組みを実装するためにはどのような処理を施せばよいでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

既にベストアンサーが付いてますが個人的に面白そうだなと思ったので書き残してみます。


いわゆるザワールド状態は、一種のデバフ(状態異常)として処理すると実装しやすいかもしれません。毒や麻痺みたいに継続的に処理する必要があって、「条件によって付け外しする必要がある」という意味でも状態異常っぽい挙動ではないかなと思います。

つまり、ザワールド空間の効果範囲に入ったらキャラに対して「時間減速」の状態異常を付与する。効果範囲から出たら(or効果時間経過後に)外す、ということですね。

キャラクター側は「時間減速」状態異常の「付いた瞬間」「付いている間」「外された瞬間」のそれぞれで時間減速向けの処理を行っていけるとよさそうですね。

次に、実装の方法について少し考えてみましたが、Physics向けとしてTime.timescaleを変更してしまうと、全体に影響が及ぶから効果範囲外まで変わってしまってダメそうです。

可能ならば効果範囲内のキャラのみにグループ分けしてTimeScaleを別々に指定する、ということが出来ると良さそうですが、これも出来ないようですね。

  • Unityの一時停止で止まるもの、止まらないもの【Time.timeScale】

https://tech.pjin.jp/blog/2016/12/20/unity_skill_7/

  • Unityでスローモーション

http://tsubakit1.hateblo.jp/entry/20140712/1405174180

となると、ザワールド中だけ移動を止める方法として以下のリンク先のrigidbody2D.isKinematicを活用する方法ならありかな?と思いました。検証してないので確証はないですが…。

  • Time.timescaleを変更せずにRigidbodyの一時停止&再開処理【Unity】【拡張メソッド】

https://gist.github.com/kankikuchi/251b0219a972b0692ce8

  • 【Unity】RigidbodyのIsKinematic(物理演算の影響の有無)を変えて実験

https://ekulabo.com/rigidbody-is-kinematic

これなら「基本的にPhysicsベースで動かしつつ、ザワールド中だけキャラクター側のコードで位置などの更新を掛ける」ような形にできる可能性があるかなと思います。

投稿2019/12/09 09:36

tor4kichi

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rin09

2019/12/09 13:26

ありがとうございます! 現在isKinematicで範囲内の敵を一時停止→解除させることは出来たのですが、これだど完全に止まってしまっているのでどうにかスローモーションにできないかと試行錯誤中です。答えて下さった内容にもあるようにTime.timeScaleだと範囲外にまで効果が及んでしまうので・・・
tor4kichi

2019/12/10 00:28

AddForceなどで得られていた動きを、時間減速中(isKinematic==true)の時だけ自前で管理しないと動いてくれないんですよね。既にご存知かもしれませんが、transform.position の手動変更をどうやるのか調べてみるといいと思います。 移動を自前でやる、ということは「時間減速中の移動速度」をVector2等として別に作った上で、transform.positionに加える(ベクトルの加算)必要があります。 「時間減速中の移動速度」は「Time.timescaleを変更せずにRigidbodyの一時停止&再開処理【Unity】【拡張メソッド】」にある、Velocity2DTmp で管理している 「Vector3 _velocity」(移動速度)を、時間減速の倍率を掛けて遅くした上で「時間減速中の移動速度」として扱えば表現できるんじゃないでしょうか。 ここにプラスして「時間減速中だけプレイヤーからの攻撃を一旦受け止めて、減速終了時に吹っ飛びやダメージを発生させる機構」を設ければよさそうですね。 あと、isKinematic==trueによってPhysicsによる衝突判定や押し戻しもOFFになるので、時間減速中のキャラが壁や時間減速の範囲コリジョンを無視してしまうことへの対処も必要になると思います。その点含めて採用するか検討してみてください。
guest

0

ベストアンサー

まず分かるところから
時間が半分に流れる物体は
・速度が1/2になります
・アニメ速度も1/2になります
・その物体に働く重力は1/4になります

なぜなら、自由落下させた物体は1秒後に5mの位置にある場合、2秒後は20mの位置にあります
なので、1/2はなく1/4しないと正しくなりません

あとは時間解除時に吹っ飛ぶですが、時間解除時にAddForceを使っていい感じにしてください
そもそも、重力が1/4ということは、
時間が半分になっている物体には4倍の力を加えないといけません
なのであのように吹っ飛ぶというのは物理的にはおかしいわけです

投稿2019/12/05 05:35

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問