Yerler arasında ışınlanma

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Birçok farklı yerle bir deneyim inşa etmek istiyorsanız, örneğin bir evren, çok sayıda şehir, kale, zindan ve geniş bir ormanla fantazi dünya gibi, kullanıcıların bir yerden diğerine ışınlanmasını etkinleştirmek için TeleportService kullanabilirsiniz. kullanabilirsiniz.

Işınlanmayı kurun

Deneyiminizde ışınlanmayı etkinleştirmek için, TeleportService:TeleportAsync() kullanın. Yöntem üç parametre kabul eder:

  • Kullanıcıların ışınlanması için kullanılan PlaceId .
  • Kullanıcıların ışınlanmasını temsil eden Player örnekleri içeren bir dizi.
  • TeleportOptions çağrı için özel özellikler içeren opcional bir örnek. TeleportAsync() arama.

local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 1234 -- Kendi yer kimliğinizle değiştirin
local playerToTeleport = Players:GetPlayers()[1] -- tecrübedeki ilk kullanıcıyı alın
TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)

Işınlanma kurarken hata ele alma önlemleri almak istiyorsanız, başarısız işınlanmaları nasıl ele alacağınızı görün başarısız işınlanmaları nasıl ele alacağınızı görün.

Karşıdan karşıya deneyim ışınlamasını etkinleştirin

Güvenlik amaçlarıyla, bir kullanıcıyı deneyiminizden başka bir deneyime, veya tersine, varsayılan olarak başarısız olur.Karşılıklı deneyim ışınlanmasını etkinleştirmek için, Oyun Ayarlarını Aç > Güvenlik > ve Studio'da Üçüncü Taraf Işınlamalarına İzin Ver etkinleştirin.

Özel Işınlanma ekranları oluştur

Bir kullanıcı bir teleportu tetiklediğinde, yeni yerin yüklenmesini beklerken standart Roblox yükleme ekranını görürler.Kullanıcılar için dalışı geliştirmek için istemciye TeleportService:SetTeleportGui() arayarak özel bir ışınlanma ekranı ekleyebilir ve kullanıcıyı ışınlatmadan önce ScreenGui kullanabilirsiniz.Aşağıdaki örnek, bir ışınlanma gerçekleştiğinde yük ekranı olarak özelleştirilmiş yerleştirir.İçinde herhangi bir kod çalıştırmıyor ScreenGui .


local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportGui = ReplicatedStorage.TeleportGui
TeleportService:SetTeleportGui(teleportGui)

Işınlanma seçeneklerini özelleştirin

Kullanıcıları belirli bir sunucuya ışınlamak ve teleportlar ile kullanıcı verilerini göndermek gibi teleportasyonları özelleştirebilirsiniz, örneğin örnek örneği ayarlayın ve yönteme geçirin ve örnek yöntemi ile kullanıcı verilerini gönderin.

Belirli sunuculara ışınlanma

Kullanıcıları belirli sunuculara ışınlamak için, TeleportOptions kullanarak hedef sunucuyu ayarlayın ve TeleportService:TeleportAsync() yöntemine geçirin.Bir sunucu belirtmezseniz, kullanıcılar bir eşleştirilmiş halka açık sunucuya ışınlanır.Listedeki ilk kullanıcının bilgileri, bu halka açık sunucuya eşleşmek için kullanılır.

Kullanıcıları belirli bir halka açık sunucuya ışınlamak için, TeleportOptions.ServerInstanceId özelliğini geçerli bir sunucu kimliği olarak ayarlayın, ki bu da halka açık bir sunucu için benzersiz bir tanımlayıcıdır.


local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ServerInstanceId = targetServerId

Kullanıcıları belirli rezerve edilmiş bir sunucuya ışınlamak için, rezerve edilmiş bir sunucuya girmek için benzersiz bir TeleportOptions.ReservedServerAccessCode kodu ayarlayın, ki bu benzersiz bir koddur.


local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = reservedServerCode

Kullanıcıları yeni rezerve edilmiş bir sunucuya ışınlamak için, TeleportOptions.ShouldReserveServer 'yi gerçeğe ayarlayın.


local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ShouldReserveServer = true

Kullanıcı verilerini teleportlarla birlikte gönder

Bir kullanıcıyı yerler arasında taşımak, o kullanıcıyla ilişkili yerel verileri reddeder.Yerler arasındaki veri kalıcılığını ele almak için aşağıdaki yaklaşımları kullanabilirsiniz.


local teleportData = {
randomNumber = RNG:NextInteger(1, 100),
}
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions:SetTeleportData(teleportData)

sunucubir teleport aracılığıyla gelen kullanıcının tüm verilerini almak için, kullanıcıyla ilgili verileri içeren bir sözlük döndüren Player:GetJoinData() fonksiyonunu kullanın.


local Players = game:GetService("Players")
local function onPlayerAdded(player)
local joinData = player:GetJoinData()
local teleportData = joinData.TeleportData
local randomNumber = teleportData.randomNumber
print(player.Name .. "joined with the number" .. randomNumber)
end
Players.PlayerAdded:Connect(onPlayerAdded)

Sadece istemci üzerindeki ışınlanma verilerini almak için TeleportService:GetLocalPlayerTeleportData() kullanabilirsiniz.

Elle başarısız ışınlanmaları ele alın

Ağ istekleri içeren herhangi bir API çağrısı gibi, teleportlar başarısız olabilir ve bir hata verebilir.Onları korunan çağrılarla sar ( pcall() ).Bazı başarısızlıklar, özellikle yedekli sunucuları içerenler, yeniden denemelerden yararlanır, bu nedenle başarısızlıklar üzerinde birkaç kez yeniden denemeyi öneririz.

Bir çağrı başarılı olsa ve teleport başlatılsa bile, bir hata atmadan ve kullanıcıyı sunucuda bırakmadan son anda başarısız olabilir.Bu olay gerçekleştiğinde, TeleportService.TeleportInitFailed etkinliği tetiklenir.

Aşağıdaki örnek ModuleScript , kullanıcıyı yeniden deneme mantığıyla korunan bir çağrıda ışınlar için bir SafeTeleport fonksiyon tanımlar.Ayrıca, çağrı başarılı olduğunda durumlarla ilgilenecek bir handleFailedTeleport fonksiyonu var, ancak ışınlanma meydana gel.


local TeleportService = game:GetService("TeleportService")
local ATTEMPT_LIMIT = 5
local RETRY_DELAY = 1
local FLOOD_DELAY = 15
local function SafeTeleport(placeId, players, options)
local attemptIndex = 0
local success, result -- döngü dışında pcall sonuçları tanımlayın, böylece sonuçlar daha sonra rapor edilebilir
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- hata oluşmasını önlemek için kullanıcıyı korunan bir çağrıya ışınlayın
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- çağrı başarılı olduysa veya yeniden deneme sınırına ulaşıldıysa ışınlanmaya çalışmayı durdur
if not success then
warn(result) -- çıktıya hata sebebini bas
end
return success, result
end
local function handleFailedTeleport(player, teleportResult, errorMessage, targetPlaceId, teleportOptions)
if teleportResult == Enum.TeleportResult.Flooded then
task.wait(FLOOD_DELAY)
elseif teleportResult == Enum.TeleportResult.Failure then
task.wait(RETRY_DELAY)
else
-- işınlanma geçersizse, yeniden denemek yerine hata bildirin
error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport

The SafeTeleport işlevi aynı argümanları alır TeleportAsync() işlevi ile.Deneyiminizden herhangi bir yerden başarısız ışınlanmaları azaltmak için SafeTeleport işlevi ile aşağıdaki ModuleScript işlevini kullanabilirsiniz, başarısız ışınlanmaları azaltmak için.


local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local SafeTeleport = require(ServerScriptService.SafeTeleport)
local TARGET_PLACE_ID = 1818 -- Kendi yer kimliğinizle değiştirin
local playerToTeleport = Players:GetPlayers()[1] -- oyundaki ilk kullanıcıyı alın
SafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)