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

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

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

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

Unity

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

Q&A

解決済

2回答

2007閲覧

Unity2D 回転の制限

kome-kit

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2018/08/11 00:40

編集2018/08/11 11:44

現在Unity2dで色々なステージを車で踏破するというゲームを作っているのですが
建物の角などにぶつかると車が回転し、ひっくり返ります
FreezeRotationを使うことも考えたのですが
全く回転しなくなると今度は坂などで不自然になりました
地面はコンセプト上ガタガタなので地面に沿わせるみたいなのは無理そうでした
回転角度を90°〜-90°くらいに制限してひっくり返らないようにしたいのですが
どのようなスクリプトが考えられるのでしょうか。
ある程度傾くこととひっくり返らないことが可能なら他の方法でも問題ありません

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

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

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

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

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

guest

回答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

Bongo

総合スコア10807

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

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

kome-kit

2018/08/13 03:40 編集

とてもわかりやすい回答ありがとうございます! 回転に合わせて逆方向に回転をかけて向きを直すとは…全く思いつかなかったです rotationを直接書き換える方法も併用してあるからあるから万が一にもひっくり返ることはないんですね 素晴らしいです。ありがとうございました!
guest

0

例えばなんですが、地面と車が親子関係を結ぶとかどうでしょうか?
それか根本的に建物の角にぶつからない設計を考え直すくらいしか思いつきません。

投稿2018/08/11 05:29

M_Kazuma

総合スコア34

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

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

kome-kit

2018/08/11 07:46

すいません 親子関係を結んで解決する方法を考えてみたのですがよくわかりませんでした 詳しく教えていただけるとありがたいです あと角だけじゃなくて 段差とかオブジェクトならなんでもですね 回転を固定していないのでぶつかるとクルンクルン回ります
M_Kazuma

2018/08/11 08:15

申し訳ないですがあくまで可能性で答えたまでなので御自身でできない以上答えようがないです。 あと坂に進む時だけFreezeRotationを解除するとかも試しましたか?
kome-kit

2018/08/11 08:20

可能性以前の話として親子関係を結んだことによって車の回転がほどよく抑制されるという 原理がわかりませんでした >あと坂に進む時だけFreezeRotationを解除するとかも試しましたか? これについては質問文に書いていますが地面がガタガタなので基本的に「完全に坂じゃないところ」というのは存在しないです どこでも少しは傾いていたりするので坂に進む時だけ解除というのは難しいですね…
M_Kazuma

2018/08/11 13:55

なんとなく今考えてみたんですが、そもそもの車の絵は1枚絵でしょうか? 車のことをあんまり詳しくないから上手いこと言えないですが、リアルでは車ってガタガタな道を走る際は、タイヤが動くからボディーも上下に動くんじゃないかなって思ったので、そのような親子関係がある絵の構造でタイヤを工夫すれば上手いこと出来ないかなって妄想してみました笑 坂に関してもこれで出来そうな気がするのですが既に試していたら完全力不足です。
kome-kit

2018/08/11 15:46

車は一枚絵ですね… 説明不足でした もう少し自分で考えてみます
M_Kazuma

2018/08/11 22:19

一番は1枚絵を作り直すべきかと!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問