private void RemoveAssignment(Assignment assignment, Action <VoxelData> dieCallback)
        {
            if (assignment.HasUnit)
            {
                IMatchPlayerView    playerView  = m_players[m_playerIndex];
                IMatchUnitAssetView unitOrAsset = playerView.GetUnitOrAsset(assignment.UnitId);
                if (unitOrAsset != null)
                {
                    unitOrAsset.Assignment = null;
                }
            }

            assignment.HasUnit = false;
            assignment.UnitId  = 0;

            if (assignment.HasTarget)
            {
                IMatchPlayerView    targetPlayerView  = m_players[assignment.TargetPlayerIndex];
                IMatchUnitAssetView targetUnitOrAsset = targetPlayerView.GetUnitOrAsset(assignment.TargetId);
                if (targetUnitOrAsset != null && targetUnitOrAsset.TargetForAssignments != null)
                {
                    targetUnitOrAsset.TargetForAssignments.Remove(assignment);
                    if (targetUnitOrAsset.TargetForAssignments.Count == 0)
                    {
                        targetUnitOrAsset.TargetForAssignments = null;
                        //destroy preview here
                        if (VoxelData.IsPreview(targetUnitOrAsset.Data.Type))
                        {
                            targetUnitOrAsset.DataController.SetHealth(0);
                            if (dieCallback != null)
                            {
                                dieCallback(targetUnitOrAsset.Data);
                            }
                        }
                    }
                }

                assignment.HasTarget         = false;
                assignment.TargetId          = 0;
                assignment.TargetPlayerIndex = -1;
            }

            AssignmentGroup group;

            if (m_groupIdToAssignments.TryGetValue(assignment.GroupId, out group))
            {
                group.Assignments.Remove(assignment);
                if (group.Assignments.Count == 0)
                {
                    m_groupIdToAssignments.Remove(assignment.GroupId);
                }
            }
        }
        public void RemoveTargetFromAssignments(IMatchUnitAssetView unitOrAsset, Action <VoxelData> dieCallback)
        {
            List <Assignment> targetForAssignments = unitOrAsset.TargetForAssignments;

            if (targetForAssignments == null)
            {
                return;
            }
            unitOrAsset.TargetForAssignments = null;
            //destroy preview here
            if (VoxelData.IsPreview(unitOrAsset.Data.Type))
            {
                unitOrAsset.DataController.SetHealth(0);
                if (dieCallback != null)
                {
                    dieCallback(unitOrAsset.Data);
                }
            }

            for (int i = 0; i < targetForAssignments.Count; ++i)
            {
                Assignment assignment = targetForAssignments[i];
                assignment.HasTarget         = false;
                assignment.TargetId          = 0;
                assignment.TargetPlayerIndex = -1;

                if (!assignment.HasUnit)
                {
                    AssignmentGroup group;
                    if (m_groupIdToAssignments.TryGetValue(assignment.GroupId, out group))
                    {
                        group.Assignments.Remove(assignment);
                        if (group.Assignments.Count == 0)
                        {
                            m_groupIdToAssignments.Remove(assignment.GroupId);
                        }
                    }
                }
            }
        }