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

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

ただいまの
回答率

88.77%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 940

Nomnom

score 16

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

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


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

イメージ説明

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

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

イメージ説明

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YOshim

    2018/11/10 18:02

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

    キャンセル

  • Nomnom

    2018/11/10 18:10

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

    キャンセル

  • YOshim

    2018/11/10 18:15

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/10 18:42

    速度上限というのは設定した数値まで加速するような処理でしょうか?
    例えば
    if(GetComponent<Rigidbody2D>().velocity.y < 5)
    {
    GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jumpVelocity);
    }

    のような

    非現実的にジャンプ後に多少フワッと浮かぶような感じが理想です。
    悪〇城ドラ〇ュラ(具体的過ぎてすいません…)の00年代以降の作品にみられるような、ピョン→フワッ→ヒュ~→ストーンのような感じです。

    例に挙げた作品では最大高度に達しそうになったところでジャンプ加速度のマイナス速度が極端に緩やかになっているように見えます。

    これまでもdeltaTimeへ掛ける変数をコントロールしてみたりもしたんですが、理想とは少し違う感じなんです。
    どうしても滞空時間が短くなるといいますか…

    キャンセル

  • 2018/11/10 19:15

    ふわっとさせるなら、速度が小さい時に加速度を小さくするというのがいいのではないかと思います。

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

    キャンセル

  • 2018/11/10 20: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);
    }

    …こんな感じでしょうか?
    あとは数値を調整するとそれっぽくなりそうです。

    キャンセル

  • 2018/11/11 07:50

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

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る