@@ -57,22 +57,16 @@ private static List<GameObject> OnConvertInPlace ()
57
57
58
58
GameObject [ ] unityActiveGOs = Selection . GetFiltered < GameObject > ( SelectionMode . Editable | SelectionMode . TopLevel ) ;
59
59
60
- var exportSet = ModelExporter . RemoveDuplicateObjects ( unityActiveGOs ) ;
60
+ var exportSet = ModelExporter . RemoveRedundantObjects ( unityActiveGOs ) ;
61
61
GameObject [ ] gosToExport = new GameObject [ exportSet . Count ] ;
62
62
exportSet . CopyTo ( gosToExport ) ;
63
63
64
64
// find common ancestor root & filePath;
65
65
string [ ] filePaths = new string [ gosToExport . Length ] ;
66
66
string dirPath = Path . Combine ( Application . dataPath , "Objects" ) ;
67
67
68
- Transform [ ] unityCommonAncestors = new Transform [ gosToExport . Length ] ;
69
- int [ ] siblingIndices = new int [ gosToExport . Length ] ;
70
-
71
68
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" ) ;
76
70
}
77
71
78
72
string [ ] fbxFileNames = new string [ filePaths . Length ] ;
@@ -109,15 +103,24 @@ private static List<GameObject> OnConvertInPlace ()
109
103
if ( unityObj != null )
110
104
{
111
105
GameObject unityGO = unityObj as GameObject ;
106
+ Transform unityGOTransform = unityGO . transform ;
107
+ Transform origGOTransform = gosToExport [ i ] . transform ;
112
108
113
109
// Set the name to be the name of the instantiated asset.
114
110
// This will get rid of the "(Clone)" if it's added
115
111
unityGO . name = unityMainAsset . name ;
116
112
117
113
// 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 ( ) ) ;
119
117
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 ) ;
121
124
122
125
result . Add ( unityObj as GameObject ) ;
123
126
@@ -140,6 +143,36 @@ private static List<GameObject> OnConvertInPlace ()
140
143
141
144
return result ;
142
145
}
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
+ }
143
176
}
144
177
}
145
178
}
0 commit comments