// такая же катушка, только для В 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); } } }