
前提条件/設定
2D ワールドスペースで作業しています。ソリューションのこの部分のオブジェクトをドラッグするためのロジックを変更する必要があります。
クリックドラッグ後に親を設定するとは、クリックしなかったオブジェクトを、クリックした親の子に設定することを指します。
カメラは正投影カメラである必要があります。遠近法カメラを使用すると、ドラッグが本来あるべき場所と一致しなくなります。
ドラッグを機能させるために、2D シーンの「背景」として使用されるクワッドを作成し、それを「背景」と呼ばれる新しいレイヤーに配置しました。次に、背景レイヤーのみを使用するようにレイヤーマスク フィールドを設定します。
ライン レンダラー (上記の例ではParticles/Additiveシェーダーを使用しています) 用のマテリアルを作成してセットアップし、使用しているライン レンダラーのパラメーター用Start Width: 0.75
に、がチェックEnd Width: 0
されていることを確認します。Use World Space

説明
まずotherSphere
、シーン内の他の球体を指すようにフィールドをセットアップします。ラインレンダラーを更新する必要があるかどうかを判断するために使用される mouseDown boolOnMouseDown
を切り替えます。OnMouseUp
これらは、ライン レンダラーのオン/オフを切り替えたり、2 つの球体の親トランスフォームを設定/削除したりするためにも使用されます。
ドラッグする位置を取得するために、メソッドScreenPointToRayを使用して、画面上のマウスの位置に基づいて光線を取得しています。このドラッグ機能にスムージングを追加したい場合はif (...) else
、一番下のステートメントを有効にして、lerpTime に値を設定する必要があります (0.25 が私には適していました)。
ノート; マウスを放すとすぐに親が設定され、両方のオブジェクトがドラッグされますが、子は元の位置に戻ります。
[RequireComponent(typeof(LineRenderer))]
public class ConnectedSphere : MonoBehaviour
{
[SerializeField]
private Transform m_otherSphere;
[SerializeField]
private float m_lerpTime;
[SerializeField]
private LayerMask m_layerMask;
private LineRenderer m_lineRenderer;
private bool m_mouseDown;
private Vector3 m_position;
private RaycastHit m_hit;
public void Start()
{
m_lineRenderer = GetComponent<LineRenderer>();
m_lineRenderer.enabled = false;
m_position = transform.position;
}
public void OnMouseDown()
{
//Un-parent objects
transform.parent = null;
m_otherSphere.parent = null;
m_mouseDown = true;
m_lineRenderer.enabled = true;
}
public void OnMouseUp()
{
//Parent other object
m_otherSphere.parent = transform;
m_mouseDown = false;
m_lineRenderer.enabled = false;
}
public void Update()
{
//Update line renderer and target position whilst mouse down
if (m_mouseDown)
{
//Set line renderer
m_lineRenderer.SetPosition(0, transform.position);
m_lineRenderer.SetPosition(1, m_otherSphere.position);
//Get mouse world position
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out m_hit, m_layerMask))
{
m_position.x = m_hit.point.x;
m_position.y = m_hit.point.y;
}
}
//Set position (2D world space)
//if (m_lerpTime == 0f)
transform.position = m_position;
//else
//transform.position = Vector3.Lerp(transform.position, m_position, Time.deltaTime / m_lerpTime);
}
}
これが誰かを助けたことを願っています。