Exemple #1
0
        public UrlReference <T> GetUrlReferenceFromAssetId <T>(SerializableGuid assetId) where T : class
        {
            var mapIndex    = _assetIdToMappingIndex[assetId];
            var contentPath = _assetMappings[mapIndex].FilePath;

            return(new UrlReference <T>(contentPath));
        }
Exemple #2
0
        public string GetContentPathFromAssetId(SerializableGuid assetId)
        {
            var mapIndex    = _assetIdToMappingIndex[assetId];
            var contentPath = _assetMappings[mapIndex].FilePath;

            return(contentPath);
        }
Exemple #3
0
        private Entity CreateAndAddClientPlayerEntity(
            SimulationTickNumber simulationTickNumber,
            SerializableGuid playerId,
            string playerName,
            ref Vector3 position,
            ref Quaternion rotation,
            bool isLocalEntity)
        {
            var gameplayScene    = _lazyLoadedScene.GetGameplayScene();
            var assetDefinitions = _lazyLoadedScene.GetNetworkAssetDefinitions();

            Debug.Assert(!_networkEntityIdToEntityDataMap.ContainsKey(playerId));

            var networkEntityId      = playerId;
            var prefabUrl            = isLocalEntity ? assetDefinitions.PlayerAssets.ClientLocalPlayer : assetDefinitions.PlayerAssets.ClientRemotePlayer;
            var prefab               = _content.Load(prefabUrl);
            var clientPlayerEntities = prefab.InstantiateClientPlayer();

            var playerEntity      = clientPlayerEntities.PlayerEntity;
            var networkPlayerComp = playerEntity.Get <NetworkPlayerComponent>();

            networkPlayerComp.PlayerName = playerName;

            var networkEntityComp = playerEntity.Get <NetworkEntityComponent>();

            networkEntityComp.NetworkEntityId = networkEntityId;
            networkEntityComp.OwnerClientId   = playerId;
            networkEntityComp.AssetId         = _networkAssetDatabase.GetAssetIdFromUrlReference(prefabUrl);

            AddAndRegisterEntity(playerEntity, gameplayScene, simulationTickNumber);
            // Set initial position
            var data = _networkEntityIdToEntityDataMap[networkEntityId];
            var movementSnapshotsComp = data.MovementSnapshotsComponent;
            var characterComp         = data.CharacterComponent;

            SetPlayerTransform(simulationTickNumber, movementSnapshotsComp, characterComp, ref position, ref rotation);

            // The 'viewable' player is added separately
            var playerViewEntity = clientPlayerEntities.PlayerViewEntity;

            gameplayScene.Entities.Add(playerViewEntity);

            return(playerEntity);
        }
Exemple #4
0
            private void OnNewRemotePlayerReady(
                SerializableGuid playerId, string playerName, NetworkConnection playerConnection,
                NetworkMessageWriter networkMessageWriter)
            {
                var assetDefinitions = GetNetworkAssetDefinitions();
                var assetDatabase    = _networkEntityProcessor._networkAssetDatabase;
                var networkService   = _networkEntityProcessor._networkService;
                var content          = _networkEntityProcessor._content;
                var gameClockManager = _networkEntityProcessor._gameClockManager;

                var entityExistenceStates = _networkEntityProcessor._entityExistenceStates;

                var gameplayScene = GetGameplayScene();

                var simTickNumber = gameClockManager.SimulationClock.SimulationTickNumber;
                // Can add to the scene now
                Entity playerEntity;

                if (networkService.NetworkGameMode == NetworkGameMode.DedicatedServer)
                {
                    var playerPrefabUrl = assetDefinitions.PlayerAssets.ServerRemotePlayer;
                    var playerPrefab    = content.Load(playerPrefabUrl);
                    playerEntity = playerPrefab.InstantiateSingle();

                    var networkEntityComp = playerEntity.Get <NetworkEntityComponent>();
                    networkEntityComp.NetworkEntityId = playerId;       // Can just use the same ID
                    networkEntityComp.OwnerClientId   = playerId;
                    networkEntityComp.AssetId         = assetDatabase.GetAssetIdFromUrlReference(playerPrefabUrl);

                    var networkPlayerComp = playerEntity.Get <NetworkPlayerComponent>();
                    networkPlayerComp.PlayerName = playerName;

                    GetPlayerSpawnLocation(gameplayScene, out var spawnPosition, out var spawnRotation);
                    playerEntity.Transform.Position = spawnPosition;
                    playerEntity.Transform.Rotation = spawnRotation;
                    _networkEntityProcessor.AddAndRegisterEntity(playerEntity, gameplayScene, simTickNumber);
                }
                else
                {
                    // Client game, so has the prefab also player view entity
                    GetPlayerSpawnLocation(gameplayScene, out var spawnPosition, out var spawnRotation);
                    playerEntity = _networkEntityProcessor.CreateAndAddClientPlayerEntity(simTickNumber, playerId, playerName, ref spawnPosition, ref spawnRotation, isLocalEntity: false);
                }

                // Note this must be set AFTER being added to the scene due to snapshot buffer needing to be instantiated by the processor
                var movementSnapshotComp = playerEntity.Get <MovementSnapshotsComponent>();

                MovementSnapshotsProcessor.CreateNewSnapshotData(simTickNumber, movementSnapshotComp, playerEntity.Transform);

                var newPlayer = new ServerActiveRemotePlayer(playerId, playerName, playerEntity, playerConnection);

                ActiveRemotePlayers.Add(newPlayer);

                var gameManager = GetGameManager();

                gameManager.RaisePlayerAddedEvent(playerEntity);

                // Notify the new player of all existing players
                for (int i = 0; i < ActiveRemotePlayers.Count - 1; i++)       // Exclude the last because that's the new player
                {
                    ref var existingPlayer = ref ActiveRemotePlayers.Items[i];
                    Debug.Assert(existingPlayer.PlayerId != playerId);

                    var existingPlayerDetails = entityExistenceStates[existingPlayer.PlayerEntity];
                    var spawnPlayer           = new SpawnRemotePlayerMessage
                    {
                        PlayerId             = existingPlayer.PlayerId,
                        SimulationTickNumber = existingPlayerDetails.SimulationTickNumberCreated,
                        PlayerName           = existingPlayer.PlayerName,
                        Position             = existingPlayer.PlayerEntity.Transform.Position,
                        Rotation             = existingPlayer.PlayerEntity.Transform.Rotation
                    };
                    networkMessageWriter.Reset();
                    spawnPlayer.WriteTo(networkMessageWriter);
                    playerConnection.Send(networkMessageWriter, SendNetworkMessageType.ReliableOrdered);   // Use Ordered to ensure a player's joined & dropped events are in sequence
                }