示例#1
0
        /// <summary>
        /// Spawns new <see cref="NetworkEntity"/> having local authority.
        /// </summary>
        /// <param name="prefab"></param>
        /// <param name="onEntitySpawned"></param>
        public void SpawnLocalEntity(NetworkEntity prefab, EntitySpawnCallback onEntitySpawned)
        {
            Assert.IsTrue(Instance.IsConnected);
            Assert.IsTrue(Authentication.IsAuthenticated);
            prefab.HasLocalAuthority = true;

            Message message = new Message
            {
                UserId  = Authentication.ClientId,
                Request = "register_entity",
                Arg     = null,
            };

            SendToServer(message, response => OnRegisterFinished(response, prefab, onEntitySpawned));
        }
示例#2
0
        private void OnRegisterFinished(Response response, NetworkEntity entity, EntitySpawnCallback onEntitySpawned)
        {
            switch (response.Result)
            {
            case ERPCResult.Ok:
                break;

            case ERPCResult.Error:
                Debug.Log("Failed to register entity.");
                onEntitySpawned?.Invoke(null, false);

                return;

            default:
                throw new ArgumentOutOfRangeException();
            }

            EnqueueMainThreadCommand(() =>
            {
                Guid newId;

                try
                {
                    newId = Guid.Parse(response.Args);
                }
                catch (Exception e)
                {
                    Debug.LogError($"Invalid Guid : {response.Args}");

                    throw;
                }

                var spawned       = Instantiate(entity);
                spawned.NetworkId = newId;

                RegisterEntity(spawned);

                onEntitySpawned?.Invoke(spawned, true);
            });
        }