@@ -124,7 +124,7 @@ public class BaseGraphView : GraphView, IDisposable
124
124
125
125
public SerializedObject serializedGraph { get ; private set ; }
126
126
127
- Dictionary < Type , Type > nodeTypePerCreateAssetType = new Dictionary < Type , Type > ( ) ;
127
+ Dictionary < Type , ( Type nodeType , MethodInfo initalizeNodeFromObject ) > nodeTypePerCreateAssetType = new Dictionary < Type , ( Type , MethodInfo ) > ( ) ;
128
128
129
129
public BaseGraphView ( EditorWindow window )
130
130
{
@@ -619,14 +619,18 @@ void DragPerformedCallback(DragPerformEvent e)
619
619
{
620
620
if ( kp . Key . IsAssignableFrom ( objectType ) )
621
621
{
622
- var node = BaseNode . CreateFromType ( kp . Value , mousePos ) ;
623
- var initializeFunction = kp . Value . GetMethod ( nameof ( ICreateNodeFrom < Object > . InitializeNodeFromObject ) , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
624
- if ( ( bool ) initializeFunction . Invoke ( node , new [ ] { obj } ) )
622
+ try
625
623
{
626
- AddNode ( node ) ;
624
+ var node = BaseNode . CreateFromType ( kp . Value . nodeType , mousePos ) ;
625
+ if ( ( bool ) kp . Value . initalizeNodeFromObject . Invoke ( node , new [ ] { obj } ) )
626
+ AddNode ( node ) ;
627
+ else
628
+ break ;
629
+ }
630
+ catch ( Exception exception )
631
+ {
632
+ Debug . LogException ( exception ) ;
627
633
}
628
- else
629
- break ;
630
634
}
631
635
}
632
636
}
@@ -753,12 +757,21 @@ public void Initialize(BaseGraph graph)
753
757
foreach ( var nodeInfo in NodeProvider . GetNodeMenuEntries ( graph ) )
754
758
{
755
759
var interfaces = nodeInfo . type . GetInterfaces ( ) ;
760
+ var exceptInheritedInterfaces = interfaces . Except ( interfaces . SelectMany ( t => t . GetInterfaces ( ) ) ) ;
756
761
foreach ( var i in interfaces )
757
762
{
758
763
if ( i . IsGenericType && i . GetGenericTypeDefinition ( ) == typeof ( ICreateNodeFrom < > ) )
759
764
{
760
- var genericArgument = i . GetGenericArguments ( ) [ 0 ] ;
761
- nodeTypePerCreateAssetType [ genericArgument ] = nodeInfo . type ;
765
+ var genericArgumentType = i . GetGenericArguments ( ) [ 0 ] ;
766
+ var initializeFunction = nodeInfo . type . GetMethod (
767
+ nameof ( ICreateNodeFrom < Object > . InitializeNodeFromObject ) ,
768
+ BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ,
769
+ null , new Type [ ] { genericArgumentType } , null
770
+ ) ;
771
+
772
+ // We only add the type that implements the interface, not it's children
773
+ if ( initializeFunction . DeclaringType == nodeInfo . type )
774
+ nodeTypePerCreateAssetType [ genericArgumentType ] = ( nodeInfo . type , initializeFunction ) ;
762
775
}
763
776
}
764
777
}
0 commit comments