Пример #1
0
        public void Explode(Exploder2DObject.OnExplosion callback)
        {
            var settings = new Exploder2DSettings
            {
                Position              = Exploder2DUtils.GetCentroid(_exploder2D.gameObject),
                DontUseTag            = _exploder2D.DontUseTag,
                Radius                = _exploder2D.Radius,
                ForceVector           = _exploder2D.ForceVector,
                UseForceVector        = _exploder2D.UseForceVector,
                Force                 = _exploder2D.Force,
                FrameBudget           = _exploder2D.FrameBudget,
                TargetFragments       = _exploder2D.TargetFragments,
                DeactivateOptions     = _exploder2D.DeactivateOptions,
                DeactivateTimeout     = _exploder2D.DeactivateTimeout,
                ExplodeSelf           = _exploder2D.ExplodeSelf,
                HideSelf              = _exploder2D.HideSelf,
                DestroyOriginalObject = _exploder2D.DestroyOriginalObject,
                ExplodeFragments      = _exploder2D.ExplodeFragments,
                SplitMeshIslands      = _exploder2D.SplitMeshIslands,
                FragmentOptions       = _exploder2D.FragmentOptions.Clone(),
                SfxOptions            = _exploder2D.SFXOptions.Clone(),
                Callback              = callback,
                processing            = false,
            };

            queue.Enqueue(settings);
            ProcessQueue();
        }
Пример #2
0
 void OnDrawGizmos()
 {
     if (enabled && !(ExplodeSelf && DisableRadiusScan))
     {
         Gizmos.color = Color.red;
         Gizmos.DrawWireSphere(Exploder2DUtils.GetCentroid(gameObject), Radius);
     }
 }
Пример #3
0
        private List <CutMesh> GetMeshList()
        {
            GameObject[] objects = null;

            if (DontUseTag)
            {
                var objs    = FindObjectsOfType(typeof(Explodable2D));
                var objList = new List <GameObject>(objs.Length);

                foreach (var o in objs)
                {
                    var ex = (Explodable2D)o;

                    if (ex)
                    {
                        objList.Add(ex.gameObject);
                    }
                }

                objects = objList.ToArray();
            }
            else
            {
                objects = GameObject.FindGameObjectsWithTag(Tag);
            }

            var list = new List <CutMesh>(objects.Length);

            foreach (var o in objects)
            {
                // don't destroy the destroyer :)
                if (!ExplodeSelf && o == gameObject)
                {
                    continue;
                }

                // stop scanning for object is case of ExplodeSelf
                if (o != gameObject && ExplodeSelf && DisableRadiusScan)
                {
                    continue;
                }

//                UnityEngine.Debug.DrawLine(mainCentroid, mainCentroid + Vector2.up*100, Color.green, 100);

                var distance2 = (Exploder2DUtils.GetCentroid(o) - mainCentroid).sqrMagnitude;

                if (distance2 < Radius * Radius)
                {
                    var meshData    = GetMeshData(o);
                    var meshDataLen = meshData.Count;

                    for (var i = 0; i < meshDataLen; i++)
                    {
                        var centroid = meshData[i].centroid;
                        var distance = (centroid - mainCentroid).magnitude;

//                    UnityEngine.Debug.Log("Distance: " + distance + " " + meshData[i].gameObject.name);

                        var layer = FragmentOptions.InheritSortingLayer
                            ? meshData[i].spriteRenderer.sortingLayerName
                            : FragmentOptions.SortingLayer;
                        var order = FragmentOptions.InheritOrderInLayer
                            ? meshData[i].spriteRenderer.sortingOrder
                            : FragmentOptions.OrderInLayer;
                        var color = FragmentOptions.InheritSpriteRendererColor
                            ? meshData[i].spriteRenderer.color
                            : FragmentOptions.SpriteRendererColor;

                        list.Add(new CutMesh
                        {
                            spriteMesh    = meshData[i].spriteMesh,
                            centroidLocal = meshData[i].gameObject.transform.InverseTransformPoint(centroid),
                            transform     = meshData[i].gameObject.transform,

                            sprite     = meshData[i].sprite,
                            parent     = meshData[i].gameObject.transform.parent,
                            position   = meshData[i].gameObject.transform.position,
                            rotation   = meshData[i].gameObject.transform.rotation,
                            localScale = meshData[i].gameObject.transform.localScale,

                            distance = distance,
                            level    = GetLevel(distance, Radius),
                            original = meshData[i].parentObject,

                            sortingLayer = layer,
                            orderInLayer = order,
                            color        = color,

                            option = o.GetComponent <Exploder2DOption>(),
                        });
                    }
                }
            }

            if (list.Count == 0)
            {
#if DBG
                Exploder2DUtils.Log("No explodable objects found!");
#endif
                return(list);
            }

            list.Sort(delegate(CutMesh m0, CutMesh m1)
            {
                return((m0.level).CompareTo(m1.level));
            });

            // for the case when the count of objects is higher then target fragments
            if (list.Count > TargetFragments)
            {
                list.RemoveRange(TargetFragments - 1, list.Count - TargetFragments);
            }

            var levelMax          = list[list.Count - 1].level;
            var fragmentsPerLevel = GetLevelFragments(levelMax, TargetFragments);

            int maxCount  = 0;
            var listCount = list.Count;

            var levelCount = new int[levelMax + 1];
            foreach (var cutMesh in list)
            {
                levelCount[cutMesh.level]++;
            }

            for (int i = 0; i < listCount; i++)
            {
                var cutMesh = list[i];

                var curLevelRatio = levelMax + 1 - cutMesh.level;

                var fragments = (int)((curLevelRatio * fragmentsPerLevel) / levelCount[cutMesh.level]);

                cutMesh.fragments = fragments;

                maxCount += fragments;

                list[i] = cutMesh;

                if (maxCount >= TargetFragments)
                {
                    cutMesh.fragments -= maxCount - TargetFragments;
                    maxCount          -= maxCount - TargetFragments;

                    list[i] = cutMesh;

                    break;
                }
            }

//        foreach (var cutMesh in list)
//        {
//            UnityEngine.Debug.Log(cutMesh.level + " " + cutMesh.distance + " " + cutMesh.fragments);
//        }

            return(list);
        }