private void createLink(int agent, int area, Edge edge)
    {
        var     pos      = (edge.Start + edge.End) * 0.5f;
        var     normal   = Vector3.Cross(edge.End - edge.Start, Vector3.up);
        Vector3 startPos = pos;
        Vector3 endPos   = startPos + normal.normalized * maxLinkWidth;
        float   wid      = Vector3.Distance(edge.End, edge.Start);

        lock (ExecutionQueue)
        {
            var param = new paramData(agent, area, startPos, endPos, pos, wid);
            ExecutionQueue.Enqueue(param);
        }
    }
    /// <summary>
    /// find higher or lower target position, can be optimized to one ray,but I've no time..
    /// </summary>
    /// <param name="data"></param>
    public void Try2Hits(paramData data)
    {
        int     agent    = data.Agent;
        int     area     = data.Area;
        Vector3 startPos = data.StartPos;
        Vector3 endPos   = data.EndPos - Vector3.up * maxLinkHeightD * 1.1f;
        Vector3 pos      = data.Pos;
        float   wid      = data.Wid;

        if (!tryHitNav(agent, area, startPos, endPos, pos, wid))
        {        //try upper
            endPos = data.EndPos + Vector3.up * maxLinkHeightU * 1.1f;
            tryHitNav(agent, area, startPos, endPos, pos, wid);
        }
    }