Skip to content

Commit a330fa4

Browse files
authored
Merge pull request #17 from Unity-Technologies/UNI-19962-copy-over-components
UNI-19962 Copy the components to the newly converted GameObject
2 parents 057f6f9 + e86eeb8 commit a330fa4

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

Assets/FbxExporters/Editor/ConvertToModel.cs

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,16 @@ private static List<GameObject> OnConvertInPlace ()
5757

5858
GameObject [] unityActiveGOs = Selection.GetFiltered<GameObject> (SelectionMode.Editable | SelectionMode.TopLevel);
5959

60-
var exportSet = ModelExporter.RemoveDuplicateObjects (unityActiveGOs);
60+
var exportSet = ModelExporter.RemoveRedundantObjects (unityActiveGOs);
6161
GameObject[] gosToExport = new GameObject[exportSet.Count];
6262
exportSet.CopyTo (gosToExport);
6363

6464
// find common ancestor root & filePath;
6565
string[] filePaths = new string[gosToExport.Length];
6666
string dirPath = Path.Combine (Application.dataPath, "Objects");
6767

68-
Transform[] unityCommonAncestors = new Transform[gosToExport.Length];
69-
int[] siblingIndices = new int[gosToExport.Length];
70-
7168
for(int n = 0; n < gosToExport.Length; n++){
72-
GameObject goObj = gosToExport[n];
73-
unityCommonAncestors[n] = goObj.transform.parent;
74-
siblingIndices [n] = goObj.transform.GetSiblingIndex ();
75-
filePaths[n] = Path.Combine (dirPath, goObj.name + ".fbx");
69+
filePaths[n] = Path.Combine (dirPath, gosToExport[n].name + ".fbx");
7670
}
7771

7872
string[] fbxFileNames = new string[filePaths.Length];
@@ -109,15 +103,24 @@ private static List<GameObject> OnConvertInPlace ()
109103
if (unityObj != null)
110104
{
111105
GameObject unityGO = unityObj as GameObject;
106+
Transform unityGOTransform = unityGO.transform;
107+
Transform origGOTransform = gosToExport [i].transform;
112108

113109
// Set the name to be the name of the instantiated asset.
114110
// This will get rid of the "(Clone)" if it's added
115111
unityGO.name = unityMainAsset.name;
116112

117113
// configure transform and maintain local pose
118-
unityGO.transform.SetParent (unityCommonAncestors[i], false);
114+
unityGOTransform.SetParent (origGOTransform.parent, false);
115+
116+
unityGOTransform.SetSiblingIndex (origGOTransform.GetSiblingIndex());
119117

120-
unityGO.transform.SetSiblingIndex (siblingIndices[i]);
118+
// copy the components over, assuming that the hierarchy order is unchanged
119+
if (origGOTransform.hierarchyCount != unityGOTransform.hierarchyCount) {
120+
Debug.LogWarning (string.Format ("Warning: Exported {0} objects, but only imported {1}",
121+
origGOTransform.hierarchyCount, unityGOTransform.hierarchyCount));
122+
}
123+
CopyComponentsRecursive (gosToExport[i], unityGO);
121124

122125
result.Add (unityObj as GameObject);
123126

@@ -140,6 +143,36 @@ private static List<GameObject> OnConvertInPlace ()
140143

141144
return result;
142145
}
146+
147+
private static void CopyComponentsRecursive(GameObject from, GameObject to){
148+
if (!to.name.StartsWith(from.name) || from.transform.childCount != to.transform.childCount) {
149+
Debug.LogError (string.Format("Error: hierarchies don't match (From: {0}, To: {1})", from.name, to.name));
150+
return;
151+
}
152+
153+
CopyComponents (from, to);
154+
for (int i = 0; i < from.transform.childCount; i++) {
155+
CopyComponentsRecursive(from.transform.GetChild(i).gameObject, to.transform.GetChild(i).gameObject);
156+
}
157+
}
158+
159+
private static void CopyComponents(GameObject from, GameObject to){
160+
var components = from.GetComponents<Component> ();
161+
for(int i = 0; i < components.Length; i++){
162+
// if to already has this component, then skip it
163+
if(components[i] == null || to.GetComponent(components[i].GetType()) != null){
164+
continue;
165+
}
166+
bool success = UnityEditorInternal.ComponentUtility.CopyComponent (components[i]);
167+
if (success) {
168+
success = UnityEditorInternal.ComponentUtility.PasteComponentAsNew (to);
169+
}
170+
if (!success) {
171+
Debug.LogWarning (string.Format ("Warning: Failed to copy component {0} from {1} to {2}",
172+
components[i].GetType().Name, from.name, to.name));
173+
}
174+
}
175+
}
143176
}
144177
}
145178
}

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ public int GetHierarchyCount (HashSet<GameObject> exportSet)
508508
/// </summary>
509509
/// <returns>The revised export set</returns>
510510
/// <param name="unityExportSet">Unity export set.</param>
511-
protected HashSet<GameObject> RemoveRedundantObjects(IEnumerable<UnityEngine.Object> unityExportSet)
511+
public static HashSet<GameObject> RemoveRedundantObjects(IEnumerable<UnityEngine.Object> unityExportSet)
512512
{
513513
// basically just remove the descendents from the unity export set
514514
HashSet<GameObject> toExport = new HashSet<GameObject> ();

0 commit comments

Comments
 (0)