0

シーンに 2 つの球体があります。ある球体から別の球体にマウスをドラッグ アンド ドロップし、ドラッグ中にインジケータ (直線など) を表示できるようにしたいと考えています。マウス ボタンを離した後、最初の球体にもう一方の球体を (GameObject として) 格納したいと考えています。

UnityScript でこれが必要ですが、C# のアイデアを受け入れることができます。

onMouseDownこれまでのところ、最初のスフィアでのイベントについて考え、次にonMouseEnter他のスフィアで、データをグローバル変数に保存します (これはまだ方法を知りません) onMouseExit。ヌルとして。

次にonMouseUp、最初の球体で、押されたオブジェクト (球体) にグローバル変数を格納します。

それを行う方法に関するヒントやコツはありますか?

4

1 に答える 1

1

クリック アンド ドラッグ機能のデモンストレーション

前提条件/設定

  1. 2D ワールドスペースで作業しています。ソリューションのこの部分のオブジェクトをドラッグするためのロジックを変更する必要があります。

  2. クリックドラッグ後に親を設定するとは、クリックしなかったオブジェクトを、クリックした親の子に設定することを指します。

  3. カメラは正投影カメラである必要があります。遠近法カメラを使用すると、ドラッグが本来あるべき場所と一致しなくなります。

  4. ドラッグを機能させるために、2D シーンの「背景」として使用されるクワッドを作成し、それを「背景」と呼ばれる新しいレイヤーに配置しました。次に、背景レイヤーのみを使用するようにレイヤーマスク フィールドを設定します。

  5. ライン レンダラー (上記の例では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);
    }
}

これが誰かを助けたことを願っています。

于 2016-03-04T13:08:47.897 に答える