前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー