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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity3D

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

Unity

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

Q&A

解決済

1回答

1126閲覧

Spring Joint2Dを複数使う場合に重複があってもいいのか・ばねの項目について

integral2ydx

総合スコア7

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/11/08 06:43

編集2021/11/11 04:59

イメージ説明
白玉の写真です。Layerも変えることができ、要素も無事に挿入できました!白玉の写真です。Layerも変えることができ、要素も無事に挿入できました!

複数の玉同士をSpringJointでくっつけています。白玉をマウスでドラッグしている間だけ物理演算を開始するようしています。

前提・実現したいこと

玉が増えた場合でも同じようにドラッグしている間だけ物理演算を開始したい。

Spring Joint2Dの項目でよくわからない説明があるのでそれを解消したいです。

ここに質問の内容を詳しく書いてください。
図のような玉同士をばねでくっつけるシミュレーションをしたいのですが、玉が全部で3個の時はドラッグしたときのみ、物理演算ができているのですが、増やしたとたんにドラッグする前から物理演算が開始してしまいました。
またいろいろいじっているうちに、3個の時も、理想の動きができなくなってしまいました。

発生している問題

玉を増やした場合、SpringJointのつける先が個人的には原因だと思っているのですが、sprigjointはお互い重複するようにばねをくっつけないとだめなのでしょうか?もしくは片方一方的につけるだけでいいのでしょうか?そして、一つのばねから接続するばねの本数に制約はあるのでしょうか?

エラーメッセージ

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class NewBehaviourScript : MonoBehaviour 6{ 7 // Rigidbody2Dをセットするためのフィールドを追加し、ここに 8 // インスペクター上で残り2つのボールをセットしておく 9 [SerializeField] 10 private Rigidbody2D[] otherBalls; 11 private Vector3 screenPoint; 12 private Vector3 offset; 13 private new Rigidbody2D rigidbody2D; 14 15 void Start() 16 { 17 this.rigidbody2D = this.GetComponent<Rigidbody2D>(); 18 // Start時点では、他の2つのボールをKinematic状態にしておく 19 foreach (var otherBall in this.otherBalls) 20 { 21 otherBall.bodyType = RigidbodyType2D.Kinematic; 22 } 23 } 24 25 void OnMouseDown() 26 { 27 this.screenPoint = Camera.main.WorldToScreenPoint(transform.position); 28 this.offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); 29 // マウスボタンを押し下げたタイミングで、他の2つのボールをDynamic状態に変える 30 foreach (var otherBall in this.otherBalls) 31 { 32 otherBall.bodyType = RigidbodyType2D.Dynamic; 33 } 34 } 35 36 void OnMouseDrag() 37 { 38 Vector3 currentScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); 39 Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint) + this.offset; 40 this.rigidbody2D.MovePosition(currentPosition); 41 } 42 43 // マウスボタンを離したら再びバネ運動をやめて固定したい場合... 44 void OnMouseUp() 45 { 46 // OnMouseUpで他の2つのボールをKinematic状態に変え、 47 // 速度・角速度もゼロにする 48 foreach (var otherBall in this.otherBalls) 49 { 50 otherBall.bodyType = RigidbodyType2D.Kinematic; 51 otherBall.velocity = Vector2.zero; 52 otherBall.angularVelocity = 0.0f; 53 } 54 } 55} 56

試したこと

・図でいう青の玉からすべての玉にばねをつける。なおかつほかのすべての玉から青の玉にばねをつける
・青以外のそれぞれ二本のみ別の玉にばねをつける

ここに問題に対して試したことを記載してください。

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

https://teratail.com/questions/367249 前回の続きなのですが、springjointがよくわからなくなっていたため、質問しなおしました。
ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2021/11/08 09:46

おそらく思っている「Spring」とは違うかと思います。 https://teratail.com/tags/Spring 質問タグとして用意されている「Spring」はJavaフレームワークの一種です。
Bongo

2021/11/08 22:02

白い玉にNewBehaviourScriptをアタッチしているかと思いますが、それのOther Ballsはどうなっているでしょうか?念のためインスペクターのスクリーンショットをご提示いただけるとありがたいです。 私の試した限りでは、ちゃんとドラッグ時のみバネ運動しているように見えたんですがね... なお、SpringJointに限らず、ジョイント類は一方から他方へ1本だけつなげば十分であり、逆方向にもう1本アタッチする必要はないかと思います。ですので、青玉を中心に放射状に接続された構造を作るのであれば... 青→白 青→赤 青→緑 青→黄 の4本とするか、あるいは... 白→青 赤→青 緑→青 黄→青 の4本とすればいいでしょう。これらに限らず... 白→青 青→赤 青→緑 青→黄 みたいにつないでもかまわないでしょう。 ですが相互に接続してはいけないわけではなく、バネが2本かけられた状態になるため張力は大きくなってしまうでしょうが、バネ運動自体は行われるはずです。
integral2ydx

2021/11/09 01:56 編集

m.ts10806さん ご指摘ありがとうございます
integral2ydx

2021/11/09 01:56 編集

Bongoさん すいません!otherballの要素数の指定の仕方がよくわからなかったのですが、いろいろいじっていたらできました! コメント欄で画像の挿入はどうすればいいのでしょうか? 要素としては 要素0→赤 要素1→青 要素2→緑 要素3→黄 としたのですがこんな感じで大丈夫ですか? 別件ではあるのですが、白玉だけほかの物体との当たり判定無視するようなことはできますか?Rigidbodyとかcoliderを消すとばねの性質がなくなってしまいます。
Bongo

2021/11/09 10:46

コメント欄に画像を挿入のはできないようですので(アドレスをコメント文中に入れることで画像へのリンクという形にすることは可能でしょうが)、ご質問文を編集し、追記という形でご提示いただくのがいいかと思います。 どうやらotherBallsの要素数変更はできたようで安心しました。otherBallsへの玉のセットもそれでよさそうに思います(ちなみに4色の順序は任意でかまいません)。肝心の物理挙動の方は大丈夫そうでしょうかね...? 白玉の衝突判定のコントロールについては、白玉にだけ別のレイヤーを割り当てて、Layer Collision Matrixの設定を調整して他のレイヤーと衝突しないようにするのが順当でしょうね。この機能は比較的需要があるでしょうから、検索していただくと使用例が見つかりやすいかと思います(たとえばhttps://motoseneet.com/unity/4282/ )。
integral2ydx

2021/11/10 07:04 編集

Bongoさんうまく張り付けられてませんンが、質問更新しました! 長文ですいません そうなんですよね、、肝心の挙動がいまいち本物っぽくないです。例えば、白から一番遠い黄色はついてくるのが遅いです。自分の中では、すべて青からばねがつながっているので、全部等しい距離でばねがついてくると思っていました。もしかしたら自分の考え方がおかしいのかもしません。 また、それぞれのばねの項目が説明を読んでもよくわかりません。 Enable Collision → ほかの玉との衝突判定 Connected Rigid Body → つなぐ玉 Auto Configure Connected Anchor  → Connected Rigid Bodyと何が違う?? Anchor X:0 y:0 ⚓?? 接続されたアンカー x:0 y:0 Anchorと何が違うの?? Auto Configure Distance  → 質量などから自動で2点間の距離を計算? 距離 → 自分で2点間の距離を決める Damping Ratio → 減衰比 ??指定した距離にばねが縮むむまでどのくらい振動するか?0~1で大きくなるほど動きは少ない Frequency  → ばね定数K? 0~1000,000,000の範囲で値がでかいほどばねは固くなる。 Break Force → 玉を破壊するのに必要な力?? infinityで壊れない 個人的に調べたり値をいじった感じでここまでしかわかっていないんですけど、Bongoさんはご存じでしょうか? Layerという概念を知りませんでした!!無事に白玉だけ衝突回避できました!unityこんな細かく設定あるなんて面白いです!
Bongo

2021/11/10 22:24

追記報告ありがとうございます。ですが欲を申しますと、追記いただいた過程をご存じでない方が初めてこのご質問をご覧になった場合、追記文と最初の質問文が一続きになっているために混乱してしまうかもしれません。当初の部分と追記いただいた部分は、それぞれ見出しを入れるなどして区別するといいかもしれませんね。 「Anchor」と「接続されたアンカー」は、SpringJoint2Dで言うところのバネの末端の位置ですね。「Anchor」がジョイントをアタッチした側の、「接続されたアンカー」が接続相手側の末端というわけです。玉の中心同士をつなぐのでしたら、どちらもゼロでいいかと思います。 「Auto Configure Connected Anchor」をオンにすると「接続されたアンカー」がワールド空間上の「Anchor」の位置と同じになるよう自動設定してくれるはずですが、今回の場合でそれをやるとバネの末端が変な位置につながれてしまっていまいちかと思います。あれはオフのままの方がいいんじゃないでしょうか。 「距離」はSpringJoint2Dで言うところのバネの自然長...つまり縮む力も伸びる力も生じない長さですね。「Auto Configure Distance」をオンにすると「距離」が自動設定されるはずです。自動設定の時には質量は考慮されず、単にシーン上の位置関係だけから距離が決められるかと思います。 なお「Auto Configure Connected Anchor」や「Auto Configure Distance」をオンにすると、オンにしたタイミングで「接続されたアンカー」や「距離」が自動的に書き換わってしまうでしょう。その後でオフにしても書き換わった値のままになるはずですので、あらためて「接続されたアンカー」や「距離」の値を調整してやる必要があるかと思います。 「Break Force」は玉を破壊...と言うよりもSpringJoint2Dを破壊するのに必要な力と言うべきでしょうね。バネにこの設定値以上の負荷がかかるとバネが壊れ、玉がどこかへ飛んでいくでしょう。 黄色い玉だけついてくるのが遅いとのことですが、各ジョイントの設定はどうなっていますでしょうか。スクリーンショットを拝見しますに、各バネの「距離」の設定値が異なっているように見えます。もし黄色い玉だけ「距離」が長くなっているとしたら、それはつまり黄色い玉だけは長いバネでつないでいることになりますので、赤や緑の玉と異なった動きになるはずです。その他「Damping Ratio」や「Frequency」などバネの特性に関わる諸々の設定も含めて、設定値を同じに揃えてあるかご確認ください。
integral2ydx

2021/11/11 05:20

ご指摘ありがとうございます。タイトルに"ばねの項目について"という文章を追加しました! なるほどです。今回の場合はすべてのAnchorは0とかオフでいいんですね。いかりのイメージですね。 自分のばねの設定、ばらばらのものが多かったです。お騒がせしました! すべて統一してみたところ無事に解決できました!ありがとうございます。 話は変わるのですが、ベストアンサーってどうやって贈ればいいんですか?前回はスクリプトの隣にマークがあったのですが、今回は見当たりません。
Bongo

2021/11/11 07:08

うまくいったようでなによりです。今回は症状をおうかがいしているうちに解決してしまったようですから、お時間のあるときにでも解決手順の概要を自己解決回答として投稿いただき(https://teratail.com/help#resolve-myself )、それをベストアンサーとしてしまえばいいかと思います。
guest

回答1

0

自己解決

前回の続きのため、前提等はある程度省いて説明させていただきます。

白玉のインスペクター上にあるNew Behaviour SprictのOther Ballsにある要素項目に、それぞれ白玉以外の玉をヒエラルキーウィンドウからドラッグアンドドロップする。

Spring Jointはそれぞれ値を統一する。SpringJointに限らず、ジョイント類は一方から他方へ1本だけつなげば十分であり、逆方向にもう1本アタッチする必要はない。

ばねの項目の意味
Enable Collision → ほかの玉との衝突判定
Connected Rigid Body → つなぐ玉
Auto Configure Connected Anchor  → オンにすると「接続されたアンカー」がワールド空間上の「Anchor」の位置と同じになるよう自動設定してくれるはずだが、今回の場合でそれをやるとバネの末端が変な位置につながれる。

Anchor X:0 y:0 バネの末端の位置
接続されたアンカー x:0 y:0 バネの末端の位置
Auto Configure Distance  → 「距離」が自動設定されるはずです。自動設定の時には質量は考慮されず、単にシーン上の位置関係だけから距離が決められる

距離 → 自然長
Damping Ratio → 減衰比 ??指定した距離にばねが縮むむまでどのくらい振動するか?0~1で大きくなるほど動きは少ない

Frequency  → ばね定数K? 0~1000,000,000の範囲で値がでかいほどばねは固くなる。
Break Force → SpringJoint2Dを破壊するのに必要な力 infinityで壊れない

投稿2021/11/12 06:16

integral2ydx

総合スコア7

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

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

integral2ydx

2021/11/12 06:17

Bongoさんありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問