private void BuildRope() { // segments - количество сегментов: [resolution of 1.0 = 1 joint per unit of distance] _segments = Mathf.FloorToInt(Vector3.Distance(transform.position, targetTransform.position) * resolution); if (material != null) { material.SetTextureScale("_MainTex", new Vector2(1, _segments + 2)); if (material.GetTexture("_BumpMap")) { material.SetTextureScale("_BumpMap", new Vector2(1, _segments + 2)); } } _segmentPos = new Vector3[_segments]; _parts = new GameObject[_segments]; _segmentPos[0] = transform.position; _segmentPos[_segments - 1] = targetTransform.position; int segs = _segments - 1; // количество интервалов Vector3 seperation = ((targetTransform.position - transform.position) / segs); _jointAxis = seperation; // направление соединений // for (int s = 0; s < _segments; s++) for (int s = 0; s < _segments - 1; s++) { Vector3 vector = (seperation * s) + transform.position; // позиции сегментов _segmentPos[s] = vector; _parts[s] = new GameObject("Joint_" + s); AddJointPhysics(s); // добавление к каждому сегменту физики и соединений } _segmentPos[_segments - 1] = targetTransform.position; _parts[_segments - 1] = targetTransform.gameObject; AddJointPhysics(_segments - 1); if (endRestrained) { targetTransform.GetComponent <Rigidbody>().isKinematic = true; } if (startRestrained) { transform.GetComponent <Rigidbody> ().isKinematic = true; } // запретить коллизию объектов, идущих через одного for (int i = 0; i < _parts.Length - 2; ++i) { Collider col1 = _parts[i].GetComponent <Collider>(); Collider col2 = _parts[i + 2].GetComponent <Collider>(); Physics.IgnoreCollision(col1, col2); } _tubeRendererObject = new GameObject("TubeRenderer_" + gameObject.name); // присоединяем к GameObject класс, получаем ссылку на объект этого класса _tube = _tubeRendererObject.AddComponent <TubeRenderer2>(); // теперь _tube - экземпляр TubeRenderer2 _tube.useMeshCollision = useMeshCollision; _tube.vertices = new TubeVertex[_segments]; _tube.crossSegments = radialSegments; _tube.material = material; _isTube = true; // Rope = true, The rope now exists in the scene! }
private void BuildRope() { tubeRenderer = new GameObject("TubeRenderer_" + gameObject.name); // присоединяем к GameObject класс, получаем ссылку на объект этого класса line = tubeRenderer.AddComponent <TubeRenderer2>(); // теперь line - экземпляр TubeRenderer2 line.useMeshCollision = useMeshCollision; // Find the amount of segments based on the distance and resolution // Example: [resolution of 1.0 = 1 joint per unit of distance] segments = Mathf.FloorToInt(Vector3.Distance(transform.position, target.position) * resolution); if (material != null) { material.SetTextureScale("_MainTex", new Vector2(1, segments + 2)); if (material.GetTexture("_BumpMap")) { material.SetTextureScale("_BumpMap", new Vector2(1, segments + 2)); } } line.vertices = new TubeVertex[segments]; line.crossSegments = radialSegments; line.material = material; segmentPos = new Vector3[segments]; joints = new GameObject[segments]; segmentPos[0] = transform.position; segmentPos[segments - 1] = target.position; // Find the distance between each segment int segs = segments - 1; Vector3 seperation = ((target.position - transform.position) / segs); for (int s = 0; s < segments; s++) { // Find the each segments position using the slope from above Vector3 vector = (seperation * s) + transform.position; segmentPos[s] = vector; //Add Physics to the segments AddJointPhysics(s); } // Attach the joints to the target object and parent it to this object CharacterJoint end = target.gameObject.AddComponent <CharacterJoint> (); end.connectedBody = joints[joints.Length - 1].transform.GetComponent <Rigidbody> (); end.swingAxis = swingAxis; SoftJointLimit limit1 = end.lowTwistLimit; limit1.limit = lowTwistLimit; end.lowTwistLimit = limit1; SoftJointLimit limit2 = end.highTwistLimit; limit2.limit = highTwistLimit; end.highTwistLimit = limit2; SoftJointLimit limit3 = end.swing1Limit; limit3.limit = swing1Limit; end.swing1Limit = limit3; target.parent = transform; if (endRestrained) { end.GetComponent <Rigidbody> ().isKinematic = true; } // FEDOR ***************** end.GetComponent <Rigidbody>().useGravity = gameObject.GetComponent <Rigidbody>().useGravity; // *********************** if (startRestrained) { transform.GetComponent <Rigidbody> ().isKinematic = true; } // Rope = true, The rope now exists in the scene! rope = true; }
private void BuildRope() { // segments - количество сегментов: [resolution of 1.0 = 1 joint per unit of distance] _segments = Mathf.FloorToInt(Vector3.Distance(transform.position, targetTransform.position) * resolution); if (material != null) { material.SetTextureScale("_MainTex", new Vector2(1, _segments + 2)); if (material.GetTexture("_BumpMap")) { material.SetTextureScale("_BumpMap", new Vector2(1, _segments + 2)); } } _segmentPos = new Vector3[_segments]; _parts = new GameObject[_segments]; Vector3 seperation = ((targetTransform.position - transform.position) / (_segments - 1)); _jointAxis = seperation; // направление соединений (для пружинного соединения не используется) for (int s = 0; s < _segments - 1; s++) { Vector3 vector = (seperation * s) + transform.position; // позиции объектов _segmentPos[s] = vector; _parts[s] = new GameObject("Joint_" + s); _parts[s].transform.parent = transform; // сделали созданный объект дочерним данного AddJointPhysics(s); // добавление к каждому объекту физики и соединений } targetTransform.transform.parent = transform; _segmentPos[_segments - 1] = targetTransform.position; _parts[_segments - 1] = targetTransform.gameObject; AddJointPhysics(_segments - 1); if (endRestrained) { targetTransform.GetComponent <Rigidbody>().isKinematic = true; } if (startRestrained) { _parts[0].GetComponent <Rigidbody>().isKinematic = true; } // запретить коллизию объектов, идущих через одного for (int i = 0; i < _parts.Length - 2; ++i) { Collider col1 = _parts[i].GetComponent <Collider>(); Collider col2 = _parts[i + 2].GetComponent <Collider>(); Physics.IgnoreCollision(col1, col2); } // создание объекта - рисовальщика меша _tubeRendererObject = new GameObject("TubeRenderer_" + gameObject.name); // присоединяем к GameObject класс, получаем ссылку на объект этого класса _tube = _tubeRendererObject.AddComponent <TubeRenderer2>(); // теперь _tube - экземпляр TubeRenderer2 _tube.useMeshCollision = false; _tube.vertices = new TubeVertex[_segments]; _tube.crossSegments = radialSegments; _tube.material = material; _isTube = true; // Труба создана и присутствует на сцене }