public static void RegisterGameObject( this ObjectMessageRouter router, GameObject g) { ComponentCache.Clear(); g.GetComponentsInChildren(ComponentCache); for (int componentIndex = 0; componentIndex < ComponentCache.Count; componentIndex++) { var component = ComponentCache[componentIndex]; var componentType = component.GetType(); var callSites = GetMessageHandlerCallSite(componentType); for (int i = 0; i < callSites.Count; i++) { var callSite = callSites[i]; if (VerifySignature(callSite.MethodInfo, new[] { typeof(IObjectMessage), typeof(MessageMetadata) }) || VerifySignature(callSite.MethodInfo, new[] { typeof(IObjectMessage) })) { var handlerParameters = callSite.MethodInfo.GetParameters(); var messageParameter = handlerParameters[0]; var handlerType = messageParameter.ParameterType; // TODO Better error handling if (handlerParameters.Length == 1) { var messageHandleCallSite = DelegateHelper.CreateDelegate <Action <IObjectMessage> >( callSite.MethodInfo, component); router.RegisterHandler(handlerType, new ObjectMessageHandler( metaData: callSite.MetaData, invoke: (message, metadata) => { if (component.enabled) { messageHandleCallSite(message); } })); } else if (handlerParameters.Length == 2) { var messageHandleCallSite = DelegateHelper.CreateDelegate <Action <IObjectMessage, MessageMetadata> >( callSite.MethodInfo, component); router.RegisterHandler(handlerType, new ObjectMessageHandler( metaData: callSite.MetaData, invoke: (message, metadata) => { if (component.enabled) { messageHandleCallSite(message, metadata); } })); } } else { throw new Exception("Message handler has incorrect signature: " + "use (IObjectMessage, MessageMetadata) or (IObjectMessage) instead"); } } } }
void Awake() { // TODO Re-use DependencyContainer var diContainer = new DependencyContainer(); diContainer.AddDependency("objectMessagePools", ObjectMessagePools.Value); var objectMessageRouter = new ObjectMessageRouter(MessageTypes.ObjectMessageTypes, gameObject); diContainer.AddDependency("localObjectMessageSender", new LocalObjectMessageSender(objectMessageRouter)); DependencyInjector.Default.Inject(this.gameObject, diContainer); (ObjectRole.Authority | ObjectRole.Owner).ApplyTo(this.gameObject); }
public ReplicatedObject( GameObject gameObject, ObjectMessageRouter messageHandler, IReplicationConstructor replicationConstructor, IReadOnlyList <ISpawnable> spawnables) { GlobalObjectId = new Guid(); GameObject = gameObject; MessageHandler = messageHandler; ReplicationConstructor = replicationConstructor; Spawnables = spawnables; GameObjectNetworkInfo = gameObject.GetComponent <GameObjectNetworkInfo>() ?? gameObject.AddComponent <GameObjectNetworkInfo>(); }
public LocalObjectMessageSender(ObjectMessageRouter messageRouter) { _messageRouter = messageRouter; _sequenceNumberCounter = new SequenceNumber(0); }