private void CreateJoint(int id, float mass, Vector2 jointPosition, float[] weights) { var gJoint = new GameObject("Joint" + (id + 1)); gJoint.transform.parent = thisTransform; gJoint.layer = JointsLayer; var joint = gJoint.AddComponent <SpringJoint2D>(); Rigidbody2D rigidBody = joint.GetComponent <Rigidbody2D>(); rigidBody.gravityScale = 0; var jointRigidBody = joint.GetComponent <Rigidbody2D>(); #if UNITY_5_3_OR_NEWER if (AutoMass) { jointRigidBody.useAutoMass = true; } else { jointRigidBody.mass = mass; } #else jointRigidBody.mass = mass; #endif jointRigidBody.drag = LinearDrag; jointRigidBody.angularDrag = AngularDrag; #if UNITY_5_3_OR_NEWER || UNITY_5_2 || UNITY_5_1 jointRigidBody.constraints = RigidbodyConstraints2D.FreezeRotation; #else jointRigidBody.fixedAngle = true; #endif #if UNITY_5_3_OR_NEWER joint.autoConfigureConnectedAnchor = false; joint.autoConfigureDistance = false; #endif joint.connectedBody = thisRigidbody; joint.distance = Distance; joint.frequency = Frequency; joint.dampingRatio = DampingRation; var circleCollider = gJoint.AddComponent <CircleCollider2D>(); circleCollider.radius = JointRadius; circleCollider.sharedMaterial = JointsPhysicMaterial; gJoint.transform.localPosition = jointPosition; joint.connectedAnchor = jointPosition; jointsStartLocalPositions.Add(jointPosition); var mJoint = new mJoint { Collider = circleCollider, Joint = joint, GameObject = gJoint, Rigidbody2D = jointRigidBody, Transform = gJoint.transform, Weights = weights }; Joints.Add(mJoint); }
private void Initialize() { if (!isCached) { CacheObjects(); } canUpdate = false; DestroyJoints(); jointsStartLocalPositions.Clear(); var size = thisRenderer.bounds.size; jointCountSqrt = (int)Mathf.Sqrt(JointCount); jointSize = ((size.x > size.y) ? size.x : size.y) / jointCountSqrt / 2f; var massOfJoint = Mass / JointCount; var mass = (massOfJoint > MinimalMass) ? massOfJoint : MinimalMass; for (int i = 0; i < JointCount; i++) { var gJoint = new GameObject("Joint" + (i + 1)); gJoint.transform.parent = thisTransform; gJoint.transform.localPosition = Vector3.zero; var joint = gJoint.AddComponent <SpringJoint2D>(); var jointRigidBody = joint.GetComponent <Rigidbody2D>(); jointRigidBody.mass = mass; jointRigidBody.drag = LinearDrag; jointRigidBody.angularDrag = AngularDrag; #if UNITY_5_3_OR_NEWER || UNITY_5_2 || UNITY_5_1 jointRigidBody.constraints = RigidbodyConstraints2D.FreezeRotation; #else jointRigidBody.fixedAngle = true; #endif #if UNITY_5_3_OR_NEWER joint.autoConfigureConnectedAnchor = false; joint.autoConfigureDistance = false; #endif joint.connectedBody = thisRigidbody; joint.distance = Distance; joint.frequency = Frequency; joint.dampingRatio = DampingRation; var circleCollider = gJoint.AddComponent <CircleCollider2D>(); circleCollider.radius = jointSize; var mJoint = new mJoint { Collider = circleCollider, Joint = joint, GameObject = gJoint, Rigidbody2D = jointRigidBody, Transform = gJoint.transform }; Joints.Add(mJoint); var x = (i % jointCountSqrt) * 2 - (jointCountSqrt - 1); var y = (i / jointCountSqrt) * 2 - (jointCountSqrt - 1); joint.connectedAnchor = new Vector2(x * jointSize / 2, y * jointSize / 2) * Mathf.Sqrt(2f); jointsStartLocalPositions.Add(joint.connectedAnchor); } for (int i = 0; i < Joints.Count - 1; i++) { for (int j = i + 1; j < Joints.Count; j++) { if (Joints[i] != null && Joints[j] != null) { Physics2D.IgnoreCollision(Joints[i].Collider, Joints[j].Collider); } } } canUpdate = true; if (OnInitializeCompleted != null) { OnInitializeCompleted(); } }