/// <summary>
    /// スナップの追加
    /// </summary>
    public void AddSnap(int precedence, BaseSnap snap, Action callback = null)
    {
        PrecedenceSnap pre = new PrecedenceSnap(precedence, snap);

        snaps.Add(pre);
        if (callback != null)
        {
            callbackDic.Add(pre, callback);
        }
    }
    /// <summary>
    /// スナップ
    /// </summary>
    public bool Snap(Vector2 point, out Vector2 result)
    {
        result = Vector2.zero;

        if (snaps.Count == 0)
        {
            return(false);
        }
        float          minDistance = float.MaxValue;
        Vector2        sample;
        PrecedenceSnap snap   = null;
        bool           snaped = false;

        for (int i = 0; i < snaps.Count; ++i)
        {
            PrecedenceSnap e = snaps[i];
            if (e.snap.Snap(point, out sample))
            {
                if (snap == null)
                {
                    result      = sample;
                    snap        = e;
                    minDistance = (sample - point).magnitude;
                    snaped      = true;
                }
                else if (e.precedence > snap.precedence)
                {
                    result      = sample;
                    snap        = e;
                    minDistance = (sample - point).magnitude;
                    snaped      = true;
                }
                else if (snap.precedence == e.precedence)
                {
                    //距離を測る
                    float distance = (sample - point).magnitude;
                    if (minDistance > distance)
                    {
                        result      = sample;
                        snap        = e;
                        minDistance = distance;
                        snaped      = true;
                    }
                }
            }
        }
        prevSnap = snap;
        return(snaped);
    }