@@ -79,6 +79,7 @@ public static object Assign(JObject @params)
7979
8080 string searchMethod = p . Get ( "search_method" ) ?? "by_name" ;
8181 string colliderType = p . Get ( "collider_type" ) ;
82+ int ? componentIndex = ParamCoercion . CoerceIntNullable ( p . GetRaw ( "componentIndex" ) ?? p . GetRaw ( "component_index" ) ) ;
8283
8384 var go = GameObjectLookup . FindByTarget ( targetToken , searchMethod ) ;
8485 if ( go == null )
@@ -98,7 +99,7 @@ public static object Assign(JObject @params)
9899 // Try 3D colliders first
99100 if ( mat3D != null )
100101 {
101- var collider3D = FindCollider3D ( go , colliderType ) ;
102+ var collider3D = FindCollider3D ( go , colliderType , componentIndex ) ;
102103 if ( collider3D != null )
103104 {
104105 Undo . RecordObject ( collider3D , "Assign Physics Material" ) ;
@@ -116,12 +117,25 @@ public static object Assign(JObject @params)
116117 }
117118 } ;
118119 }
120+ if ( componentIndex . HasValue )
121+ {
122+ var type3D = ! string . IsNullOrEmpty ( colliderType ) ? UnityTypeResolver . ResolveComponent ( colliderType ) : typeof ( Collider ) ;
123+ if ( type3D != null && typeof ( Collider ) . IsAssignableFrom ( type3D ) )
124+ {
125+ int count3D = go . GetComponents ( type3D ) . Length ;
126+ return new ErrorResponse ( $ "component_index { componentIndex . Value } out of range. Found { count3D } '{ type3D . Name } ' collider(s) on '{ go . name } '.") ;
127+ }
128+ else if ( ! string . IsNullOrEmpty ( colliderType ) )
129+ {
130+ return new ErrorResponse ( $ "Unknown or invalid 3D collider type: '{ colliderType } '.") ;
131+ }
132+ }
119133 }
120134
121135 // Try 2D colliders
122136 if ( mat2D != null )
123137 {
124- var collider2D = FindCollider2D ( go , colliderType ) ;
138+ var collider2D = FindCollider2D ( go , colliderType , componentIndex ) ;
125139 if ( collider2D != null )
126140 {
127141 Undo . RecordObject ( collider2D , "Assign Physics Material 2D" ) ;
@@ -139,6 +153,19 @@ public static object Assign(JObject @params)
139153 }
140154 } ;
141155 }
156+ if ( componentIndex . HasValue )
157+ {
158+ var type2D = ! string . IsNullOrEmpty ( colliderType ) ? UnityTypeResolver . ResolveComponent ( colliderType ) : typeof ( Collider2D ) ;
159+ if ( type2D != null && typeof ( Collider2D ) . IsAssignableFrom ( type2D ) )
160+ {
161+ int count2D = go . GetComponents ( type2D ) . Length ;
162+ return new ErrorResponse ( $ "component_index { componentIndex . Value } out of range. Found { count2D } '{ type2D . Name } ' collider(s) on '{ go . name } '.") ;
163+ }
164+ else if ( ! string . IsNullOrEmpty ( colliderType ) )
165+ {
166+ return new ErrorResponse ( $ "Unknown or invalid 2D collider type: '{ colliderType } '.") ;
167+ }
168+ }
142169 }
143170
144171 return new ErrorResponse ( $ "No suitable collider found on '{ go . name } '.") ;
@@ -398,29 +425,63 @@ private static object Configure2D(string path, JObject properties)
398425 // Assign helpers
399426 // =====================================================================
400427
401- private static Collider FindCollider3D ( GameObject go , string colliderType )
428+ private static Collider FindCollider3D ( GameObject go , string colliderType , int ? index = null )
402429 {
403430 if ( ! string . IsNullOrEmpty ( colliderType ) )
404431 {
405432 var type = UnityTypeResolver . ResolveComponent ( colliderType ) ;
406433 if ( type != null && typeof ( Collider ) . IsAssignableFrom ( type ) )
434+ {
435+ if ( index . HasValue )
436+ {
437+ var components = go . GetComponents ( type ) ;
438+ if ( index . Value < 0 || index . Value >= components . Length )
439+ return null ;
440+ return components [ index . Value ] as Collider ;
441+ }
407442 return go . GetComponent ( type ) as Collider ;
443+ }
408444 return null ;
409445 }
410446
447+ if ( index . HasValue )
448+ {
449+ var colliders = go . GetComponents < Collider > ( ) ;
450+ if ( index . Value < 0 || index . Value >= colliders . Length )
451+ return null ;
452+ return colliders [ index . Value ] ;
453+ }
454+
411455 return go . GetComponent < Collider > ( ) ;
412456 }
413457
414- private static Collider2D FindCollider2D ( GameObject go , string colliderType )
458+ private static Collider2D FindCollider2D ( GameObject go , string colliderType , int ? index = null )
415459 {
416460 if ( ! string . IsNullOrEmpty ( colliderType ) )
417461 {
418462 var type = UnityTypeResolver . ResolveComponent ( colliderType ) ;
419463 if ( type != null && typeof ( Collider2D ) . IsAssignableFrom ( type ) )
464+ {
465+ if ( index . HasValue )
466+ {
467+ var components = go . GetComponents ( type ) ;
468+ if ( index . Value < 0 || index . Value >= components . Length )
469+ return null ;
470+ return components [ index . Value ] as Collider2D ;
471+ }
420472 return go . GetComponent ( type ) as Collider2D ;
473+ }
421474 return null ;
422475 }
423476
477+ if ( index . HasValue )
478+ {
479+ var colliders = go . GetComponents < Collider2D > ( ) ;
480+ if ( index . Value < 0 || index . Value >= colliders . Length )
481+ return null ;
482+ return colliders [ index . Value ] ;
483+ }
484+
424485 return go . GetComponent < Collider2D > ( ) ;
425486 }
426487
0 commit comments