コード例 #1
0
 void Awake()
 {
     ObjectID  = FduSyncBaseIDManager.getClusterTimeManagerSyncId();
     _instance = this;
     _bitArr   = new BitVector32(0);
     initData();
 }
コード例 #2
0
 //对于非监控的创建游戏物体 从节点不可以自己分配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);
     }
 }
コード例 #3
0
        //简易的创建函数 不支持被创建物体包含多个子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);
        }
コード例 #4
0
        //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);
        }
コード例 #5
0
        //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");
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        void Awake()
        {
            ObjectID = FduSyncBaseIDManager.getClusterRandomManagerSyncId();

            initState = Random.state;

            Random.state = initState;

            Random.InitState(initSeed);
        }
コード例 #8
0
        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;
        }
コード例 #9
0
        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;
        }
コード例 #10
0
        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);
        }
コード例 #11
0
 //通知一个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);
 }
コード例 #12
0
        //创建函数 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);
        }
コード例 #13
0
        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;
                }
            }
        }
コード例 #14
0
        //设置该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;
        }
コード例 #15
0
        //场景切换时 有的已注册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);
            }
        }
コード例 #16
0
 //注册至此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);
 }
コード例 #17
0
 //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();
 }
コード例 #18
0
 void Awake()
 {
     ObjectID     = FduSyncBaseIDManager.getLevelLoadManagerSyncId();
     curSceneName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name;
     Instance     = this;
 }
コード例 #19
0
 void Awake()
 {
     ObjectID = FduSyncBaseIDManager.getActiveManagerSyncId();
 }
コード例 #20
0
 void Awake()
 {
     ObjectID  = FduSyncBaseIDManager.getClusterInputManagerSyncId();
     _instance = this;
 }
コード例 #21
0
 void Awake()
 {
     ObjectID = FduSyncBaseIDManager.getRpcManagerSyncId();
     Instance = this;
 }
コード例 #22
0
 void Awake()
 {
     ObjectID = FduSyncBaseIDManager.getCommandManagerSyncId();
 }
コード例 #23
0
 void Awake()
 {
     ObjectID = FduSyncBaseIDManager.getClusterViewManagerSyncId();
 }
コード例 #24
0
 public FduClusterView()
     : base()
 {
     ObjectID = FduSyncBaseIDManager.getInvalidSyncId();
 }