質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

1回答

2436閲覧

ベジェ曲線を使ったジャンプ加速を実装したい

Nomnom

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

1クリップ

投稿2018/11/10 07:49

操作しているキャラクターがジャンプした時、そのジャンプが最大高度に到達した際に僅かに滞空してから落下する処理を実装したいと思ってます。
今まで使用してきたのは下記のようなコードです。

C#

1float jumpVelocity = 10; 2jumpVelocity -= Time.deltaTime; 3GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jumpVelocity);

これではジャンプ後一直線に落下してしまい少々味気ない感じです。(下の図のように)

イメージ説明

ベジェ曲線を使い加速をコントロールできれば実装できるのではと考えているのですが、コードがさっぱり分かりません。

以下図のようなものが理想です。

イメージ説明

お詳しい方、ご教示願いします。

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

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

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

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

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

YOshim

2018/11/10 09:02

回答後に聞くのもなんですが、このグラフの横軸は時間を縦軸は位置をあらわしているという認識で良いですか。
Nomnom

2018/11/10 09:10

説明不足ですいません、ご認識の通りです。
YOshim

2018/11/10 09:15

そうであれば、やはり速度は変化するはずですね。毎回jumpVeloctyを宣言したりしてませんか。
guest

回答1

0

ベストアンサー

まず、現状のコードでは一直線には落下しません。
jumpVelocityが時間に応じて増加(マイナスがついているので実際には減少ですが)します。
現在のコードだと、jumpVelocityという名前がついているものの、deltaTime毎に増加するため、
速度ではなく加速度を意味しています。
*そんなことは、わかっとるわ!というならすみません。

加速度を変化させたいということであれば、現在のjumpVelocityにdeltaTimeに応じた変数を掛ければ良いのではないでしょうか。
例えば初期値を0.1とし、deltaTime毎に0.001ずつ増加させ、最大値を1とするような係数をvelocityにかければ、加速度が最初は小さく徐々に速くなります。

ただし、経験上加速度をいじるよりは、速度に上限(下限を設ける)方が、従来のアクションゲームぽい動作になると思います。

実際に物体の落下速度は速度に応じた空気抵抗が働き、一定値以上は出ませんので、最大値を設定すればリアルな挙動に近づきます。

投稿2018/11/10 08:10

YOshim

総合スコア1085

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

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

Nomnom

2018/11/10 09:42

速度上限というのは設定した数値まで加速するような処理でしょうか? 例えば if(GetComponent<Rigidbody2D>().velocity.y < 5) { GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jumpVelocity); } のような 非現実的にジャンプ後に多少フワッと浮かぶような感じが理想です。 悪〇城ドラ〇ュラ(具体的過ぎてすいません…)の00年代以降の作品にみられるような、ピョン→フワッ→ヒュ~→ストーンのような感じです。 例に挙げた作品では最大高度に達しそうになったところでジャンプ加速度のマイナス速度が極端に緩やかになっているように見えます。 これまでもdeltaTimeへ掛ける変数をコントロールしてみたりもしたんですが、理想とは少し違う感じなんです。 どうしても滞空時間が短くなるといいますか…
YOshim

2018/11/10 10:15

ふわっとさせるなら、速度が小さい時に加速度を小さくするというのがいいのではないかと思います。 ベジェ曲線に近づけたいのでれば、記載のベジェ曲線のグラフが速度なので、微分したものを加速度として設定すれば良いです。 形を見る限り3次関数と同様なので、加速度を時間の二乗とすれば、 頂上付近の滞在時間は長くなるとは思います。
Nomnom

2018/11/10 11:10

教えて頂いた通りではないと思いますが、ジャンプ頂上部の加速度を調整することでそれっぽいものが出来ました。 粗野なコードですが… public float jumpVelocity = 10; public float velocityValue = 3; public float velocityValueMax = 3; public float velocityValueMin = 0.5f; public float value = 5; public Rigidbody2D targetObj; public bool jumpAction = false; if (jumpAction) { if (jumpVelocity < 0.5f && jumpVelocity > -0.5f) { if (velocityValue > velocityValueMin) { velocityValue -= Time.deltaTime * value; } } else { if (velocityValue < velocityValueMax) { velocityValue += Time.deltaTime * value; } } jumpVelocity -= Time.deltaTime * velocityValue; targetObj.velocity = new Vector2(targetObj.velocity.x, jumpVelocity); } …こんな感じでしょうか? あとは数値を調整するとそれっぽくなりそうです。
YOshim

2018/11/10 22:50

上手くいったようで何よりです。 コードは簡潔に書くともできそうですが、簡潔に書いてしまうと、より細かな挙動の調整が難しくなるというデメリットもあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問