protected virtual void RaiseNetworkSceneStart(NetworkSceneManager pNetworkSceneManager, Scene pScene)
 {
     if (OnNetworkSceneStart != null)
     {
         OnNetworkSceneStart(pNetworkSceneManager, pScene);
     }
 }
 protected virtual void RaiseNetworkSceneFailedToBind(NetworkSceneManager pNetworkSceneManager, Scene pScene)
 {
     if (OnNetworkSceneFailedToBind != null)
     {
         OnNetworkSceneFailedToBind(pNetworkSceneManager, pScene);
     }
 }
Beispiel #3
0
        public virtual NetworkSceneItem CreateNetworkScene(NetworkSceneTemplate pSceneTemplate, bool pIsSceneStatic, byte[] pNetworkSceneMetaData = null)
        {
            ushort port = GetPortFromSetting(pSceneTemplate.Settings);

            if (!pIsSceneStatic && _usedDynamicPorts.Contains(port))
            {
                return(null);
            }

            // Check if we already have created a scene with that name
            NetworkSceneTemplate existingScene = FindNetworkSceneTemplate(pSceneTemplate.SceneName, false, true, true, true);

            if (existingScene != null)
            {
                return(null);
            }

            // Create an empty Scene and put a new NetworkSceneManager in it
            NetworkSceneManager manager = CreateEmptyNetworkScene(pSceneTemplate);

            manager.NetworkSceneMetaData = pNetworkSceneMetaData;

            // Create the Scene with the 'BuildIndex' and queue it up to be merged with our empty Scene
            NetworkSceneItem newItem = new NetworkSceneItem(pSceneTemplate, manager);

            if (pSceneTemplate.BuildIndex > 0)
            {
                SceneManager.LoadScene(pSceneTemplate.BuildIndex, LoadSceneMode.Additive);
                _pendingScenes.Add(newItem);
            }
            else
            {
                newItem.IsCreated = true;
            }

            // Add the newItem to the respective collection
            if (pIsSceneStatic)
            {
                _scenesStatic.Add(pSceneTemplate.SceneName, newItem);
            }
            else
            {
                _usedDynamicPorts.Add(port);
                _scenesDynamic.Add(pSceneTemplate.SceneName, newItem);
            }

            // If the scene is 'dynamic' we need to register it so other Nodes know the scene is taken
            if (_isServer && !pIsSceneStatic && _enableRegisterDynamicScenes)
            {
                RegisterDynamicScene(_registerDynamicScenesRequireConfirmation, pSceneTemplate);
                newItem.IsRegistered = !_registerDynamicScenesRequireConfirmation;
            }
            else
            {
                newItem.IsRegistered = true;
            }

            ReadyNetworkScene(newItem);
            return(newItem);
        }
Beispiel #4
0
        public virtual bool TryGetNetworkSceneManager(string pSceneName, out NetworkSceneManager pNetworkSceneManager)
        {
            NetworkSceneItem item = FindNetworkSceneItem(pSceneName, true, true);

            if (item == null || !item.HasManager)
            {
                pNetworkSceneManager = null;
                return(false);
            }

            pNetworkSceneManager = item.Manager;
            return(true);
        }
Beispiel #5
0
        public virtual NetworkSceneManager CreateEmptyNetworkScene(NetworkSceneTemplate pTemplate, NetworkBehaviorListSO pBehaviorListSO)
        {
            Scene      newScene = SceneManager.CreateScene(pTemplate.SceneName);
            GameObject go       = GameObject.Instantiate(_networkSceneManagerPrefab);

            go.name = newScene.name + "_NetworkSceneManager";
            NetworkSceneManager manager = go.GetComponent <NetworkSceneManager>();

            manager.NetworkBehaviorListSO = pBehaviorListSO;
            manager.Settings = pTemplate.Settings;
            SceneManager.MoveGameObjectToScene(go, newScene);
            return(manager);
        }
Beispiel #6
0
        public virtual void StartAsServer(Node pNode)
        {
            _isServer    = true;
            _currentNode = pNode;
            _masterNode  = _nodeMapSO.nodeMap.GetMasterNode();
            Disconnect();
            if (_masterNode != null)
            {
                if (IsMasterNode)
                {
                    _masterManager = CreateMasterNetworkScene(_currentNode, _serviceNetworkSceneBehaviorListSO);
                    if (_masterManager != null)
                    {
                        _masterManager.AutoReconnect         = _autoReconnectMasterManager;
                        _masterManager.AutoReconnectInterval = _autoReconnectMasterManagerInterval;
                        _masterManager.StartAsServer();
                        InstantiateServices();
                    }
                }
                else
                {
                    _masterManager = CreateMasterNetworkScene(_masterNode, _serviceNetworkSceneBehaviorListSO);
                    if (_masterManager != null)
                    {
                        _masterManager.AutoReconnect         = _autoReconnectMasterManager;
                        _masterManager.AutoReconnectInterval = _autoReconnectMasterManagerInterval;
                        _masterManager.StartAsClient();
                    }
                }

                if (_masterManager == null || !_masterManager.HasNetworker || !_masterManager.Networker.IsBound)
                {
                    RaiseMasterManagerFailedToBind();
                }
            }

            _usedDynamicPorts.UseFreeIds     = false;
            _usedDynamicPorts.LowerBound     = _currentNode.DynamicPortMin;
            _usedDynamicPorts.UpperBound     = _currentNode.DynamicPortMax;
            _usedDynamicPorts.NextIdentifier = _currentNode.DynamicPortMin;
            CreateNetworkScenes(_currentNode.InitWithNetworkScenes, true);
        }