예제 #1
0
    static public void ComplexSlice(Slice2D slice, float forceAmount)
    {
        foreach (GameObject gameObject in slice.GetGameObjects())
        {
            Rigidbody2D rigidBody2D = gameObject.GetComponent <Rigidbody2D> ();

            List <Vector2D> collisions = slice.GetCollisions();

            if (rigidBody2D)
            {
                float forceVal = 2.0f / collisions.Count;

                Vector2 force = new Vector2();
                float   sliceRotation;
                Vector2 centerPos = new Vector2();

                for (int i = 0; i < collisions.Count - 1; i++)
                {
                    pair.A = collisions[i];
                    pair.B = collisions[i + 1];

                    sliceRotation = (float)Vector2D.Atan2(pair.B, pair.A);

                    force.x = Mathf.Cos(sliceRotation) * forceAmount;
                    force.y = Mathf.Sin(sliceRotation) * forceAmount;

                    centerPos.x = (float)(pair.A.x + pair.B.x) / 2f;
                    centerPos.y = (float)(pair.A.y + pair.B.y) / 2f;

                    PhysicsHelper2D.AddForceAtPosition(rigidBody2D, forceVal * force, centerPos);
                }
            }
        }
    }
예제 #2
0
        private void LinearSlice(Pair2D slice)
        {
            List <Slice2D> results = Slicer2D.LinearSliceAll(slice, null);

            if (addForce == false)
            {
                return;
            }

            // Adding Physics Forces
            float sliceRotation = (float)Vector2D.Atan2(slice.B, slice.A);

            foreach (Slice2D id in results)
            {
                foreach (GameObject gameObject in id.GetGameObjects())
                {
                    Rigidbody2D rigidBody2D = gameObject.GetComponent <Rigidbody2D> ();
                    if (rigidBody2D == null)
                    {
                        continue;
                    }
                    foreach (Vector2D p in id.GetCollisions())
                    {
                        PhysicsHelper2D.AddForceAtPosition(rigidBody2D, new Vector2(Mathf.Cos(sliceRotation) * addForceAmount, Mathf.Sin(sliceRotation) * addForceAmount), p.ToVector2());
                    }
                }
            }
        }
예제 #3
0
 static public void ExplodeInPoint(Slice2D slice, float forceAmount, Vector2D point)
 {
     foreach (GameObject gameObject in slice.GetGameObjects())
     {
         Rigidbody2D rigidBody2D = gameObject.GetComponent <Rigidbody2D> ();
         if (rigidBody2D)
         {
             float sliceRotation = (float)Vector2D.Atan2(point, new Vector2D(gameObject.transform.position));
             Rect  rect          = Polygon2DList.CreateFromGameObject(gameObject)[0].GetBounds();
             PhysicsHelper2D.AddForceAtPosition(rigidBody2D, new Vector2(Mathf.Cos(sliceRotation) * forceAmount, Mathf.Sin(sliceRotation) * forceAmount), rect.center);
         }
     }
 }
예제 #4
0
    static public void LinearTrail(Slice2D slice, float forceAmount)
    {
        foreach (GameObject gameObject in slice.GetGameObjects())
        {
            Rigidbody2D rigidBody2D = gameObject.GetComponent <Rigidbody2D> ();
            if (rigidBody2D)
            {
                float sliceRotation = (float)Vector2D.Atan2(slice.slice[0], slice.slice[1]);

                List <Vector2D> collisions = slice.GetCollisions();

                foreach (Vector2D p in collisions)
                {
                    Vector2 force = new Vector2(Mathf.Cos(sliceRotation) * forceAmount, Mathf.Sin(sliceRotation) * forceAmount);
                    PhysicsHelper2D.AddForceAtPosition(rigidBody2D, force, p.ToVector2());
                }
            }
        }
    }
예제 #5
0
    static public void ComplexTrail(Slice2D slice, float forceAmount)
    {
        Rigidbody2D rigidBody2D;
        Vector2D    vec;
        float       sliceRotation;
        float       forceVal;
        Vector2     vecSum = Vector2.zero;

        for (int i = 0; i < slice.GetGameObjects().Count; i++)
        {
            rigidBody2D = slice.GetGameObjects()[i].GetComponent <Rigidbody2D> ();
            if (rigidBody2D)
            {
                List <Vector2D> collisions = slice.GetCollisions();

                forceVal = 2.0f / collisions.Count;
                for (int x = 0; x < collisions.Count; x++)
                {
                    vec = collisions[x];

                    pair.A = vec;

                    if (pair.A != null && pair.B != null)
                    {
                        sliceRotation = (float)Vector2D.Atan2(pair.A, pair.B);

                        force.x = Mathf.Cos(sliceRotation) * forceAmount;
                        force.y = Mathf.Sin(sliceRotation) * forceAmount;

                        vecSum.x = (float)(pair.A.x + pair.B.x) / 2f;
                        vecSum.y = (float)(pair.A.y + pair.B.y) / 2f;

                        PhysicsHelper2D.AddForceAtPosition(rigidBody2D, forceVal * force, vecSum);
                    }

                    pair.B = pair.A;
                }
            }
        }
    }