@@ -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,18 @@ 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+ int count3D = type3D != null ? go . GetComponents ( type3D ) . Length : 0 ;
124+ return new ErrorResponse ( $ "component_index { componentIndex . Value } out of range. Found { count3D } '{ ( type3D ?? typeof ( Collider ) ) . Name } ' collider(s) on '{ go . name } '.") ;
125+ }
119126 }
120127
121128 // Try 2D colliders
122129 if ( mat2D != null )
123130 {
124- var collider2D = FindCollider2D ( go , colliderType ) ;
131+ var collider2D = FindCollider2D ( go , colliderType , componentIndex ) ;
125132 if ( collider2D != null )
126133 {
127134 Undo . RecordObject ( collider2D , "Assign Physics Material 2D" ) ;
@@ -139,6 +146,12 @@ public static object Assign(JObject @params)
139146 }
140147 } ;
141148 }
149+ if ( componentIndex . HasValue )
150+ {
151+ var type2D = ! string . IsNullOrEmpty ( colliderType ) ? UnityTypeResolver . ResolveComponent ( colliderType ) : typeof ( Collider2D ) ;
152+ int count2D = type2D != null ? go . GetComponents ( type2D ) . Length : 0 ;
153+ return new ErrorResponse ( $ "component_index { componentIndex . Value } out of range. Found { count2D } '{ ( type2D ?? typeof ( Collider2D ) ) . Name } ' collider(s) on '{ go . name } '.") ;
154+ }
142155 }
143156
144157 return new ErrorResponse ( $ "No suitable collider found on '{ go . name } '.") ;
@@ -398,29 +411,63 @@ private static object Configure2D(string path, JObject properties)
398411 // Assign helpers
399412 // =====================================================================
400413
401- private static Collider FindCollider3D ( GameObject go , string colliderType )
414+ private static Collider FindCollider3D ( GameObject go , string colliderType , int ? index = null )
402415 {
403416 if ( ! string . IsNullOrEmpty ( colliderType ) )
404417 {
405418 var type = UnityTypeResolver . ResolveComponent ( colliderType ) ;
406419 if ( type != null && typeof ( Collider ) . IsAssignableFrom ( type ) )
420+ {
421+ if ( index . HasValue )
422+ {
423+ var components = go . GetComponents ( type ) ;
424+ if ( index . Value < 0 || index . Value >= components . Length )
425+ return null ;
426+ return components [ index . Value ] as Collider ;
427+ }
407428 return go . GetComponent ( type ) as Collider ;
429+ }
408430 return null ;
409431 }
410432
433+ if ( index . HasValue )
434+ {
435+ var colliders = go . GetComponents < Collider > ( ) ;
436+ if ( index . Value < 0 || index . Value >= colliders . Length )
437+ return null ;
438+ return colliders [ index . Value ] ;
439+ }
440+
411441 return go . GetComponent < Collider > ( ) ;
412442 }
413443
414- private static Collider2D FindCollider2D ( GameObject go , string colliderType )
444+ private static Collider2D FindCollider2D ( GameObject go , string colliderType , int ? index = null )
415445 {
416446 if ( ! string . IsNullOrEmpty ( colliderType ) )
417447 {
418448 var type = UnityTypeResolver . ResolveComponent ( colliderType ) ;
419449 if ( type != null && typeof ( Collider2D ) . IsAssignableFrom ( type ) )
450+ {
451+ if ( index . HasValue )
452+ {
453+ var components = go . GetComponents ( type ) ;
454+ if ( index . Value < 0 || index . Value >= components . Length )
455+ return null ;
456+ return components [ index . Value ] as Collider2D ;
457+ }
420458 return go . GetComponent ( type ) as Collider2D ;
459+ }
421460 return null ;
422461 }
423462
463+ if ( index . HasValue )
464+ {
465+ var colliders = go . GetComponents < Collider2D > ( ) ;
466+ if ( index . Value < 0 || index . Value >= colliders . Length )
467+ return null ;
468+ return colliders [ index . Value ] ;
469+ }
470+
424471 return go . GetComponent < Collider2D > ( ) ;
425472 }
426473
0 commit comments