void Awake() { ObjectID = FduSyncBaseIDManager.getClusterTimeManagerSyncId(); _instance = this; _bitArr = new BitVector32(0); initData(); }
//对于非监控的创建游戏物体 从节点不可以自己分配id 需要等待主节点发送过来的id信息 void ProcessAssignViewIdRequest() { if (FduSupportClass.isMaster) { return; } for (int i = 0; i < _waitForAssignViewIdList.Count; ++i) { Debug.Log("Before assign:" + _unallocateViews.Count); for (int j = 0; j < _unallocateViews.Count; ++j) { if (_unallocateViews[j].gameObject.name == _waitForAssignViewIdList[i].name) { _unallocateViews[j].UnRegistToObjectSyncSlave(); _unallocateViews[j].ObjectID = _waitForAssignViewIdList[i].id; if (_waitForAssignViewIdList[i].id != FduSyncBaseIDManager.getInvalidSyncId()) { _unallocateViews[j].RegistToObjectSyncSlave(); RegistToViewManager(_unallocateViews[j]); _unallocateViews.RemoveAt(j); } else { Debug.LogError("Get Invalid Id from Master Node! Object Name:" + _waitForAssignViewIdList[i].name); } break; } } Debug.Log("After assign:" + _unallocateViews.Count); } }
//简易的创建函数 不支持被创建物体包含多个子view的情况 public static GameObject createGameObjectWithClusterView(int viewId, int AssetId, Vector3 position, Quaternion rotation, string parentPath) { GameObject go = FduClusterAssetManager.Instance.getGameObjectFromId(AssetId); if (go == null) { return(null); } GameObject parent = FduSupportClass.getGameObjectByPath(parentPath); GameObject instance; if (parent == null) { instance = GameObject.Instantiate(go, position, rotation); } else { instance = GameObject.Instantiate(go, position, rotation, parent.transform); } if (instance.GetComponent <FduClusterView>() != null) { instance.GetComponent <FduClusterView>().ObjectID = viewId; FduSyncBaseIDManager.ReceiveIdFromMaster(viewId); } return(instance); }
//Only called in matser node 通知一个新的view出现 public static void NotifyOneNewViewAppear(int assetId, FduClusterView view) { ClusterGameObjectCreatePara para = new ClusterGameObjectCreatePara(view.ViewId, assetId, view.transform.position, view.transform.rotation); if (view.transform.parent != null) { para.parentPath = FduSupportClass.getGameObjectPath(view.transform.parent.gameObject); } para.viewInstance = view; var subViews = view.getSubViews(); if (subViews != null) { for (int i = 0; i < subViews.Count; ++i) { if (subViews[i] != null) { if (!subViews[i].gameObject.activeSelf) { subViews[i].ObjectID = FduSyncBaseIDManager.ApplyNextAvaliableId(); FduClusterViewManager.RegistToViewManager(subViews[i]); } } else { Debug.LogError("Find Invalid sub view in one FduClusterView.View id :" + view.ViewId + " Object name:" + view.name + ". Please press the Refresh Button in Inspector"); } } } if (_waitForCreateList.Count == 0) { levelPrefix = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name; } _waitForCreateList.Add(para); }
//Executed on both Master node and slave node Independently //Called In Start of FduClusterViewManager and LevelLoadManager internal static void AllocateSceneObjectViewId() { Debug.Log("start allocate scene view id"); Scene s = SceneManager.GetActiveScene(); if (s.isLoaded) { Debug.Log("scene name " + s.name); var allGameObjects = s.GetRootGameObjects(); for (int j = 0; j < allGameObjects.Length; j++) { var go = allGameObjects[j]; foreach (FduClusterView view in (go.GetComponentsInChildren <FduClusterView>(true))) { view.ObjectID = FduSyncBaseIDManager.ApplyNextAvaliableId(); FduClusterViewManager.RegistToViewManager(view); } ; } _allocateFlag = false; } else { Debug.LogWarning("This scene is not loaded yet"); } }
public override NetworkState.NETWORK_STATE_TYPE Deserialize() { if (this == null) //由于跨场景时 在新的view 没有在start中完成注册之前 旧的view会接收数据 { return(NetworkState.NETWORK_STATE_TYPE.SUCCESS); } if (ViewId == FduSyncBaseIDManager.getInvalidSyncId()) { return(NetworkState.NETWORK_STATE_TYPE.SUCCESS); } UnityEngine.Profiling.Profiler.BeginSample("OnReceiveData"); NetworkState.NETWORK_STATE_TYPE networkState = NetworkState.NETWORK_STATE_TYPE.SUCCESS; FduObserverBase observer = null; for (index = 0; index < observerList.Count; ++index) { try { observer = observerList[index]; #if !UNSAFE_MODE if (observer != null) { bool receiveOrNot = BufferedNetworkUtilsClient.ReadBool(ref networkState); if (receiveOrNot) { observer.OnReceiveData(ref networkState); FduClusterViewManager.updateSentDataObserverCount(); } } #else if (observer.getDataTransmitStrategy().receiveOrNot()) { observer.OnReceiveData(ref networkState); #if DEBUG FduClusterViewManager.updateSentDataObserverCount(); #endif } #endif } catch (System.NullReferenceException) { } catch (System.Exception e) { string erroMessage = string.Format("An error occured when observer {0} call OnReceiveDataMethod. Game Object Name:{1},View Id:{2}, Error Message:{3}, Stack Trace:{4}", observer.GetType().Name, observer.name, ViewId, e.Message, e.StackTrace); Debug.LogError(erroMessage); throw; } if (networkState == NetworkState.NETWORK_STATE_TYPE.FORMAT_ERROR) { Debug.LogError("Data length not match in this observer! Observer name" + observer.GetType().FullName + " View id " + ViewId + " Game Object name " + observer.gameObject.name); } } UnityEngine.Profiling.Profiler.EndSample(); return(networkState); }
void Awake() { ObjectID = FduSyncBaseIDManager.getClusterRandomManagerSyncId(); initState = Random.state; Random.state = initState; Random.InitState(initSeed); }
IEnumerator serverLoadSceneCo(string sceneName, Action customLoadSceneFunc) { ObjectSyncMaster.Instance.SendingEnabled = false; customLoadSceneFunc();//执行自定义读取场景函数 curSceneName = sceneName; FduSyncBaseIDManager.OnLevelLoaded(); yield return(0); FduRpcManager.OnLevelLoaded(); FduActiveSyncManager.OnLevelLoaded(); ObjectSyncMaster.Instance.SendingEnabled = true; }
IEnumerator serverLoadSceneCo(string sceneName) { ObjectSyncMaster.Instance.SendingEnabled = false; //停止发送数据 UnityEngine.SceneManagement.SceneManager.LoadScene(sceneName); //读取场景 curSceneName = sceneName; //更新当前场景名 FduSyncBaseIDManager.OnLevelLoaded(); yield return(0); FduRpcManager.OnLevelLoaded(); FduActiveSyncManager.OnLevelLoaded(); ObjectSyncMaster.Instance.SendingEnabled = true; }
IEnumerator slaveLoadSceneCo(string sceneName) { var syncSlave = ClusterHelper.Instance.GetComponent <FDUIGC_SyncSlave>(); syncSlave.SendMessage("BlockSwapSync", SendMessageOptions.DontRequireReceiver); UnityEngine.SceneManagement.SceneManager.LoadScene(sceneName); curSceneName = sceneName; FduSyncBaseIDManager.OnLevelLoaded(); yield return(0); syncSlave.SendMessage("ResumeSwapSync", SendMessageOptions.DontRequireReceiver); }
//通知一个view消失了 public static void NotifyOneViewDisappear(int viewId, bool isSendingEvent) { if (isSendingEvent) { if (_wairForDestoryList.Count == 0) { levelPrefix = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name; } _wairForDestoryList.Add(viewId); } FduSyncBaseIDManager.RetrieveId(viewId); _FduClusterViews.Remove(viewId); }
//创建函数 para包含了所有创建该物体所必须的参数 包括位置信息、父节点信息、子节点信息等等 public static GameObject createGameObjectWithClusterView(FduClusterViewManager.ClusterGameObjectCreatePara para) { GameObject go = FduClusterAssetManager.Instance.getGameObjectFromId(para.assetId); if (go == null) { return(null); } GameObject parent = FduSupportClass.getGameObjectByPath(para.parentPath); GameObject instance; if (parent == null) { instance = GameObject.Instantiate(go, para.position, para.rotation); } else { instance = GameObject.Instantiate(go, para.position, para.rotation, parent.transform); } FduClusterView view = instance.GetComponent <FduClusterView>(); if (view != null) { view.ObjectID = para.viewId; FduSyncBaseIDManager.ReceiveIdFromMaster(para.viewId); } var subViewList = instance.GetClusterView().getSubViews(); int index = 0; foreach (FduClusterView subView in subViewList) { if (subView != null) { subView.ObjectID = para.subViewId[index++]; FduSyncBaseIDManager.ReceiveIdFromMaster(subView.ViewId); } else { Debug.LogError("Find Invalid sub view in one FduClusterView.View id :" + view.ViewId + " Object name:" + view.name + ". Please press the Refresh Button in Inspector"); } } if (index != subViewList.Count) { Debug.LogError("[FduClusterGameObjectCreator]Sub View Count Not matched!"); } return(instance); }
public override void Serialize() { if (ViewId == FduSyncBaseIDManager.getInvalidSyncId()) { return; } FduObserverBase observer = null; for (index = 0; index < observerList.Count; ++index) { try { observer = observerList[index]; #if !UNSAFE_MODE if (observer != null) { bool send = false; if (observer.getDataTransmitStrategy() != null) { send = observer.getDataTransmitStrategy().sendOrNot(); } BufferedNetworkUtilsServer.SendBool(send); if (send) { FduClusterViewManager.updateSentDataObserverCount(); observer.OnSendData(); } } #else if (observer.getDataTransmitStrategy().sendOrNot()) { #if DEBUG FduClusterViewManager.updateSentDataObserverCount(); #endif observer.OnSendData(); } #endif } catch (System.NullReferenceException) { } catch (System.Exception e) { string erroMessage = string.Format("An error occured when observer {0} call OnSendData method. Game Object Name:{1},View Id:{2}, Error Message:{3}, Stack Trace:{4}", observer.GetType().Name, observer.name, ViewId, e.Message, e.StackTrace); Debug.LogError(erroMessage); throw; } } }
//设置该RPC执行的view的ID public void setUpViewId(int viewId, string methodName) { if (viewId < 0 || viewId == FduSyncBaseIDManager.getInvalidSyncId()) { Debug.LogError("[FDURPC]Invalid view id"); } if (methodName == "" || methodName == null) { Debug.LogError("[RPCRPC]Method Name can not be null"); } _rpcData.Add((byte)0, viewId); _rpcData.Add((byte)1, methodName); inited = true; }
//场景切换时 有的已注册view从来没有被激活过 所以不会执行OnDestroy函数 需要在这里手动清除已变为空的view public static void ClearUnusedViews() { List <int> removeList = new List <int>(); foreach (KeyValuePair <int, FduClusterView> kvp in _FduClusterViews) { if (kvp.Value == null) { removeList.Add(kvp.Key); FduSyncBaseIDManager.RetrieveId(kvp.Key); } } foreach (int id in removeList) { _FduClusterViews.Remove(id); } }
//注册至此manager 每一个view都需要注册 static public void RegistToViewManager(FduClusterView _view) { if (_view == null) { return; } if (_view.ViewId == FduSyncBaseIDManager.getInvalidSyncId()) { if (!FduSupportClass.isMaster) { _unallocateViews.Add(_view); } else { Debug.LogError("[FduClusterViewManager]The Cluster View can not regist to view manager, please allocate a validate view id first"); } return; } _FduClusterViews.Add_overlay(_view.ViewId, _view); }
//SyncBase Strat函数执行前执行的函数 在这里需要监测该场景中的静态物体是否分配了ID 如果不是静态分配的Id 则判定为运行时创建的 则动态申请ID //而对于从节点 如果不是静态物体 则ID必须从主节点获取 赋值过程在此函数执行前 所以如果此时从节点上该view还没有分配ID 就说明前面的机制发生了错误 protected override void BeforeInit() { if (FduSyncBaseIDManager.needsAllocateSceneViewId() && FduClusterLevelLoader.Instance.isSceneLoaded()) { Debug.Log("first happen " + name); FduClusterViewManager.ClearUnusedViews(); FduSyncBaseIDManager.AllocateSceneObjectViewId(); } if (ClusterHelper.Instance.Server != null) { if (ObjectID == FduSyncBaseIDManager.getInvalidSyncId()) { ObjectID = FduSyncBaseIDManager.ApplyNextAvaliableId(); } if (IsObservingCreation) //如果监控这个view的创建 { if (FduClusterAssetManager.Instance.validateId(AssetId)) { FduClusterViewManager.NotifyOneNewViewAppear(AssetId, this); } else { Debug.LogError("This Prefab is not added to FduClusterAssetManager! Name:" + gameObject.name); } } else { FduClusterViewManager.NotifyOneNewViewAppear(this); } //FduClusterViewManager.RegistToViewManager(this); } else { FduClusterViewManager.RegistToViewManager(this); //如果此时从节点没有被分配id 会被放到一个等待列表中 当收到主节点的id信息后进行赋值 } //检测是否有空的observer存在 checkObserverExist(); }
void Awake() { ObjectID = FduSyncBaseIDManager.getLevelLoadManagerSyncId(); curSceneName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name; Instance = this; }
void Awake() { ObjectID = FduSyncBaseIDManager.getActiveManagerSyncId(); }
void Awake() { ObjectID = FduSyncBaseIDManager.getClusterInputManagerSyncId(); _instance = this; }
void Awake() { ObjectID = FduSyncBaseIDManager.getRpcManagerSyncId(); Instance = this; }
void Awake() { ObjectID = FduSyncBaseIDManager.getCommandManagerSyncId(); }
void Awake() { ObjectID = FduSyncBaseIDManager.getClusterViewManagerSyncId(); }
public FduClusterView() : base() { ObjectID = FduSyncBaseIDManager.getInvalidSyncId(); }