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(); }
void OnDrawGizmos() { if (enabled && !(ExplodeSelf && DisableRadiusScan)) { Gizmos.color = Color.red; Gizmos.DrawWireSphere(Exploder2DUtils.GetCentroid(gameObject), Radius); } }
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); }