blob: 14d630e4978ff92e36424adf43767dc016ffacb3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
using UnityEngine;
/// <summary>
/// Drag a Rigidbody2D by selecting one of its colliders by pressing the mouse down.
/// When the collider is selected, add a TargetJoint2D.
/// While the mouse is moving, continually set the target to the mouse position.
/// When the mouse is released, the TargetJoint2D is deleted.`
/// </summary>
public class DragTarget : MonoBehaviour
{
public LayerMask m_DragLayers;
[Range (0.0f, 100.0f)]
public float m_Damping = 1.0f;
[Range (0.0f, 100.0f)]
public float m_Frequency = 5.0f;
public bool m_DrawDragLine = true;
public Color m_Color = Color.cyan;
private TargetJoint2D m_TargetJoint;
void Update ()
{
// Calculate the world position for the mouse.
var worldPos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
if (Input.GetMouseButtonDown (0))
{
// Fetch the first collider.
// NOTE: We could do this for multiple colliders.
var collider = Physics2D.OverlapPoint (worldPos, m_DragLayers);
if (!collider)
return;
// Fetch the collider body.
var body = collider.attachedRigidbody;
if (!body)
return;
// Add a target joint to the Rigidbody2D GameObject.
m_TargetJoint = body.gameObject.AddComponent<TargetJoint2D> ();
m_TargetJoint.dampingRatio = m_Damping;
m_TargetJoint.frequency = m_Frequency;
// Attach the anchor to the local-point where we clicked.
m_TargetJoint.anchor = m_TargetJoint.transform.InverseTransformPoint (worldPos);
}
else if (Input.GetMouseButtonUp (0))
{
Destroy (m_TargetJoint);
m_TargetJoint = null;
return;
}
// Update the joint target.
if (m_TargetJoint)
{
m_TargetJoint.target = worldPos;
// Draw the line between the target and the joint anchor.
if (m_DrawDragLine)
Debug.DrawLine (m_TargetJoint.transform.TransformPoint (m_TargetJoint.anchor), worldPos, m_Color);
}
}
}
|