現在Unity2dで色々なステージを車で踏破するというゲームを作っているのですが
建物の角などにぶつかると車が回転し、ひっくり返ります
FreezeRotationを使うことも考えたのですが
全く回転しなくなると今度は坂などで不自然になりました
地面はコンセプト上ガタガタなので地面に沿わせるみたいなのは無理そうでした
回転角度を90°〜-90°くらいに制限してひっくり返らないようにしたいのですが
どのようなスクリプトが考えられるのでしょうか。
ある程度傾くこととひっくり返らないことが可能なら他の方法でも問題ありません
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
たとえばrotationを強制的に範囲内におさめてしまうというのはどうでしょうか?
C#
1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody2D))] 4public class RotationLimitter : MonoBehaviour 5{ 6 [Range(0.0f, 180.0f)] public float RotationLimit = 90.0f; // 回転角の限界値 7 8 private new Rigidbody2D rigidbody2D; 9 10 private void Start() 11 { 12 this.rigidbody2D = this.GetComponent<Rigidbody2D>(); 13 } 14 15 private void FixedUpdate() 16 { 17 var rotation = this.rigidbody2D.rotation; 18 var clampedRotation = Mathf.Clamp(rotation, -this.RotationLimit, this.RotationLimit); 19 20 // 生のrotationと、範囲を-限界値~+限界値にクランプしたrotationが一致しない場合... 21 if (rotation != clampedRotation) 22 { 23 // rotationが範囲外に出てしまっているということなので、強制的に回転をclampedRotationに変える 24 this.rigidbody2D.rotation = clampedRotation; 25 26 // さらに、角運動量が残っていると、その後の衝突で多少逆方向のトルクが加わっても 27 // 慣性のために回転せず、限界角の位置に貼り付いてしまったように見える 28 // そこで、角速度を0に戻して角運動量を完全に失わせる 29 this.rigidbody2D.angularVelocity = 0.0f; 30 } 31 } 32}
他には、回転と逆向きにトルクをかけて、バネのように回転を押し戻すこともできそうです。
個人的には、こちらの方が動きが柔らかい印象になり好きですが、ゲームによってどのようなやり方が適しているかは変わってくるでしょうから、いろいろ試してみるのがいいかと思います。
C#
1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody2D))] 4public class RotationLimitter : MonoBehaviour 5{ 6 [Range(1.0f, 8.0f)] public float TorqueExponent = 4.0f; // 大きくするほどトルクカーブが鋭くなる 7 [Range(0.0f, 1000.0f)] public float TorqueMagnitudeMax = 100.0f; // 回転押し戻しトルクの最大値 8 [Range(0.0f, 180.0f)] public float RotationLimit = 90.0f; // 回転角の限界値 9 10 private new Rigidbody2D rigidbody2D; 11 12 private void Start() 13 { 14 this.rigidbody2D = this.GetComponent<Rigidbody2D>(); 15 16 // angularDragがデフォルトの0.05だと、バネ運動が激しすぎるかもしれません 17 // 適宜大きくしてやると、大暴れするのを防げるかと思います 18 this.rigidbody2D.angularDrag = 4.0f; 19 } 20 21 private void FixedUpdate() 22 { 23 // 現在の回転の大きさと向き 24 var rotationMagnitude = this.rigidbody2D.rotation; 25 var rotationSign = Mathf.Sign(rotationMagnitude); 26 rotationMagnitude *= rotationSign; 27 28 // 回転が限界角に近づくほど1に近づくカーブを作る 29 // 30 // factor 31 // 1| ********* 32 // | * 33 // | * 34 // | * 35 // | ** 36 // | *** 37 // | **** 38 // |****** 39 // 0+-------------------------- rotationMagnitude 40 // 0 90 41 var factor = Mathf.Pow(Mathf.InverseLerp(0.0f, this.RotationLimit, rotationMagnitude), this.TorqueExponent); 42 43 // 回転と逆向きにトルクをかける 44 var torque = -rotationSign * this.TorqueMagnitudeMax * factor; 45 this.rigidbody2D.AddTorque(torque); 46 } 47}
投稿2018/08/12 23:54
総合スコア10807
0
例えばなんですが、地面と車が親子関係を結ぶとかどうでしょうか?
それか根本的に建物の角にぶつからない設計を考え直すくらいしか思いつきません。
投稿2018/08/11 05:29
総合スコア34
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/11 08:15
2018/08/11 08:20
2018/08/11 13:55
2018/08/11 15:46
2018/08/11 22:19
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/13 03:40 編集