🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity3D

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

Q&A

解決済

2回答

1335閲覧

Playerオブジェクトの角度制限をしたい。

Um_kok

総合スコア39

C#

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

Unity3D

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

0グッド

0クリップ

投稿2021/01/08 07:39

編集2021/01/09 13:52

こんにちは、Playerオブジェクトがひっくり返らないようにしたいため、角度制限をしようとしてみました。
コードです。

C#

1 float eulerAngleZ = transform.eulerAngles.z; 2 var min = -45; 3 var max = 45; 4 5 eulerAngleZ = Mathf.Clamp(eulerAngleZ, min, max); 6 7 if(eulerAngleZ < min && eulerAngleZ > max) 8 transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, eulerAngleZ);

フロートに現在のz軸を格納し、途中で、クランプを使い角度を制限しております。
このコードで実行してみると、がたがたしたりして、うまくいきませんでした。

これも書いてみました

C#

1 2 Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z); 3 carRot.z = Mathf.Clamp(carRot.z, -45, 45); 4 transform.rotation = new Quaternion(carRot.x, carRot.y, carRot.z, transform.rotation.w);

これもうまくいきませんでした
次のも同じような感じです。
調べて書いてみたのですが、難しかったので、質問させてもらいました。
やり方を教えてくださる方、ご教示お願いします。

回答見ました。こうでしょうか?

C#

1 float eulerAngleZ = transform.eulerAngles.z; 2 var min = -45; 3 var max = 45; 4 5 var a = eulerAngleZ; 6 a = Mathf.Clamp(eulerAngleZ, min, max); 7 8 9 transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, a); 10 11

これでもうまくいきません。どこが間違っていますか?
少しでも傾くとそこからがたがたしてしまいます。

追記です コードと画像です

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[System.Serializable] 6public class AxleInfo 7{ 8 // 力を加えるCollider 9 public WheelCollider leftWheel; 10 public WheelCollider rightWheel; 11 12 public bool motor; // このホイールがエンジンにアタッチされているかどうか 13 public bool steering; // このホイールがハンドルの角度を反映しているかどうか 14} 15 16public class PlayerCar : MonoBehaviour 17{ 18 // AxleInfo クラスをインスペクタで設定できる 19 [SerializeField] private List<AxleInfo> axleInfos; // 個々の車軸の情報 20 [SerializeField] private float maxMotorTorque; // ホイールに適用可能な最大トルク 21 [SerializeField] private float maxSteerinAngle; // 適用可能最大ハンドル角度 22 23 // 空オブジェクト(Wheel Collider) 24 [SerializeField] private WheelCollider wheelFL; 25 [SerializeField] private WheelCollider wheelFR; 26 [SerializeField] private WheelCollider wheelBL; 27 [SerializeField] private WheelCollider wheelBR; 28 29 // ホイールのモデル 30 [SerializeField] private Transform wheelFLTrans; 31 [SerializeField] private Transform wheelFRTrans; 32 [SerializeField] private Transform wheelBLTrans; 33 [SerializeField] private Transform wheelBRTrans; 34 [SerializeField] private float steering = 0.0f; 35 public float motor = 0.0f; 36 37 // インスペクターで設定 38 [SerializeField,Header("スリップ値")] private float wheelExtremumSlip; 39 [SerializeField,Header("タイヤそのものの摩擦力")] private float wheelstiffness; 40 [SerializeField,Header("x軸摩擦力")] private float wheelFriction; 41 42 // Wheel Collider の値を保持するための変数 43 private WheelFrictionCurve wheelValueRetentionFL; 44 private WheelFrictionCurve wheelValueRetentionFR; 45 private WheelFrictionCurve wheelValueRetentionBL; 46 private WheelFrictionCurve wheelValueRetentionBR; 47 48 // 変更する値 49 private WheelFrictionCurve wheelChangeValue; 50 51 52 53 private new Rigidbody rigidbody; // AddForce に使う 54 [SerializeField] private float limitSpeed; // 速度制限 55 56 57 58 void Start() 59 { 60 // キャッシュしておく 61 rigidbody = GetComponent<Rigidbody>(); 62 63 // Wheel Collider の 横移動の値を保存しておく 64 wheelValueRetentionFL = wheelFL.sidewaysFriction; 65 wheelValueRetentionFR = wheelFR.sidewaysFriction; 66 wheelValueRetentionBL = wheelBL.sidewaysFriction; 67 wheelValueRetentionBR = wheelBR.sidewaysFriction; 68 } 69 70 public void FixedUpdate() 71 { 72 73 74 75 float eulerAngleZ = transform.eulerAngles.z; 76 var min = -45; 77 var max = 45; 78 79 var a = eulerAngleZ; 80 a = Mathf.Clamp(eulerAngleZ, min, max); 81 82 83 transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, a); 84 85 86 87 88 //var min = -20; 89 //var max = 20; 90 //var transformEuler = transform.eulerAngles.z; 91 92 //Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z); 93 //if(carRot.z > min && carRot.z < max) { 94 // carRot.z = transformEuler; 95 //} 96 //else { 97 98 // carRot.z = 0; 99 //} 100 101 //Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z); 102 //carRot.z = Mathf.Clamp(carRot.z, -45, 45); 103 //transform.rotation = new Quaternion(carRot.x, carRot.y, carRot.z, transform.rotation.w); 104 105 }

**車を走らせるのには、WheelCollider を使っております。**何度かひっくり返ってしまうので、角度制限を付けて
ひっくり返らないようにしたいです。お願いします。

イメージ説明
少し傾くと、こんな感じに右左右左揺れてガタガタします。

試しにWheelCollider を切ってみてもそのような挙動になってしまうので、私のコードの書き方が悪いのだと思います。
気になったことなどあったらご回答お願いします。

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

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

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

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

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

guest

回答2

0

おそらくここが悪さをしているのではないでしょうか?

eulerAngleZ = Mathf.Clamp(eulerAngleZ, min, max);

同じ変数に対しMathf.Clampでとった値を入れるよりも、
別の変数を生成してそれをMathf.Clampに入れたほうが良いかもしれません(その前に初期化してから実行してるのでする必要はないかもしれませんが)
それと、

if(eulerAngleZ < min && eulerAngleZ > max) transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, eulerAngleZ);

ここのif文のifを抜いてみてください
おそらく条件内の処理だけをUpdate()の中で回すだけで行えると思います

投稿2021/01/08 14:01

CraftTable

総合スコア234

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

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

Um_kok

2021/01/09 07:35

お返事遅れました。回答ありがとうございます。質問に追記しました。お時間あるとき回答お願いします。
CraftTable

2021/01/09 13:16

申し訳ありません、よろしければ回転させているほうのスクリプトもお願いできますでしょうか? それともう少し詳しく現在しようとしていることと状況を教えてくださると助かります できれば画像や動画やGIFを添付していただけるとわかりやすいです 注文が多くてすいません、お願いしますm(_ _)m
Um_kok

2021/01/09 13:51

お返事ありがとうございます。分かりにくくてすみません。 私がお願いしているので、謝らないでください。どうかよろしくお願いします。 質問に追記しました。
CraftTable

2021/01/09 14:23

ためしにmaxとminの値を0などかなり小さい値にしてみてください それをしてもしがたがたするのの動きが小さくなったらその値が原因であると思われます また、WhellColliderをOFFにしても起こるのならまずありえないとは思いますが、このサイトに書いてある問題点:2のようなことが起こっているのではないでしょうか? URL:https://indie-du.com/entry/2016/05/20/200000 WhellColliderについて詳しくないのでそうであるのかわかりませんが、曲がったときにColliderのばねが作用を起こして跳ねるということを何度も繰り返してがたがた動くのではないかと思います 二つ目に関しては参考程度に聞き流してもらって結構です 一度検証してみてください
Um_kok

2021/01/09 15:06

お返事遅れました。 min とmax の値を小さくしてみたら、小さいにつれ、がたがたが小さくなりました。 WheelColliderに関しては、教えてくださったサイトも目を通しておりますので大丈夫です。 minとmax を0にしてみたら、がたがたはなくなるのですが、傾いたままになり可笑しくなってしまいます。 他に何かやり方がありますか?
CraftTable

2021/01/10 09:27

z軸の回転を完全になくすのであれば、aを常に0にすれば万事解決ではありますが・・・ また、がたがた動くとなると物理演算が働いていると思うので、RigidBodyのFreeze RotationのZにチェックを入れてみて傾きがなくなるか検証してみてください 物理演算が働いている場合、Colliderの配置など判定に関するもの、RigidBodyなどの物理演算に関するものを調整してみてください(起動してSceneで確認してColliderが変な所で作用していないか確認してみるのが一番手っ取り早いと思います) それで傾きが無くならなかった場合、他にそのオブジェクトに対し干渉しているスクリプトがあれば、そのスクリプトのほうもチェックしてみて、回転に関する記述がないか確認してみてください
Um_kok

2021/01/11 05:25

お返事遅れました。何度かためしてみたので、検証結果を言わせてもらいます。 a を0にしてみたのですが、何もないところで引っかかってしまい、 Freeze Rotation のz軸をチェックしてみたのですが、がたがたはしなくなったのですが、その傾いた角度で固まってしまいます。 コライダーはメッシュコライダーを使っていて、コーストと車のメッシュコライダしか当たるものがないです。スクリプトでは車を動かしているのは、このスクリプトのみです。 困りました、、、
Um_kok

2021/01/11 05:27

回転を完全になくしてしまうと、動きに支障が出てしまします。
CraftTable

2021/01/11 12:21

そうですか・・・ あと考えられる要因と言ったら最初から傾いているぐらいしか思いつきませんね・・・ もしかしてこのオブジェクトに親設定をしているオブジェクトなどありますか? あるのならそちらのほうの回転の値も確認したほうがよいかと思います(もう確認されてそうですが) 画像を見るに傾き方がタイヤのColliderが大きすぎて傾くみたいな傾き方なのですよね またがたがたする原因はもしかしたら大元の車本体のMeshColliderとタイヤのWhellColliderが埋まりあって動いているなども考えられます また引っかかってというのはエラーのことでしょうか? エラーであればエラーコードを提示してくださるとありがたいです 上記はもう粗探しですのでこれ以上は無理があるかもしれません・・・
Um_kok

2021/01/11 13:01

このコードがついているのが親です。最初から傾いてもいないです。Rotation(0,0,0)となっていました、、 このがたがたの角度は制限した値で止まっているので、タイヤのコライダーとかではないです。 WheelColliderは当たり判定が無いので、埋まっているのはないと思います。 引っかかっているというのは、コースの地面と、車のメッシュコライダが引っかかってしまうということです。(変な角度制限を付けたため) やはりコードの書き方に問題があるのですかね? 他にどういったコードの書き方がありますか?教えてもらえると助かります。
Um_kok

2021/01/12 04:39

解決とは言いきれませんが、違うやり方でひっくり返らないように出来たので、自己解決方法を書いておきます。
CraftTable

2021/01/12 08:25

あまりお力になれず申し訳ありません・・・ ゲーム開発頑張って下さい( 'ω')وファイト!
Um_kok

2021/01/16 14:01

お返事遅れました。 通知が来なかったので気づきませんでした、、、、ごめんなさい。 いえいえ、お気になさらず。解決したので大丈夫ですよ。 ありがとうございます。頑張ります!
guest

0

自己解決

解決とまではいきませんが、力ずくでやってみたので、その方法を書きます

c#

1[SerializeField]private Rigidbody rigidbody 2 3rigidbody.AddForce(Vector3.down * 10000)

力ずくですが、こうすることでひっくり返らないように出来ました。
別の方法でやってしまいましたが、CraftTable様、回答ありがとうございました。
多分原因は物理演算などです。

投稿2021/01/12 04:46

編集2021/01/12 04:48
Um_kok

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問