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);
    }
Exemplo n.º 2
0
    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();
        }
    }