// happens on client internal void HandleSyncEvent(int componentIndex, int cmdHash, NetworkReader reader) { // this doesn't use NetworkBehaviour.InvokeSyncEvent function (anymore). this method of calling is faster. // The hash is only looked up once, insted of twice(!) per NetworkBehaviour on the object. if (gameObject == null) { string errorCmdName = NetworkBehaviour.GetCmdHashHandlerName(cmdHash); Debug.LogWarning("SyncEvent [" + errorCmdName + "] received for deleted object [netId=" + netId + "]"); return; } // find the matching SyncEvent function and networkBehaviour class NetworkBehaviour.CmdDelegate invokeFunction; bool invokeFound = NetworkBehaviour.GetInvokerForHashSyncEvent(cmdHash, out invokeFunction); if (!invokeFound) { // We don't get a valid lookup of the command name when it doesn't exist... string errorCmdName = NetworkBehaviour.GetCmdHashHandlerName(cmdHash); Debug.LogError("Found no receiver for incoming [" + errorCmdName + "] on " + gameObject + ", the server and client should have the same NetworkBehaviour instances [netId=" + netId + "]."); return; } // find the right component to invoke the function on if (componentIndex >= m_NetworkBehaviours.Length) { Debug.LogWarning("Component [" + componentIndex + "] not found for [netId=" + netId + "]"); return; } NetworkBehaviour invokeComponent = m_NetworkBehaviours[componentIndex]; invokeFunction(invokeComponent, reader); }