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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

2382閲覧

unityでジャンプした3Dモデルが足場のオブジェクトの角?に触れると異常な高さまで飛んでしまう。

iceice

総合スコア2

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2020/05/12 15:02

編集2020/05/13 02:58

前提・実現したいこと

unityを使い始めたばかりの者です。
自作の3Dモデルを使って3Dの「コースを落ちないように走るゲーム」を作りたいと考えており、今回は本格的なコースではなく動作の練習をしようと考えています。
現在、モデルをキー入力で動かす&ジェンプさせるようにした状態です。ジャンプはAddForceによって行っています。
この状態で、練習としてcubeなどシンプルなオブジェクトを間隔を開けて並べたところをモデルを落ちないようにジャンプさせながら移動させたいと思っています。

発生している問題・エラーメッセージ

適当にcubeを配置して実行してみると、場合によっては適切な高さのジャンプをしてきちんとcubeの上にモデルが乗るのですが、ジャンプからの落下でcubeの角?あたりに突っ込むと、ふつうのジャンプ時には考えられなかった高さまでモデルが移動し続けてしまい、ジャンプ時に常に適切な高さまでしか上昇しないように修正したいです。

エラーメッセージ:なし

該当のソースコード

C#

1ソースコード 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class Player : MonoBehaviour { 7 8 //Rigidbodyを変数に入れる 9 Rigidbody rb; 10 //移動スピード 11 public float speed = 3f; 12 //ジャンプ力 13 public float thrust = 200; 14 //Animatorを入れる変数 15 private Animator animator; 16 //キャラの位置を入れる 17 Vector3 playerPos; 18 //地面に接触しているか否か 19 bool ground; 20 21 void Start() 22 { 23 //Rigidbodyを取得 24 rb = GetComponent<Rigidbody>(); 25 //Animatorにアクセスする 26 animator = GetComponent<Animator>(); 27 //現在より少し前の位置を保存 28 playerPos = transform.position; 29 30 31 } 32 33 void Update() 34 { 35 36 //地面に接触していると作動する 37 if (ground) { 38 //A・Dキー、←→キーで横移動 39 float x = Input.GetAxisRaw ("Horizontal") * Time.deltaTime * speed; 40 41 //W・Sキー、↑↓キーで前後移動 42 float z = Input.GetAxisRaw ("Vertical") * Time.deltaTime * speed; 43 44 //現在の位置+入力した数値の場所に移動する 45 rb.MovePosition (transform.position + new Vector3 (x, 0, z)); 46 47 //キャラの最新の位置から少し前の位置を引いて方向を割り出す 48 Vector3 direction = transform.position - playerPos; 49 50 //移動距離が少しでもあった場合に方向転換 51 if (direction.magnitude > 0.01f) { 52 //directionのX軸とZ軸の方向を向かせる 53 transform.rotation = Quaternion.LookRotation (new Vector3 (direction.x, 0, direction.z)); 54 //走るアニメーションを再生 55 animator.SetBool ("Running", true); 56 } else { 57 //ベクトルの長さがない=移動していない時は走るアニメーションはオフ 58 animator.SetBool ("Running", false); 59 } 60 61 //キャラの位置を更新する 62 playerPos = transform.position; 63 64 //スペースキーでジャンプ 65 if (Input.GetButton ("Jump")) { 66 67 68 //thrustの分だけ上方に力がかかる 69 rb.AddForce (transform.up * thrust); 70 //速度が出ていたら前方と上方に力がかかる 71 if (rb.velocity.magnitude > 0) { 72 rb.AddForce (transform.forward * thrust); 73 74 75 } 76 77 } 78 } 79 80 if (transform.position.y >= 100f) 81 { 82 rb.velocity = new Vector3(0,-2,0); 83 rb.angularVelocity = Vector3.zero; 84 } 85 86 87 88 89 } 90 91 92 93 //Planeに触れている間作動 94 void OnCollisionStay(Collision col) 95 { 96 ground = true; 97 98 } 99 100 //Planeから離れると作動 101 void OnCollisionExit(Collision col) 102 { 103 ground = false; 104 105 } 106} 107 108 109 110 111 112

試したこと

ネットで思いつく限り検索してみましたが、試しても直せませんでした。
colliderが重なると跳ねる?という情報があり、それが起こっているのかなとも思いましたがよくわからないままです。
最終的に、transform.position.yが一定値を超えたらvelocityでy方向に下向きの動きになるようにして、上がりすぎは無理やり止めてみましたが、これだとステージのオブジェクトの高さがそれぞれ違ってくるとうまくいかない上に一瞬固定されてから下がるので違和感があり、もっと良い方法を試したいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

sakura_hana

2020/05/13 00:34

このコードだと速度が出ている時は二重で上方向にAddForceしていますが、これを片方になるようにするとどうでしょうか?
hogefugapiyo

2020/05/13 00:43

関連するソースコードは全部張ってください。 現状からだと、スペースキー押しっぱなしにするとずっとジャンプしちゃうなぁっていうのと、ジャンプでy軸に移動するせいでrb.velocity.magnitudeのif文がずっと回るけど想定の仕様なのかな? とかしか思いつきませんでした
iceice

2020/05/13 03:46

ご指摘ありがとうございます。ソースコードを全文に修正致しました。 AddForceを片方にするようにしてみましたが実行結果は変わりませんでした。勉強不足で詳細は分かっていないのですがrb.velocity.magnitudeのif文は上昇しすぎがこれのせいで無ければ一応これでも大丈夫かなと思っています。
guest

回答1

0

ベストアンサー

ジャンプ時のGetButtonに問題があると思います。
GetButtonはボタンを押している間はtrueになるので、これではジャンプボタンを連打したことになります。
ジャンプボタンの連打によって、AddForceで力が加わり続けているのではないでしょうか。

なので、GetButtonではなくGetButtonDownを使った方がいいですね。
それか、AddForceで加わる力に上限を設定すればよいと思います。

投稿2020/05/15 07:49

mattrick

総合スコア135

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

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

iceice

2020/05/24 02:10

ご回答ありがとうございました。 お礼を申し上げるのが遅くなりすみません。 GetButtonDownに変更したら無事に解決致しました。 ジャンプボタンを連打したことになると理解できていなかったので勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問