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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

2852閲覧

Unityで、時間と高さ幅を指定してジャンプをコントロールしたい

kki020

総合スコア12

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2019/02/07 07:57

Unityで、時間と高さ幅を指定してジャンプをコントロールしたい

時間と高さ幅を指定してジャンプをコントロールしたいです。
下記のURLを参考に作成しているのですが、指定した通りのジャンプができません。

どうしたらいいでしょうか。Unity初心者なのでご教授お願い致します。

参考URL

http://esrunti.com/jumpscript2/#i

参考URL内のソースコード

C#

1 2public class jump : MonoBehaviour { 3 public float jumpTime = 1f; 4 float time; 5 public float height = 2f; 6 float fixedGravity; 7 float initVelocity; 8 float elapsedTime = 0f; 9 public bool jumpChecker = false; 10 11 void Update() { 12 if (Input.GetKey("a") && !jumpChecker) { 13 jumpChecker = true; 14 time = jumpTime / 2; 15 fixedGravity = -2 * height / (time * time);//① 16 initVelocity = 2 * height / time;//② 17 } 18 if (jumpChecker) { 19 elapsedTime += Time.deltaTime; 20 Vector3 pos = transform.position; 21 pos.y = initVelocity * elapsedTime + fixedGravity * elapsedTime * elapsedTime / 2; 22 if (pos.y < 0) { 23 pos.y = 0; 24 elapsedTime = 0; 25 jumpChecker = false; 26 } 27 transform.position = pos; 28 } 29 } 30 31}

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

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

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

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

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

Bongo

2019/02/07 10:09

ちょっと試してみたのですが、ご提示いただいた参考コードに異常はなさそうでした。 「指定した通りのジャンプができない」とおっしゃるのは、具体的にはどのような症状なのでしょうか?
kki020

2019/02/08 01:40

返信遅くなり申し訳ありません。 幅が指定できないところです。
Bongo

2019/02/08 02:36

なるほど、その場での単なる垂直跳びではなく、弧を描いて斜めにジャンプさせたいということでしょうか。 跳び上がってから着地するまでの時間と、ジャンプ幅(つまり水平移動距離)が分かっていますので、それらから水平移動速度を求められそうですね。 現状の作りかけのコードはご提示いただけますでしょうか?
kki020

2019/02/08 02:47 編集

今のソースコードはこんな感じです。 public class jump : MonoBehaviour { public float jumpTime = 1f; float time; public float height = 2f; public float width = 2f; float fixedGravity; float initVelocity; float fixedGravityX; float initVelocityX; float elapsedTime = 0f; public bool jumpChecker = false; void Update() { if (Input.GetKey("a") && !jumpChecker) { jumpChecker = true; time = jumpTime / 2; fixedGravity = -2 * height / (time * time); initVelocity = 2 * height / time; fixedGravityX = -2 * width / (time * time); initVelocityX = 2 * width / time; } if (jumpChecker) { elapsedTime += Time.deltaTime; Vector3 pos = transform.position; pos.x = initVelocityX * elapsedTime+ fixedGravity * elapsedTime * elapsedTime / 2; pos.y = initVelocity * elapsedTime + fixedGravity * elapsedTime * elapsedTime / 2; if (pos.y < 0) { pos.y = 0; pos.x = width; elapsedTime = 0; jumpChecker = false; } transform.position = pos; } } }
guest

回答1

0

ベストアンサー

水平方向にも加速度を設けてしまっているご様子ですが、こちらは等速でよさそうです。
下記のような形ではどうでしょうか?

C#

1using UnityEngine; 2 3public class jump : MonoBehaviour 4{ 5 public float jumpTime = 1f; 6 float time; 7 public float height = 2f; 8 public float width = 2f; 9 float fixedGravity; 10 float initVelocity; 11 // float fixedGravityX; // 水平方向の加速度は不要 12 float initPositionX; // 初期X座標のためのフィールドを追加 13 float initVelocityX; 14 float elapsedTime = 0f; 15 public bool jumpChecker = false; 16 17 void Update() 18 { 19 if (Input.GetKey("a") && !jumpChecker) 20 { 21 jumpChecker = true; 22 time = jumpTime / 2; 23 fixedGravity = -2 * height / (time * time); 24 initVelocity = 2 * height / time; 25 26 // fixedGravityX = -2 * width / (time * time); // 水平方向の加速度は不要 27 initVelocityX = width / jumpTime; // 距離widthをjumpTime秒かけて移動する場合の速度 28 initPositionX = transform.position.x; // ジャンプ開始時のX座標を覚えておく 29 } 30 if (jumpChecker) 31 { 32 elapsedTime += Time.deltaTime; 33 Vector3 pos = transform.position; 34 pos.x = initPositionX + initVelocityX * elapsedTime; // 水平方向は等速とする 35 pos.y = initVelocity * elapsedTime + fixedGravity * elapsedTime * elapsedTime / 2; 36 37 if (pos.y < 0) 38 { 39 pos.y = 0; 40 pos.x = initPositionX + width; // 初期位置からwidthだけ進んだ位置を最終的なX座標とする 41 elapsedTime = 0; 42 jumpChecker = false; 43 } 44 transform.position = pos; 45 } 46 } 47}

投稿2019/02/08 03:55

Bongo

総合スコア10807

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

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

kki020

2019/02/08 05:11

ありがとうございます。 出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問