@@ -57,7 +57,7 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
57
57
mainModule . GetTypes ( )
58
58
. Where ( t => t . IsSubclassOf ( CodeGenHelpers . NetworkBehaviour_FullName ) )
59
59
. ToList ( )
60
- . ForEach ( ProcessNetworkBehaviour ) ;
60
+ . ForEach ( b => ProcessNetworkBehaviour ( b , compiledAssembly . Defines ) ) ;
61
61
}
62
62
else
63
63
{
@@ -95,6 +95,8 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
95
95
private FieldReference m_NetworkManager_LogLevel_FieldRef ;
96
96
private FieldReference m_NetworkManager_ntable_FieldRef ;
97
97
private MethodReference m_NetworkManager_ntable_Add_MethodRef ;
98
+ private FieldReference m_NetworkManager_rpc_name_table_FieldRef ;
99
+ private MethodReference m_NetworkManager_rpc_name_table_Add_MethodRef ;
98
100
private TypeReference m_NetworkBehaviour_TypeRef ;
99
101
private MethodReference m_NetworkBehaviour_BeginSendServerRpc_MethodRef ;
100
102
private MethodReference m_NetworkBehaviour_EndSendServerRpc_MethodRef ;
@@ -164,6 +166,7 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
164
166
private const string k_NetworkManager_LogLevel = nameof ( NetworkManager . LogLevel ) ;
165
167
#pragma warning disable 618
166
168
private const string k_NetworkManager_ntable = nameof ( NetworkManager . __ntable ) ;
169
+ private const string k_NetworkManager_rpc_name_table = nameof ( NetworkManager . __rpc_name_table ) ;
167
170
168
171
private const string k_NetworkBehaviour_BeginSendServerRpc = nameof ( NetworkBehaviour . __beginSendServerRpc ) ;
169
172
private const string k_NetworkBehaviour_EndSendServerRpc = nameof ( NetworkBehaviour . __endSendServerRpc ) ;
@@ -235,6 +238,10 @@ private bool ImportReferences(ModuleDefinition moduleDefinition)
235
238
m_NetworkManager_ntable_FieldRef = moduleDefinition . ImportReference ( fieldInfo ) ;
236
239
m_NetworkManager_ntable_Add_MethodRef = moduleDefinition . ImportReference ( fieldInfo . FieldType . GetMethod ( "Add" ) ) ;
237
240
break ;
241
+ case k_NetworkManager_rpc_name_table :
242
+ m_NetworkManager_rpc_name_table_FieldRef = moduleDefinition . ImportReference ( fieldInfo ) ;
243
+ m_NetworkManager_rpc_name_table_Add_MethodRef = moduleDefinition . ImportReference ( fieldInfo . FieldType . GetMethod ( "Add" ) ) ;
244
+ break ;
238
245
}
239
246
}
240
247
@@ -523,9 +530,13 @@ private bool ImportReferences(ModuleDefinition moduleDefinition)
523
530
return true ;
524
531
}
525
532
526
- private void ProcessNetworkBehaviour ( TypeDefinition typeDefinition )
533
+ private void ProcessNetworkBehaviour ( TypeDefinition typeDefinition , string [ ] assemblyDefines )
527
534
{
528
- var staticHandlers = new List < ( uint Hash , MethodDefinition Method ) > ( ) ;
535
+ var rpcHandlers = new List < ( uint RpcHash , MethodDefinition RpcHandler ) > ( ) ;
536
+ var rpcNames = new List < ( uint RpcHash , string RpcName ) > ( ) ;
537
+
538
+ bool isEditorOrDevelopment = assemblyDefines . Contains ( "UNITY_EDITOR" ) || assemblyDefines . Contains ( "DEVELOPMENT_BUILD" ) ;
539
+
529
540
foreach ( var methodDefinition in typeDefinition . Methods )
530
541
{
531
542
var rpcAttribute = CheckAndGetRPCAttribute ( methodDefinition ) ;
@@ -541,10 +552,16 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition)
541
552
}
542
553
543
554
InjectWriteAndCallBlocks ( methodDefinition , rpcAttribute , methodDefHash ) ;
544
- staticHandlers . Add ( ( methodDefHash , GenerateStaticHandler ( methodDefinition , rpcAttribute ) ) ) ;
555
+
556
+ rpcHandlers . Add ( ( methodDefHash , GenerateStaticHandler ( methodDefinition , rpcAttribute ) ) ) ;
557
+
558
+ if ( isEditorOrDevelopment )
559
+ {
560
+ rpcNames . Add ( ( methodDefHash , methodDefinition . Name ) ) ;
561
+ }
545
562
}
546
563
547
- if ( staticHandlers . Count > 0 )
564
+ if ( rpcHandlers . Count > 0 || rpcNames . Count > 0 )
548
565
{
549
566
var staticCtorMethodDef = typeDefinition . GetStaticConstructor ( ) ;
550
567
if ( staticCtorMethodDef == null )
@@ -562,24 +579,29 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition)
562
579
563
580
var instructions = new List < Instruction > ( ) ;
564
581
var processor = staticCtorMethodDef . Body . GetILProcessor ( ) ;
565
- foreach ( var ( hash , method ) in staticHandlers )
566
- {
567
- if ( hash == 0 || method == null )
568
- {
569
- continue ;
570
- }
571
582
572
- typeDefinition . Methods . Add ( method ) ;
583
+ foreach ( var ( rpcHash , rpcHandler ) in rpcHandlers )
584
+ {
585
+ typeDefinition . Methods . Add ( rpcHandler ) ;
573
586
574
- // NetworkManager.__ntable.Add(HandlerHash, HandlerMethod );
587
+ // NetworkManager.__ntable.Add(RpcHash, HandleFunc );
575
588
instructions . Add ( processor . Create ( OpCodes . Ldsfld , m_NetworkManager_ntable_FieldRef ) ) ;
576
- instructions . Add ( processor . Create ( OpCodes . Ldc_I4 , unchecked ( ( int ) hash ) ) ) ;
589
+ instructions . Add ( processor . Create ( OpCodes . Ldc_I4 , unchecked ( ( int ) rpcHash ) ) ) ;
577
590
instructions . Add ( processor . Create ( OpCodes . Ldnull ) ) ;
578
- instructions . Add ( processor . Create ( OpCodes . Ldftn , method ) ) ;
591
+ instructions . Add ( processor . Create ( OpCodes . Ldftn , rpcHandler ) ) ;
579
592
instructions . Add ( processor . Create ( OpCodes . Newobj , m_NetworkHandlerDelegateCtor_MethodRef ) ) ;
580
593
instructions . Add ( processor . Create ( OpCodes . Call , m_NetworkManager_ntable_Add_MethodRef ) ) ;
581
594
}
582
595
596
+ foreach ( var ( rpcHash , rpcName ) in rpcNames )
597
+ {
598
+ // NetworkManager.__rpc_name_table.Add(RpcHash, RpcName);
599
+ instructions . Add ( processor . Create ( OpCodes . Ldsfld , m_NetworkManager_rpc_name_table_FieldRef ) ) ;
600
+ instructions . Add ( processor . Create ( OpCodes . Ldc_I4 , unchecked ( ( int ) rpcHash ) ) ) ;
601
+ instructions . Add ( processor . Create ( OpCodes . Ldstr , rpcName ) ) ;
602
+ instructions . Add ( processor . Create ( OpCodes . Call , m_NetworkManager_rpc_name_table_Add_MethodRef ) ) ;
603
+ }
604
+
583
605
instructions . Reverse ( ) ;
584
606
instructions . ForEach ( instruction => processor . Body . Instructions . Insert ( 0 , instruction ) ) ;
585
607
}
0 commit comments