Spring Joint 2Dの「Auto Configure Distance」がオンになっていますので、transform.position = currentPosition;
に呼応してバネの自然長が更新され、どんどんバネが伸びていっているのかもしれませんね。
試しにそれをオフにしてみてはいかがでしょうか。ただ個人的な意見を申し上げさせていただきますと、あれをオフにして解決するよりも、もっと物理シミュレーションと親和性の高い移動方法をとった方が面倒が少ないんではないかな...という気がします。
「Auto Configure Distance」をオフにするので動作上問題なさそうならかまわないのですが、たとえばもし「ボールにすごく強い力が加わったかのように暴れ回る」みたいな奇妙な挙動をするようでしたら、別案として...
左端のボールのRigidbody 2Dの「Body Type」を「Kinematic」にする。
ドラッグ時の移動にMovePosition を使う。
というのを試してみてはいかがでしょう。
lang
1 using UnityEngine;
2
3 public class NewBehaviourScript : MonoBehaviour
4 {
5 private Vector3 screenPoint;
6 private Vector3 offset;
7 private new Rigidbody2D rigidbody2D;
8
9 void Start()
10 {
11 this.rigidbody2D = this.GetComponent<Rigidbody2D>();
12 }
13
14 void OnMouseDown()
15 {
16 this.screenPoint = Camera.main.WorldToScreenPoint(transform.position);
17 this.offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
18 }
19
20 void OnMouseDrag()
21 {
22 Vector3 currentScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
23 Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint) + this.offset;
24 this.rigidbody2D.MovePosition(currentPosition);
25 }
26 }
##ドラッグ開始時にバネ運動を開始する例
lang
1 using UnityEngine;
2
3 public class NewBehaviourScript : MonoBehaviour
4 {
5 // Rigidbody2Dをセットするためのフィールドを追加し、ここに
6 // インスペクター上で残り2つのボールをセットしておく
7 [SerializeField] private Rigidbody2D[] otherBalls;
8
9 private Vector3 screenPoint;
10 private Vector3 offset;
11 private new Rigidbody2D rigidbody2D;
12
13 void Start()
14 {
15 this.rigidbody2D = this.GetComponent<Rigidbody2D>();
16
17 // Start時点では、他の2つのボールをKinematic状態にしておく
18 foreach (var otherBall in this.otherBalls)
19 {
20 otherBall.bodyType = RigidbodyType2D.Kinematic;
21 }
22 }
23
24 void OnMouseDown()
25 {
26 this.screenPoint = Camera.main.WorldToScreenPoint(transform.position);
27 this.offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
28
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 // マウスボタンを離したら再びバネ運動をやめて固定したい場合...
45 void OnMouseUp()
46 {
47 // OnMouseUpで他の2つのボールをKinematic状態に変え、
48 // 速度・角速度もゼロにする
49 foreach (var otherBall in this.otherBalls)
50 {
51 otherBall.bodyType = RigidbodyType2D.Kinematic;
52 otherBall.velocity = Vector2.zero;
53 otherBall.angularVelocity = 0.0f;
54 }
55 }
56 */
57 }
OnMouseUpなしの場合
OnMouseUpありの場合
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/02 03:47
2021/11/02 18:31
2021/11/03 05:35
2021/11/03 07:19
2021/11/03 16:40
2021/11/04 06:27
2021/11/04 12:01
2021/11/05 05:33
2021/11/05 06:08
2021/11/05 21:12
2021/11/08 05:58
2021/12/15 09:20
2021/12/15 11:52
2021/12/16 06:49
2021/12/16 11:59
2021/12/17 05:41
2021/12/17 11:11
2021/12/19 07:48
2022/01/13 15:30