Ejemplo n.º 1
0
    // такая же катушка, только для В
    void coilBCheck()
    {
        //если скорость нулевая, то нет смысла что-то там сложно просчитывать
        if (coilBSpeed == 0 || prefabsList.Count == 0 || B == null)
        {
            return;
        }


        // ОТМОТКА от B
        float coilВSpeedReduсer = coilBSpeed * 0.01f; // чтобы скорость в инспекторе не выставлялась такой большой, работаю с уменьшеной копией оригинальной скорости.

        if (coilВSpeedReduсer > 0)                    //нужно двигать от B
        {
            //если отматывать нечего, или последнее звено не присоеденено к В - то создаём новое звено и завершаем метод
            if (links.Count == 0 || links[links.Count - 1].hingle2_IsExistActiveAndConnectedTo(B.GetComponent <Rigidbody2D>()) == false)
            {
                if (chainMode == ChainMode.None)
                {
                    currentId = prefabId;
                }
                else if (chainMode == ChainMode.Random)
                {
                    currentId = links.Count == 0 ? UnityEngine.Random.Range(0, prefabsList.Count) : links[links.Count - 1].prefabIdNext;
                }
                else if (chainMode == ChainMode.Queue)
                {
                    currentId = (links.Count + queueOffset) % prefabsList.Count;
                }
                addPartFromB(currentId);
                return;
            }

            LinkInfo lastPart = links[links.Count - 1];


            //направление от B до правой стороны последнего звена (тащим ведь за правую сторону)
            Vector3 dir = lastPart.obj.transform.TransformPoint(Vector3.right * lastPart.widthHalf) - B.transform.TransformPoint(offsetB);

            //Vector3 dir = lastPart.hingleJoint_2.connectedAnchor - offsetB;
            float dist = dir.magnitude;
            dist += coilВSpeedReduсer;


            //если звено одно, то тащить его вниз от B, иначе тащить в сторону к предыдущему звену, если текущее звено привязано к нему
            if (links.Count > 1 && lastPart.hingle1_IsActiveAndConnectedTo(links[links.Count - 2].rb2D))
            {
                lastPart.hingleJoint_2.connectedAnchor += (Vector2)(B.transform.InverseTransformDirection(links[links.Count - 2].obj.transform.position - lastPart.obj.transform.position).normalized) * coilВSpeedReduсer;
            }
            else
            {
                lastPart.hingleJoint_2.connectedAnchor = (Vector3)offsetB + (Vector3.down * dist);
            }


            float w = (_prefabsListWidths[lastPart.prefabIdNext] + anchorOffset) * scaleFactorX;

            // СОЗДАТЬ ЛИ НОВОЕ? Если звено дальше от А, чем ширина нового звена (которое появится), то создать новое звено
            if (dist >= w)
            {
                //создать новое звено и прецепить к А серединой
                addPartFromB(lastPart.prefabIdNext);
            }
        }
        // НАМОТКА на В
        else if (coilВSpeedReduсer < 0)
        {
            // если звеньев нет, или последнее звено не привязано к В, то тащить нечего..
            if (links.Count == 0 || links[links.Count - 1].hingle2_IsExistActiveAndConnectedTo(B.GetComponent <Rigidbody2D>()) == false)
            {
                return;
            }

            LinkInfo lastPart = links[links.Count - 1];
            //расстояние и направление от В, до крепления последнего звена
            Vector3 dir  = lastPart.hingleJoint_2.connectedAnchor - offsetB;
            float   dist = dir.magnitude;

            //уменьшить расстояние, но не на больше, чем само расстояние
            dist += coilВSpeedReduсer > dist ? dist : coilВSpeedReduсer;

            // уменьшить расстояние от последнего звена до В
            lastPart.hingleJoint_2.connectedAnchor = (Vector3)offsetB + (dir.normalized * dist);

            if (dist <= 0.01f)
            {
                // если звеньев было несколько и то, которое тащили было привязано к другому
                if (links.Count > 1 && lastPart.hingle1_IsActiveAndConnectedTo(links[links.Count - 2].rb2D))
                {
                    //предпоследнее звено
                    LinkInfo penultimatePart = links[links.Count - 2];

                    // прицепить педпоследнее звено к В вторым джоинтом.
                    if (penultimatePart.hingleJoint_2 == null)
                    {
                        penultimatePart.hingleJoint_2 = penultimatePart.obj.AddComponent <HingeJoint2D>();
                    }


                    //прицепить предпоследнее звено вторым джоинтом к В, на текущем расстоянии
                    penultimatePart.hingleJoint_2.connectedBody = B.GetComponent <Rigidbody2D>();

                    penultimatePart.hingleJoint_2.connectedAnchor = B.transform.InverseTransformPoint(penultimatePart.obj.transform.TransformPoint(Vector3.right * penultimatePart.widthHalf));

                    penultimatePart.hingleJoint_2.anchor = Vector3.right * penultimatePart.widthHalf;
                }

                Destroy(lastPart.obj);
                links.RemoveAt(links.Count - 1);
            }
        }
    }