白玉の写真です。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がよくわからなくなっていたため、質問しなおしました。
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー