@@ -13,6 +13,7 @@ public class InteractivityImportContext : GLTFImportPluginContext
1313 private GLTFImportContext _context ;
1414 private InteractivityGraphExtension _interactivityGraph ;
1515 private bool _hasSelectOrHoverNode ;
16+ private List < GameObject > _selectableOrHoverableObjects ;
1617
1718 public InteractivityImportContext ( InteractivityImportPlugin interactivityLoader , GLTFImportContext context )
1819 {
@@ -25,6 +26,8 @@ public InteractivityImportContext(InteractivityImportPlugin interactivityLoader,
2526 /// </summary>
2627 public override void OnBeforeImport ( )
2728 {
29+ _hasSelectOrHoverNode = false ;
30+ _selectableOrHoverableObjects = new ( ) ;
2831 _pointerResolver = new ( ) ;
2932 Util . Log ( $ "InteractivityImportContext::OnBeforeImport Complete") ;
3033 }
@@ -92,29 +95,19 @@ public override void OnBeforeImportScene(GLTFScene scene)
9295
9396 public override void OnAfterImportNode ( GLTF . Schema . Node node , int nodeIndex , GameObject nodeObject )
9497 {
95- AddColliderIfNecessary ( node , nodeIndex , nodeObject ) ;
98+ CheckIfNodeIsInteractable ( node , nodeIndex , nodeObject ) ;
9699
97100 Util . Log ( $ "InteractivityImportContext::OnAfterImportNode Complete: { node . ToString ( ) } ") ;
98101 _pointerResolver . RegisterNode ( node , nodeIndex , nodeObject ) ;
99102 }
100103
101- private void AddColliderIfNecessary ( GLTF . Schema . Node node , int nodeIndex , GameObject nodeObject )
104+ private void CheckIfNodeIsInteractable ( GLTF . Schema . Node node , int nodeIndex , GameObject nodeObject )
102105 {
103- if ( ! _hasSelectOrHoverNode || nodeObject . TryGetComponent ( out Collider collider ) )
106+ if ( ! _hasSelectOrHoverNode )
104107 return ;
105108
106- Mesh mesh = null ;
107-
108- if ( nodeObject . TryGetComponent ( out MeshFilter mf ) )
109- mesh = mf . sharedMesh ;
110- else if ( nodeObject . TryGetComponent ( out SkinnedMeshRenderer smr ) )
111- mesh = smr . sharedMesh ;
112-
113- if ( mesh == null )
114- return ;
115-
116- var selectable = true ;
117- var hoverable = true ;
109+ var selectable = false ;
110+ var hoverable = false ;
118111
119112 if ( node . Extensions != null )
120113 {
@@ -127,8 +120,8 @@ private void AddColliderIfNecessary(GLTF.Schema.Node node, int nodeIndex, GameOb
127120
128121 if ( ! selectable && ! hoverable )
129122 return ;
130-
131- nodeObject . AddComponent < BoxCollider > ( ) ;
123+
124+ _selectableOrHoverableObjects . Add ( nodeObject ) ;
132125 }
133126
134127 public override void OnAfterImportMesh ( GLTFMesh mesh , int meshIndex , Mesh meshObject )
@@ -161,6 +154,11 @@ public override void OnAfterImportScene(GLTFScene scene, int sceneIndex, GameObj
161154 if ( _interactivityGraph == null )
162155 return ;
163156
157+ for ( int i = 0 ; i < _selectableOrHoverableObjects . Count ; i ++ )
158+ {
159+ AddCollidersToChildrenOfInteractableNode ( _selectableOrHoverableObjects [ i ] ) ;
160+ }
161+
164162 try
165163 {
166164 _pointerResolver . RegisterSceneData ( _context . SceneImporter . Root ) ;
@@ -206,5 +204,23 @@ public override void OnAfterImportScene(GLTFScene scene, int sceneIndex, GameObj
206204 return ;
207205 }
208206 }
207+
208+ private void AddCollidersToChildrenOfInteractableNode ( GameObject nodeObject )
209+ {
210+ var meshFilters = nodeObject . GetComponentsInChildren < MeshFilter > ( ) ;
211+
212+ if ( meshFilters . Length <= 0 )
213+ return ;
214+
215+ GameObject go ;
216+
217+ for ( int i = 0 ; i < meshFilters . Length ; i ++ )
218+ {
219+ go = meshFilters [ i ] . gameObject ;
220+
221+ if ( ! go . TryGetComponent ( out Collider collider ) )
222+ go . AddComponent < BoxCollider > ( ) ;
223+ }
224+ }
209225 }
210226}
0 commit comments