internal static void CutGO() { m_GOCutboard = Selection.transforms; m_SelectedObjects = Selection.objects; // Selection.transform does not provide correct list order, so we have to do it manually m_GOCutboard = m_GOCutboard.ToList().OrderBy(g => Array.IndexOf(m_SelectedObjects, g.gameObject)).ToArray(); // Return if nothing selected if (!hasCutboardData) { return; } m_StageCutWasPerformedIn = StageUtility.GetStage(m_GOCutboard[0].gameObject); // If cut gameObject is prefab, get its root transform for (int i = 0; i < m_GOCutboard.Length; i++) { if (PrefabUtility.GetPrefabAssetType(m_GOCutboard[i].gameObject) != PrefabAssetType.NotAPrefab) { m_GOCutboard[i] = PrefabUtility.GetOutermostPrefabInstanceRoot(m_GOCutboard[i].gameObject)?.transform; } } // Cut gameObjects should be visually marked as cut, so adding them to the hashset m_CutAffectedGOs.Clear(); foreach (var item in m_GOCutboard) { m_CutAffectedGOs.Add(item); AddChildrenToHashset(item); } // Clean pasteboard when cutting gameObjects Unsupported.ClearPasteboard(); }