Inheritance: MonoBehaviour
    /// <summary>
    /// Turns Gameobject into multiple fragments
    /// </summary>
    private void generateFragments()
    {
        fragments = new List <GameObject>();
        switch (shatterType)
        {
        case ShatterType.Triangle:
            fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps);
            break;

        case ShatterType.Voronoi:
            fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps);
            break;

        default:
            Debug.Log("invalid choice");
            break;
        }
        //sets additional aspects of the fragments
        foreach (GameObject p in fragments)
        {
            if (p != null)
            {
                p.layer = LayerMask.NameToLayer(fragmentLayer);
                p.GetComponent <Renderer>().sortingLayerName = sortingLayerName;
                p.GetComponent <Renderer>().sortingOrder     = orderInLayer;
            }
        }
    }
Beispiel #2
0
    public void Break(MonoBehaviour upon)
    {
        SpriteExploder.Explode(this);
        AfterBreak(upon);

        Destroy(gameObject);
    }
    /// <summary>
    /// Turns Gameobject into multiple fragments
    /// </summary>
    private void generateFragments()
    {
        ClearCollider();
        fragments = new List <GameObject>();
        switch (shatterType)
        {
        case ShatterType.Triangle:
            fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps);
            break;

        case ShatterType.Voronoi:
            fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps);
            break;

        default:
            Debug.Log("invalid choice");
            break;
        }

        SetCollider();

        //sets additional aspects of the fragments
        foreach (GameObject p in fragments)
        {
            if (p != null)
            {
                p.layer = LayerMask.NameToLayer(fragmentLayer);
                p.GetComponent <Renderer>().sortingLayerName = sortingLayerName;
                p.GetComponent <Renderer>().sortingOrder     = orderInLayer;
                MeshCollider meshCol = p.AddComponent <MeshCollider>();
                meshCol.skinWidth = ChildrenColliderWidth;
                Rigidbody rb = p.AddComponent <Rigidbody>();
                rb.mass            = UnityEngine.Random.Range(MassPerFragment.minValue, MassPerFragment.maxValue);
                rb.useGravity      = UseGravityOnFragments;
                rb.drag            = UnityEngine.Random.Range(DragPerFragment.minValue, DragPerFragment.maxValue);
                rb.angularDrag     = UnityEngine.Random.Range(AngularDragPerFragment.minValue, AngularDragPerFragment.maxValue);
                rb.constraints     = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY;
                meshCol.sharedMesh = p.GetComponent <MeshFilter>().sharedMesh;
                meshCol.sharedMesh.RecalculateBounds();
                meshCol.sharedMesh.RecalculateNormals();
                meshCol.sharedMesh.RecalculateTangents();
                meshCol.convex = true;
                if (DestroyPiecesAfterHit)
                {
                    p.AddComponent <DestroyAfter>().Time = UnityEngine.Random.Range(DestroyAfterTime.minValue, DestroyAfterTime.maxValue);
                }
            }
        }

        foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>())
        {
            if (addon.enabled)
            {
                addon.OnFragmentsGenerated(fragments);
            }
        }
    }
	void Awake()
	{
		if(instance == null)
		{
			instance = this;
		}
		else 
			Destroy(gameObject);
	}
    /// <summary>
    /// Turns Gameobject into multiple fragments
    /// </summary>
    private void generateFragments(bool meshSaved = false)
    {
        fragments = new List <GameObject>();

        switch (shatterType)
        {
        case ShatterType.Triangle:
            fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps, null, meshSaved);
            break;

        case ShatterType.Voronoi:
            fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps, null, meshSaved);
            break;

        default:
            Debug.Log("invalid choice");
            break;
        }


        for (int i = 0; i < fragments.Count; i++)
        {
            if (fragments[i] != null)
            {
                fragments[i].layer = LayerMask.NameToLayer(fragmentLayer);
                fragments[i].GetComponent <Renderer>().sortingLayerName = sortingLayerName;
                fragments[i].GetComponent <Renderer>().sortingOrder     = orderInLayer;
                fragments[i].GetComponent <Rigidbody2D>().gravityScale  = 0;

                /// prefab mesh save
                if (meshSaved)
                {
                    if (!string.IsNullOrEmpty("Assets/Mesh"))
                    {
                        Directory.CreateDirectory("Assets/Mesh");
                    }

                    var mesh = fragments[i].GetComponent <MeshFilter>().sharedMesh;
                    #if UNITY_EDITOR
                    AssetDatabase.CreateAsset(mesh, "Assets/Mesh/" + transform.name + "_" + i + ".asset");
                    #endif
                }
            }
        }
        #if UNITY_EDITOR
        AssetDatabase.SaveAssets();
        #endif

        foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>())
        {
            if (addon.enabled)
            {
                addon.OnFragmentsGenerated(fragments);
            }
        }
    }
    private void GenerateSquare()
    {
        MeshFilter meshFilter = GetComponent <MeshFilter>();
        Mesh       mesh       = meshFilter.sharedMesh;

        if (mesh == null)
        {
            meshFilter.mesh = new Mesh();
            mesh            = meshFilter.sharedMesh;
        }

        var vertices   = new Vector3[4];
        var halfWidth  = width / 2;
        var halfHeight = height / 2;

        vertices[0] = new Vector3(-halfWidth, -halfHeight, 0);
        vertices[1] = new Vector3(halfWidth, -halfHeight, 0);
        vertices[2] = new Vector3(-halfWidth, halfHeight, 0);
        vertices[3] = new Vector3(halfWidth, halfHeight, 0);

        mesh.vertices = vertices;

        var tri = new int[6];

        tri[0] = 0;
        tri[1] = 2;
        tri[2] = 1;

        tri[3] = 2;
        tri[4] = 3;
        tri[5] = 1;

        mesh.triangles = tri;

        SpriteExploder.calcNormals(gameObject);

        var uv = new Vector2[4];

        uv[0] = new Vector2(0, 0);
        uv[1] = new Vector2(textureScaleU, 0);
        uv[2] = new Vector2(0, textureScaleV);
        uv[3] = new Vector2(textureScaleU, textureScaleV);

        mesh.uv = uv;
    }
Beispiel #7
0
    /// <summary>
    /// Turns Gameobject into multiple fragments
    /// </summary>
    public void generateFragments()
    {
        fragments = new List <GameObject>();
        switch (shatterType)
        {
        case ShatterType.Triangle:
            fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps);
            break;

        case ShatterType.Voronoi:
            fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps);
            break;

        default:
            Debug.Log("invalid choice");
            break;
        }
        //sets additional aspects of the fragments
        foreach (GameObject p in fragments)
        {
            if (p != null)
            {
                p.layer = LayerMask.NameToLayer(fragmentLayer);
                p.AddComponent <fadeParticles>();
                p.GetComponent <Renderer>().sortingLayerName = sortingLayerName;
                p.GetComponent <Renderer>().sortingOrder     = orderInLayer;
                p.GetComponent <Rigidbody2D>().gravityScale  = 0;
                p.AddComponent <keepMoving>();
                // km = p.GetComponent<keepMoving>();
                // kms.Add(km);
                // km.create(p.GetComponent<Rigidbody2D>());
                // p.AddComponent<SelfDestruct>();

                // p.GetComponent<SelfDestruct>().lifeSpan = 2f;
            }
        }

        foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>())
        {
            if (addon.enabled)
            {
                addon.OnFragmentsGenerated(fragments);
            }
        }
    }
Beispiel #8
0
    /// <summary>
    /// Turns Gameobject into multiple fragments
    /// </summary>
    private void generateFragments()
    {
        fragments = new List <GameObject>();
        switch (shatterType)
        {
        case ShatterType.Triangle:
            fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps);
            break;

        case ShatterType.Voronoi:
            fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps);
            break;

        default:
            Debug.Log("invalid choice");
            break;
        }
        //sets additional aspects of the fragments
        foreach (GameObject p in fragments)
        {
            if (p != null)
            {
                p.transform.parent = transform.parent;
                p.layer            = LayerMask.NameToLayer(fragmentLayer);
                p.GetComponent <Renderer>().sortingLayerName = "Destructible Platform";
                p.GetComponent <Renderer>().sortingOrder     = orderInLayer;
                p.transform.gameObject.tag = sortingTag;
                p.GetComponent <Rigidbody2D> ().bodyType = RigidbodyType2D.Kinematic;
                p.AddComponent <ExplodeOnClick> ();
            }
        }

        foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>())
        {
            if (addon.enabled)
            {
                addon.OnFragmentsGenerated(fragments);
            }
        }
    }
Beispiel #9
0
    /// <summary>
    /// Turns Gameobject into multiple fragments
    /// </summary>
    public void generateFragments()
    {
        fragments = new List <GameObject>();
        switch (shatterType)
        {
        case ShatterType.Triangle:
            fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps);
            break;

        case ShatterType.Voronoi:
            fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps);
            break;

        default:
            //Debug.Log("invalid choice");
            break;
        }
        //sets additional aspects of the fragments
        foreach (GameObject p in fragments)
        {
            if (p != null)
            {
                p.layer = LayerMask.NameToLayer("Fragments");
                p.GetComponent <Renderer>().sortingLayerName = sortingLayerName;
                p.GetComponent <Renderer>().sortingOrder     = orderInLayer;
                p.AddComponent <FragmentDestoryer>();
            }
        }

        foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>())
        {
            if (addon.enabled)
            {
                addon.OnFragmentsGenerated(fragments);
            }
        }
    }
Beispiel #10
0
    private void generateFragments()
    {
        fragments = new List <GameObject>();
        switch (shatterType)
        {
        case ShatterType.Triangle:
            fragments = SpriteExploder.GenerateTriangularPieces(base.gameObject, extraPoints, subshatterSteps);
            break;

        case ShatterType.Voronoi:
            fragments = SpriteExploder.GenerateVoronoiPieces(base.gameObject, extraPoints, subshatterSteps);
            break;

        default:
            UnityEngine.Debug.Log("invalid choice");
            break;
        }
        foreach (GameObject fragment in fragments)
        {
            if (fragment != null)
            {
                fragment.layer = LayerMask.NameToLayer(fragmentLayer);
                fragment.GetComponent <Renderer>().sortingLayerName = sortingLayerName;
                fragment.GetComponent <Renderer>().sortingOrder     = orderInLayer;
                fragment.tag = "pig";
            }
        }
        ExplodableAddon[] components = GetComponents <ExplodableAddon>();
        foreach (ExplodableAddon explodableAddon in components)
        {
            if (explodableAddon.enabled)
            {
                explodableAddon.OnFragmentsGenerated(fragments);
            }
        }
    }
Beispiel #11
0
    public static List <GameObject> GenerateTriangularPieces(GameObject source, int extraPoints = 0, int subshatterSteps = 0, Material mat = null)
    {
        List <GameObject> pieces = new List <GameObject>();

        if (mat == null)
        {
            mat = createFragmentMaterial(source);
        }

        //get transform information
        Vector3 origScale = source.transform.localScale;

        source.transform.localScale = Vector3.one;
        Quaternion origRotation = source.transform.localRotation;

        source.transform.localRotation = Quaternion.identity;

        //get rigidbody information
        Rigidbody2D rg           = source.GetComponent <Rigidbody2D>(); //Я добавил
        Vector2     origVelocity = rg.velocity;

        //get collider information

        PolygonCollider2D sourcePolyCollider = source.GetComponent <PolygonCollider2D>();
        BoxCollider2D     sourceBoxCollider  = source.GetComponent <BoxCollider2D>();
        List <Vector2>    points             = new List <Vector2>();
        List <Vector2>    borderPoints       = new List <Vector2>();

        //add points from the present collider
        if (sourcePolyCollider != null)
        {
            points       = getPoints(sourcePolyCollider);
            borderPoints = getPoints(sourcePolyCollider);
        }
        else if (sourceBoxCollider != null)
        {
            points       = getPoints(sourceBoxCollider);
            borderPoints = getPoints(sourceBoxCollider);
        }

        //create a bounding rectangle based on the polygon points
        Rect rect = getRect(source);

        //if the target polygon is a triangle, generate a point in the middle to allow for fracture
        if (points.Count == 3)
        {
            points.Add((points[0] + points[1] + points[2]) / 3);
        }

        for (int i = 0; i < extraPoints; i++)
        {
            points.Add(new Vector2(Random.Range(rect.width / -2, rect.width / 2), Random.Range(rect.height / -2, rect.height / 2)));
        }


        Voronoi voronoi = new Delaunay.Voronoi(points, null, rect);

        List <List <Vector2> > clippedTriangles = new List <List <Vector2> >();

        foreach (Triangle tri in voronoi.Triangles())
        {
            clippedTriangles = ClipperHelper.clip(borderPoints, tri);
            foreach (List <Vector2> triangle in clippedTriangles)
            {
                pieces.Add(generateTriangularPiece(source, triangle, origVelocity, origScale, origRotation, mat, rg));
            }
        }
        List <GameObject> morePieces = new List <GameObject>();

        if (subshatterSteps > 0)
        {
            subshatterSteps--;
            foreach (GameObject piece in pieces)
            {
                morePieces.AddRange(SpriteExploder.GenerateTriangularPieces(piece, extraPoints, subshatterSteps, mat));
                GameObject.DestroyImmediate(piece);
            }
        }
        else
        {
            morePieces = pieces;
        }

        //reset transform information
        source.transform.localScale    = origScale;
        source.transform.localRotation = origRotation;

        Resources.UnloadUnusedAssets();

        return(morePieces);
    }
Beispiel #12
0
    public static List <GameObject> GenerateVoronoiPieces(GameObject source, int extraPoints = 0, int subshatterSteps = 0, Material mat = null)
    {
        List <GameObject> pieces = new List <GameObject>();

        if (mat == null)
        {
            mat = createFragmentMaterial(source);
        }

        //get transform information
        Vector3 origScale = source.transform.localScale;

        source.transform.localScale = Vector3.one;
        Quaternion origRotation = source.transform.localRotation;

        source.transform.localRotation = Quaternion.identity;

        //get rigidbody information
        Rigidbody2D rigbody      = source.GetComponent <Rigidbody2D>(); //Я добавил
        Vector2     origVelocity = rigbody.velocity;

        //get collider information
        PolygonCollider2D sourcePolyCollider = source.GetComponent <PolygonCollider2D>();
        BoxCollider2D     sourceBoxCollider  = source.GetComponent <BoxCollider2D>();
        List <Vector2>    points             = new List <Vector2>();
        List <Vector2>    borderPoints       = new List <Vector2>();

        if (sourcePolyCollider != null)
        {
            points       = getPoints(sourcePolyCollider);
            borderPoints = getPoints(sourcePolyCollider);
        }
        else if (sourceBoxCollider != null)
        {
            points       = getPoints(sourceBoxCollider);
            borderPoints = getPoints(sourceBoxCollider);
        }

        Rect rect = getRect(source);

        for (int i = 0; i < extraPoints; i++)
        {
            points.Add(new Vector2(Random.Range(rect.width / -2, rect.width / 2), Random.Range(rect.height / -2, rect.height / 2)));
        }


        Voronoi voronoi = new Delaunay.Voronoi(points, null, rect);
        List <List <Vector2> > clippedRegions = new List <List <Vector2> >();

        foreach (List <Vector2> region in voronoi.Regions())
        {
            clippedRegions = ClipperHelper.clip(borderPoints, region);
            foreach (List <Vector2> clippedRegion in clippedRegions)
            {
                pieces.Add(generateVoronoiPiece(source, clippedRegion, origVelocity, origScale, origRotation, mat, rigbody));
            }
        }

        List <GameObject> morePieces = new List <GameObject>();

        if (subshatterSteps > 0)
        {
            subshatterSteps--;
            foreach (GameObject piece in pieces)
            {
                morePieces.AddRange(SpriteExploder.GenerateVoronoiPieces(piece, extraPoints, subshatterSteps));
                GameObject.DestroyImmediate(piece);
            }
        }
        else
        {
            morePieces = pieces;
        }

        //reset transform information
        source.transform.localScale    = origScale;
        source.transform.localRotation = origRotation;

        Resources.UnloadUnusedAssets();

        return(morePieces);
    }
Beispiel #13
0
	void Awake()
	{
		spriteExploderScript = GameObject.FindGameObjectWithTag ("SpriteExploder").GetComponent<SpriteExploder> ();	
	}
Beispiel #14
0
    public static List <GameObject> GenerateCavePieces(GameObject source, PointsResult pointsResult, int subshatterSteps = 0, Material mat = null)
    {
        List <GameObject> pieces = new List <GameObject> ();

        if (mat == null)
        {
            mat = createFragmentMaterial(source);
        }

        //get transform information
        Vector3 origScale = source.transform.localScale;

        source.transform.localScale = Vector3.one;
        Quaternion origRotation = source.transform.localRotation;

        source.transform.localRotation = Quaternion.identity;

        //get rigidbody information
        Vector2 origVelocity = source.GetComponent <Rigidbody2D> ().velocity;

        Rect rect = getRect(source);

        List <Vector2> points = new List <Vector2> ();

        foreach (Point point in pointsResult.points)
        {
            points.Add(point.point);
        }
        List <Vector2> borderPoints = pointsResult.borderPoints;

        Voronoi voronoi = new Delaunay.Voronoi(points, null, rect);
        List <List <Vector2> > clippedRegions = new List <List <Vector2> > ();

        foreach (Point point in pointsResult.points)
        {
            bool  isWall           = pointsResult.isWall(point);
            float magnitude        = point.point.magnitude;
            bool  isCell           = magnitude > 100;
            bool  isInStartingArea = Mathf.Abs(Mathf.Abs(point.point.x) - Mathf.Abs(point.point.y)) < 10;
            if (!isInStartingArea && (isWall || isCell))
            {
                List <Vector2> region = voronoi.Region(point.point);
                clippedRegions = ClipperHelper.clip(borderPoints, region);
                foreach (List <Vector2> clippedRegion in clippedRegions)
                {
                    pieces.Add(generateVoronoiPiece(source, clippedRegion, origVelocity, origScale, origRotation, mat));
                }
            }
        }

        List <GameObject> morePieces = new List <GameObject> ();

        if (subshatterSteps > 0)
        {
            subshatterSteps--;
            foreach (GameObject piece in pieces)
            {
                morePieces.AddRange(SpriteExploder.GenerateVoronoiPieces(piece, 3, subshatterSteps));
                GameObject.DestroyImmediate(piece);
            }
        }
        else
        {
            morePieces = pieces;
        }

        //reset transform information
        source.transform.localScale    = origScale;
        source.transform.localRotation = origRotation;

        Resources.UnloadUnusedAssets();

        return(morePieces);
    }
        void OnCollisionEnter(Collision collision)
        {
            SpriteExploder spriteExploder = GetComponent <SpriteExploder>();

            spriteExploder.Explode();
        }
Beispiel #16
0
    public override void OnInspectorGUI()
    {
        SpriteExploder spriteExploder = (SpriteExploder)target;

        spriteExploder.PixelPrefab = (GameObject)EditorGUILayout.ObjectField("Pixel Prefab", spriteExploder.PixelPrefab, typeof(GameObject), true);

        EditorGUILayout.BeginVertical();

        string genText       = "";
        string genButtonText = "";

        if (spriteExploder.HasGeneratedSprite && spriteExploder.transform.Find("ExplosionPixels") != null)
        {
            genText       = "You have generated your explosion pixels.";
            genButtonText = "Regenerate Pixels";
        }
        else
        {
            genText       = "Press the button below to generate the explosion pixels.";
            genButtonText = "Generate Pixels";
        }

        if (spriteExploder.PixelPrefab == null)
        {
            genText = "Please assign a pixel prefab to generate the explosion pixels.";
        }

        EditorGUILayout.LabelField(genText);

        if (spriteExploder.PixelPrefab != null)
        {
            if (GUILayout.Button(genButtonText))
            {
                spriteExploder.GenerateSprite();
            }
        }

        EditorGUILayout.EndVertical();

        if (spriteExploder.HasGeneratedSprite && spriteExploder.transform.Find("ExplosionPixels") != null)
        {
            spriteExploder.ExplodeFromCenter  = EditorGUILayout.Toggle("Explode From Center", spriteExploder.ExplodeFromCenter);
            spriteExploder.ExplodeOnClick     = EditorGUILayout.Toggle("Explode On Click", spriteExploder.ExplodeOnClick);
            spriteExploder.ExplodeOnCollision = EditorGUILayout.Toggle("Explode On Collision", spriteExploder.ExplodeOnCollision);

            if (spriteExploder.ExplodeOnCollision)
            {
                spriteExploder.MinimumExplosionVelocity = EditorGUILayout.FloatField("Minimum Explosion Velocity", spriteExploder.MinimumExplosionVelocity);
            }

            spriteExploder.ExplosionForce = EditorGUILayout.FloatField("Explosion Force", spriteExploder.ExplosionForce);
            if (spriteExploder.ExplosionForce < 0)
            {
                spriteExploder.ExplosionForce = 0;
            }
            spriteExploder.ExplosionRandomness = EditorGUILayout.Slider("Explosion Randomness", spriteExploder.ExplosionRandomness, 0, spriteExploder.ExplosionForce);
            if (spriteExploder.ExplosionRandomness < 0)
            {
                spriteExploder.ExplosionRandomness = 0;
            }
            if (spriteExploder.ExplosionRandomness > spriteExploder.ExplosionForce)
            {
                spriteExploder.ExplosionRandomness = spriteExploder.ExplosionForce;
            }


            spriteExploder.PixelLifespan = EditorGUILayout.FloatField("Pixel Lifespan", spriteExploder.PixelLifespan);
            if (spriteExploder.PixelLifespan < 0)
            {
                spriteExploder.PixelLifespan = 0;
            }
            spriteExploder.PixelLifespanRandomness = EditorGUILayout.Slider("Pixel Lifespan Randomness", spriteExploder.PixelLifespanRandomness, 0, spriteExploder.PixelLifespan);
            if (spriteExploder.PixelLifespanRandomness < 0)
            {
                spriteExploder.PixelLifespanRandomness = 0;
            }
            if (spriteExploder.PixelLifespanRandomness > spriteExploder.PixelLifespan)
            {
                spriteExploder.PixelLifespanRandomness = spriteExploder.PixelLifespan;
            }
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
            if (!Application.isPlaying)
            {
                UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty();
            }
        }
    }