public void DestroyAllUnitsAndAssets()
        {
            for (int i = 0; i < m_units.Length; ++i)
            {
                IMatchUnitController unit = m_units[i];
                if (!unit.IsAlive)
                {
                    continue;
                }
                Coordinate c    = unit.DataController.Coordinate;
                MapCell    cell = m_engine.Map.Get(c.Row, c.Col, c.Weight);
                cell.RemoveVoxelDataAndDecreaseHeight(unit.Data);
                RemoveUnitController(true, unit);
            }

            m_units = new IMatchUnitController[0];

            long[] assetIds = m_idToAsset.Keys.ToArray();
            for (int i = 0; i < assetIds.Length; ++i)
            {
                long       assetId = assetIds[i];
                MatchAsset asset   = m_idToAsset[assetId];
                asset.Cell.RemoveVoxelDataAndDecreaseHeight(asset.VoxelData);
                RemoveAsset(asset.VoxelData);
            }
        }
        private void CreateAsset(VoxelData data, MapCell cell)
        {
            if (data.IsNeutral)
            {
                return;
            }

            data.UnitOrAssetIndex = m_identity;
            MatchAsset asset = new MatchAsset(data, cell);

            m_voxelDataToId.Add(data, m_identity);
            m_idToAsset.Add(m_identity, asset);

            unchecked
            {
                m_identity++;
            }

            if (AssetCreated != null)
            {
                AssetCreated(asset);
            }
        }