Doğma ve yeniden doğma

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

Doğma bir nesnenin veya karakterin bir deneyimde oluşturulması sürecidir; yeniden doğma ise bir nesnenin veya karakterin, bir kaldırılma koşulunu karşıladıktan sonra, deneyime tekrar eklenmesi sürecidir. Örneğin, bir karakterin sağlığının sıfıra ulaşması veya haritadan düşmesi gibi durumlar bu koşullardandır. Her iki süreç de oyuncuların deneyiminize katılmasını sağladığı ve becerilerini geliştirmeye devam edebilmeleri açısından önemlidir.

örnek lazer tag deneyimini referans alarak, bu eğitim bölümünde Roblox'un yerleşik özelliklerini nasıl kullanacağınızı ve özelleştireceğinizi öğreneceksiniz. Bu özellikler, doğma ve yeniden doğma ile ilgili olarak şunları içerir:

  • Oyuncuların yalnızca kendi takımının doğma bölgesine doğabilmesi için doğma yerlerinin yapılandırılması.
  • Yeni oyuncuların ve karakterlerinin deneyime katıldıklarında tura eklenmesi.
  • Oyuncular doğarken ve yeniden doğarken zararı engelleyen kuvvet alanlarının özelleştirilmesi.
  • Oyun durumu yönetimi için istemci durumunun doğru zamanlarda çalışmasını sağlaması.
  • Tura çıkardıklarında karakterlerin yeniden doğması.
  • Oyun ve karakter parametrelerini ayarlamak için kritik olan küçük, çeşitli eylemler gerçekleştirme.

Bu bölüm bol miktarda betik içeriği içerir, ancak bir deneyim oluştururken her şeyi sıfırdan yazmak yerine mevcut bileşenlerden yararlanmanızı, hızlı bir şekilde deneme yapmanızı ve hangi sistemlerin görünümünüze uyacak özel uygulamalara ihtiyaç duyduğunu belirlemenizi teşvik eder. Bu bölümü tamamladığınızda, puanları takip eden, oyuncu durumunu izleyen ve tur sonuçlarını gösteren tur bazlı oyunları nasıl gerçekleştireceğinizi öğreneceksiniz.

Doğma yerlerini yapılandırma

Eğer şimdiki durumda deneyimi test etseydiniz, tüm oyuncular ya yeşil takımın doğma bölgesindeki SpawnLocation nesnesine ya da pembe takımın doğma bölgesindeki SpawnLocation nesnesine rastgele doğacaklardı. Bu, oyuncuların karşı tarafın kuvvet alanı kaybolur kaybolmaz, kendi doğma bölgelerinde birbirlerini etiketelemek için bir oyun sorunu ortaya çıkarır.

Bu problemi aşmak için, örnek lazer tag deneyimi her iki doğma yerini Neutral özelliğini false olarak ayarlayarak yapılandırır; bu, karşı takım oyuncularının yanlış doğma bölgesinde doğmasını kısıtlar. Ayrıca, TeamColor özelliği, önceki eğitim bölümündeki Takım Renklerini Ata ile ilişkili olan Team.Color değerine ayarlanır:

  • TeamASpawn – Yeşil takımın doğma bölgesindeki doğma yeri, TeamColor özelliği Mint olarak ayarlanmış.
  • TeamBSpawn – Pembe takımın doğma bölgesindeki doğma yeri, TeamColor özelliği Carnation Pink olarak ayarlanmış.
TeamASpawn
TeamBSpawn

Bir oyuncu deneyime katıldığında, ServerScriptServiceGameplayRoundsspawnPlayersInMap her takımda ne kadar oyuncu olduğunu kontrol eder ve ardından en az oyuncuya sahip takımı döndürür.

spawnPlayersInMap

local function getSmallestTeam(): Team
local teams = Teams:GetTeams()
-- Takımları en küçükten büyüğe doğru sıralayın
table.sort(teams, function(teamA: Team, teamB: Team)
return #teamA:GetPlayers() < #teamB:GetPlayers()
end)
-- En küçük takımı döndür
return teams[1]
end

En az oyuncuya sahip takımı bildiği zaman, oyuncuyu o takıma yerleştirir, Player.Neutral özelliğini false olarak ayarlayarak oyuncunun yalnızca kendi takımının doğma yerine doğmasını ve yeniden doğmasını sağlar, ardından PlayerState değerini SelectingBlaster olarak ayarlar; bu değeri eğitimde daha sonraki bölümlerde daha fazla öğreneceksiniz.

spawnPlayersInMap

local function spawnPlayersInMap(players: { Player })
for _, player in players do
player.Team = getSmallestTeam()
player.Neutral = false
player:SetAttribute(PlayerAttribute.playerState, PlayerState.SelectingBlaster)
task.spawn(function()
player:LoadCharacter()
end)
end
end

WorkspaceWorldMapSpawns kısmını incelediğinizde, haritada bir doğma yerine daha rastlayabilirsiniz: NeutralSpawn. Bu doğma yeri diğerlerinden farklıdır çünkü TeamColor özelliği deneyimdeki iki takımdan birine ayarlanmamıştır; bunun yerine, bu doğma yeri bir turun aktif olup olmadığına bağlı olarak Neutral özelliğine sahiptir.

Örneğin, eğer tur aktifse Neutral özelliği false olarak ayarlanır; böylece spawnPlayersInMap oyuncuları takımlara ayırabilir ve onları arenaya doğurabilir. Ancak, eğer tur aktif değilse, bir turdan diğerine geçişte olduğu gibi, Neutral özelliği true olarak ayarlanır; böylece oyuncular takım durumlarına bakılmaksızın orada doğabilir. Bu işlem Neutral doğma yerinin işlevsel bir lobi olmasını sağlar.

Neutral

Göstermek için, ServerScriptServiceGameplayRoundsSpawnPlayersInLobby'yi inceleyin; bu, bir turun sonunda çalışır ve players: { Player } tablosuna geçirilen her oyuncu için, betik:

  • Player.Neutral özelliğini true olarak ayarlayarak otomatik olarak Player.Team değerini nil yapar; bu, oyuncunun bir tur aktif olmadığında lobide yeniden doğmasına olanak tanır; çünkü doğma yerinin Neutral özelliği de true olarak ayarlanmıştır.
  • PlayerState değerini InLobby olarak değiştirir; bu, oyuncunun blaster'ını ve birinci şahıs UI görsellerini ortadan kaldırır.

Lobi içinde nötr doğma bölgesi ve her turun işlevselliği hakkında daha fazla bilgi için, eğitimdeki bir sonraki bölümde Turlar Eklemek maddesine bakın.

spawnPlayersInLobby

local function spawnPlayersInLobby(players: { Player })
for _, player in players do
player.Neutral = true
player:SetAttribute(PlayerAttribute.playerState, PlayerState.InLobby)
task.spawn(function()
player:LoadCharacter()
end)
end
end

Yeni oyuncuları bağlama

Studio'daki Luau kodu sıklıkla olay odaklıdır; bu, betiklerin bir Roblox servisinden gelen olayları dinlediği anlamına gelir ve ardından bir işlev çağrılır. Örneğin, çok oyunculu bir deneyime yeni oyuncular eklerken, oyuncuların başarıyla bağlanabilmesi için her şeyi yöneten bir olaya ihtiyaç vardır. Örnek lazer tag deneyiminde, bu ilgili olay Players.PlayerAdded:Connect'tir.

Players.PlayerAdded:Connect, deneyimin birçok betiğinde bir parça olarak kullanılır. Ctrl/Cmd+Shift+F kısayolunu kullanarak Players.PlayerAdded:Connect için arama yaparsanız, sonuçlar deneyimin başlangıç kurulumu hakkında iyi bir başlangıç noktası sağlar.

Studio'nun Tüm Bul penceresi, Players.PlayerAdded sonuçları vurgulanmış.

Örnek olarak, ServerScriptServiceSetupHumanoid dosyasını açın. Player ile Character arasındaki ayrım, bu betiği anlamanın anahtarıdır:

  • Bir oyuncu, bağlanmış bir istemcidir ve bir karakter, bir Humanoid modelidir.
  • Oyuncular bir blaster seçmeli ve liderliğe eklenmelidir. Karakterlerin doğması ve bir blaster alması gerekir.

SetupHumanoid hemen oyuncunun bir karakterinin olup olmadığını (yeni katıldı) veya sahip olmadığı durumları (yeniden doğma) kontrol eder. Bir tane bulduğunda, onCharacterAdded() çağrısını yapar, karakterden Humanoid modelini alır ve özelleştirme için ServerScriptServiceSetupHumanoidsetupHumanoidAsync'e iletir. Bu değerleri ayarladıktan sonra, betik daha sonra karakterin sağlığının sıfıra ulaşmasını bekler. Yeniden doğma işlemini eğitim bölümünün ilerleyen kısımlarında daha fazla öğreneceksiniz.

setupHumanoidAsync

local function setupHumanoidAsync(player: Player, humanoid: Humanoid)
humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.Subject
humanoid.NameDisplayDistance = 1000
humanoid.HealthDisplayDistance = 1000
humanoid.NameOcclusion = Enum.NameOcclusion.OccludeAll
humanoid.HealthDisplayType = Enum.HumanoidHealthDisplayType.AlwaysOn
humanoid.BreakJointsOnDeath = false
humanoid.Died:Wait()
onHumanoidDied(player, humanoid)
end

Bu betikle ilgili önemli not, özelliklerin tamamen isteğe bağlı olmasıdır; bu, işlevin ilk altı satırını kaldırırsanız, deneyim hala düzgün çalışır. Her özellik, tasarım kararları almanıza izin verirken, işlevsel gereksinimlerden ziyade, oynanış hedeflerinize uyum sağlar. Örneğin:

  • Eğer karakter isimlerinin daha kısa mesafelerde görünmesini istiyorsanız, Humanoid.NameDisplayDistance değerini düşürebilirsiniz.
  • Eğer yalnızca bir karakterin sağlığı %100'ün altındaysa görüntülenmesini istiyorsanız, Humanoid.HealthDisplayType değerini DisplayWhenDamaged olarak ayarlayın.
  • Eğer karakterlerin sağlıkları sıfıra ulaştığında parçalanmasını istiyorsanız, Humanoid.BreakJointsOnDeath değerini True olarak ayarlayın.

Bu özelliklerin değerlerini değiştirdiğinizde, yeni ayarlarınızın etkisini görmek için mutlaka oyun testi yapmalısınız. En az iki karakteri Server & Clients testinden seçerek çoklu istemci simülasyonu yaratabilirsiniz.

Studio'nun mezzanininde test modları açılır menüsündeki Server & Clients seçeneği.

Players.PlayerAdded:Connect olayının bir diğer örneği ServerScriptServicePlayerStateHandler'da bulunur. Önceki örnekte olduğu gibi, PlayerStateHandler hemen bir karakteri kontrol eder. Eğer oyuncu lobide değilse, betik bir oyuncu niteliğini SelectingBlaster durumuna ayarlar; bu, oyuncuların arenaya doğduktan sonra iki farklı blaster türünden birini seçebilecekleri turun başlangıç durumudur. Bu durum ayrıca oyuncular seçimlerini yaparken zarar almalarını engelleyen bir kuvvet alanını da içerir.

PlayerStateHandler

local function onPlayerAdded(player: Player)
player.CharacterAdded:Connect(function()
if not player.Neutral then
player:SetAttribute(PlayerAttribute.playerState, PlayerState.SelectingBlaster)
onPlayerStateChanged(player, PlayerState.SelectingBlaster)
end
end)

PlayerStateHandler içindeki bir değişken olan attributeChangedConnectionByPlayer tartışmayı gerektirir. Bu tablo, tüm oyuncuları ve onların Connections ile GetAttributeChangedSignal bağlantılarını depolar. Bu bağlantının bir tabloda depolanmasının sebebi, PlayerStateHandler'ın oyuncu deneyimden ayrıldığında bunu kopartabilmesidir. Bu işlem, bağlantılar sayısının zamanla artmasını önlemek için bir tür bellek yönetimidir.

PlayerStateHandler

local attributeChangedConnectionByPlayer = {}
local function onPlayerAdded(player: Player)
-- Oyuncu durumundaki tüm gelecekteki güncellemeleri işleyin
attributeChangedConnectionByPlayer[player] = player
:GetAttributeChangedSignal(PlayerAttribute.playerState)
:Connect(function()
local newPlayerState = player:GetAttribute(PlayerAttribute.playerState)
onPlayerStateChanged(player, newPlayerState)
end)
end
-- Oyuncu deneyimden ayrıldığında nitelik değişiklik bağlantısından koparma
local function onPlayerRemoving(player: Player)
if attributeChangedConnectionByPlayer[player] then
attributeChangedConnectionByPlayer[player]:Disconnect()
attributeChangedConnectionByPlayer[player] = nil
end
end

onPlayerAdded() içindeki her iki bağlı işlevin onPlayerStateChanged() çağrısını yaptığını görebilirsiniz. Bir oyuncu bir takıma ayrıldığında yapılan kurulum sırasında onPlayerAdded() PlayerState değerini SelectingBlaster olarak ayarlayarak ilk if ifadesinin false olarak değerlendirilmesine yol açar ve BlasterState değerini devre dışı bırakır. Daha sonra eğitimde Blaster'ları Uygulama bölümünde bu sürecin daha fazla detayı hakkında bilgi alacaksınız.

PlayerStateHandler

local function onPlayerStateChanged(player: Player, newPlayerState: string)
-- Blaster durumu 'Hazır' yalnızca oyuncu durumu 'Oynuyor' olduğunda
local newBlasterState = if newPlayerState == PlayerState.Playing then BlasterState.Ready else BlasterState.Disabled
-- Oyuncu oynamaya başladığında yok etme kuvvet alanı işlemini planlayın
if newPlayerState == PlayerState.Playing then
scheduleDestroyForceField(player)
end
player:SetAttribute(PlayerAttribute.blasterStateServer, newBlasterState)
end

Kırılma noktaları veya bir print() ifadesi eklediğinizde, onPlayerStateChanged()'in deneyim boyunca sıkça çağrıldığını görebilirsiniz: örneğin, bir turun başlangıç kurulumunda, ana kod yoluna ayarlandığında, oyuncu bir blaster seçtiğinde ve oyuncu lobisine ya da Neutral doğma bölgesine döndüğünde. Ayrıca, oyuncu bir blaster seçtikten sonra, ServerScriptServiceBlasterSelectedHandler PlayerState değerini Playing olarak ayarlar ve PlayerStateHandler nihayet kuvvet alanını scheduleDestroyForceField() çağırarak kaldırabilir.

Kuvvet alanlarını özelleştirin

Özel bir uygulama kullanmak yerine, örnek lazer tag deneyimi, oyuncuların blaster'larını seçerken zarar almalarını önlemek için Studio'nun yerleşik ForceField sınıfını kullanır. Bu, oyuncuların bir kuvvet alanıyla doğması için gereken tek koşulun, SpawnLocation.Duration özelliğinin 0'dan büyük olması gerektiğini sağlar. Örnek, kuvvet alanlarının etkinleştirilmesi için 9,999 gibi keyfi bir değer kullanır; ardından asıl süresi ReplicatedStorageForceFieldClientVisuals içinde programlanır.

setupHumanoidAsync'teki gibi, ForceFieldClientVisuals içindeki çoğu satır opsiyoneldir. Örneğin, işlevin içeriğini aşağıdaki betik gibi yorum içermeyecek şekilde ayarlarsanız, deneyim StarterGuiForceFieldGui içindeki altıgen betik yerine varsayılan parlayıcı kuvvet alanını kullanır.

Commenting Out Properties in ForceFieldClientVisuals

local function onCharacterAddedAsync(character: Model)
-- local forceField = character:WaitForChild("ForceField", 3)
-- if not forceField then
-- return
-- end
-- forceField.Visible = false
-- localPlayer.PlayerGui:WaitForChild("ForceFieldGui").Enabled = true
-- forceField.Destroying:Wait()
-- localPlayer.PlayerGui.ForceFieldGui.Enabled = false
end

Özelleştirilmiş kuvvet alanı bir GUI olduğu için ve yeni bir ParticleEmitter değilse, ForceFieldClientVisuals betiği yalnızca her oyuncu için birinci şahıs görsellerini etkiler; diğer oyuncuları izlerken üçüncü şahıs görselleri Roblox'un varsayılan görünümünü korur. Kuvvet alanlarını değiştirmek hakkında daha fazla bilgi için, ForceField.Visible kısmına bakabilirsiniz.

Birinci şahıs kuvvet alanı görselleri, ekranın çevresinde gelecekteki altıgen bir ızgara içeriyor.
Birinci şahıs kuvvet alanı görselleri
Üçüncü şahıs kuvvet alanı görselleri, deneyime doğan oyuncunun etrafında mavi parlayan bir orb içeriyor.
Üçüncü şahıs kuvvet alanı görselleri

Kuvvet alanları faydalıdır çünkü oyuncuların doğmaları ve yeniden doğmaları arasında düşman oyuncular yüzünden endişelenmeden yeterince zaman tanır; ancak, sonunda ana lazer tag oyununun başlaması için kaybolmaları gerekir. Kuvvet alanlarının kaldırılmasını yöneten script ReplicatedStoragescheduleDestroyForceField içindedir ve üç benzersiz koşulu kontrol eder:

  • Oyuncular bir blaster seçtikten sonra, kuvvet alanlarının oyuncuların çevresine alışmaları için yeterince uzun sürmesi gerekir.
  • Bu alışma süresi boyunca, kuvvet alanları avantaj olmamalıdır; bu yüzden bir oyuncu blaster'ını ateşler ateşlemez kaybolmaları gerekir.
  • Kuvvet alanları, oyuncular blaster ateşlemeden ya da kuvvet alanı süresi dolmadan önce karakterlerini yenilediklerinde kaybolmalıdır.

scheduleDestroyForceField scriptindeki her bir bu kontrol endForceField() işlevini bu koşullar için çağırır.

scheduleDestroyForceField

-- Eğer oyuncu blaster'ı ateşlerse kuvvet alanını bitirin
local blasterStateAttribute = getBlasterStateAttribute()
attributeChangedConnection = player:GetAttributeChangedSignal(blasterStateAttribute):Connect(function()
local currentBlasterState = player:GetAttribute(blasterStateAttribute)
if currentBlasterState == BlasterState.Blasting then
endForceField()
end
end)
-- Eğer oyuncu resetlerse kuvvet alanını bitirin
characterRespawnedConnection = player.CharacterRemoving:Connect(endForceField)
-- Kuvvet alanını 8 saniye sonra bitirin
task.delay(MAX_FORCE_FIELD_TIME, endForceField)

endForceField() işlevi, forceFieldEnded boolean'ı etrafında görünüşte tuhaf bir if ifadesini içermektedir. Kontroller sıralı olarak çalıştığı için, script endForceField() işlevini iki veya üç kez çağırabilir. forceFieldEnded boolean'ı, işlevin yalnızca bir kez bir kuvvet alanını yok etmeye çalışmasını sağlar.

scheduleDestroyForceField

local function endForceField()
if forceFieldEnded then
return
end
forceFieldEnded = true
attributeChangedConnection:Disconnect()
characterRespawnedConnection:Disconnect()
destroyForceField(player)
end

İstemci durumunu yönetme

Bu bölümün çoğu ServerScriptServicePlayerStateHandler'a odaklansa da, ReplicatedStorage içinde aynı adı taşıyan başka bir script bulunmaktadır. Ayrı tutulmasının sebebi istemci-sunucu mimarisidir:

  • İstemcinin uygun bir şekilde yanıt verebilmesi için oyuncu durumu bilgilerine ihtiyacı vardır; bu, doğru kullanıcı arayüzü bileşenlerini göstermek veya oyuncuların hareket etmesine ve ateş etmesine olanak tanımak gibi işlevleri içerir.

  • Sunucunun bu bilgilere ihtiyacı vardır; böylece istismarları önleyebilir. Örneğin, sunucu oyuncu durumunu karakterleri doğurmak ve donatmak, kuvvet alanlarını devre dışı bırakmak ve liderliği görüntülemek gibi işlemleri gerçekleştirmek için de oyuncu durumuna ihtiyaç duyar. Bu sebepten dolayı, bu script ReplicatedStorage içinde yer alır ve tamamen istemci tarafında değildir.

Bu temel mantığı görmek için, kullanıcının mevcut durumunu doğrulayan ve ardından o durum için gerekli işlemleri gerçekleştiren ReplicatedStoragePlayerStateHandler içindeki aşağıdaki scripti gözden geçirin.

PlayerStateHandler

local function onPlayerStateChanged(newPlayerState: string)
if newPlayerState == PlayerState.SelectingBlaster then
onSelectingBlaster()
elseif newPlayerState == PlayerState.Playing then
onPlaying()
elseif newPlayerState == PlayerState.TaggedOut then
onTaggedOut()
elseif newPlayerState == PlayerState.InLobby then
onInLobby()
else
warn(`Geçersiz oyuncu durumu ({newPlayerState})`)
end
end

Tüm olay tepkileri bu scriptte mantıksal olarak gruplandırılmıştır çünkü benzer davranış gerektirir: oyuncu kontrollerinin etkinleştirilmesi veya devre dışı bırakılması, kamera hareketi ve hangi UI katmanının görünür olduğudur. Örneğin, blaster seçimi sırasında oyuncular hem dokunulmaz olmalı hem de hareket edememelidir. Sunucu kuvvet alanını zaten yönetirken, istemci hareketi yönetir. Göstermek için, onSelectingBlaster() fonksiyonunun mantığını kontrol ederseniz, oyuncular bir blaster seçerken hareketlerini devre dışı bırakıldığını görebilirsiniz.

PlayerStateHandler

local function onSelectingBlaster()
togglePlayerCamera(true)
togglePlayerMovement(false)
setGuiExclusivelyEnabled(playerGui.PickABlasterGui)
localPlayer:SetAttribute(PlayerAttribute.blasterStateClient, BlasterState.Disabled)
end

onPlaying() fonksiyonu da benzer şekilde basittir. Hareketi etkinleştirir, ana gösterge paneline geçiş yapar (HUD), blaster'ı etkinleştirir ve sunucudakiyle aynı kuvvet alanı işlevini çağırır.

PlayerStateHandler

local function onPlaying()
togglePlayerMovement(true)
setGuiExclusivelyEnabled(playerGui.HUDGui)
localPlayer:SetAttribute(PlayerAttribute.blasterStateClient, BlasterState.Ready)
scheduleDestroyForceField()
end

Karakterleri yeniden doğurma

Örnek lazer tag deneyimi, ReplicatedStoragePlayerStateHandler içindeki onTaggedOut() durumu aracılığıyla karakterlerin tura yeniden doğmasını yönetir. onSelectingBlaster() ve onPlaying() durumlarında olduğu gibi, onTaggedOut() oyuncu durumu niteliğindeki değişikliklere göre benzersiz davranışları başlatır. Özellikle, hareketi devre dışı bırakır, yeniden doğma UI'sini sunar ve blaster'ı kapatır.

PlayerStateHandler

local function onTaggedOut()
-- Taglandığında kontrolleri devre dışı bırak
togglePlayerMovement(false)
togglePlayerCamera(false)
setGuiExclusivelyEnabled(playerGui.OutStateGui)
-- Taglandığında blaster'ı devre dışı bırak
localPlayer:SetAttribute(PlayerAttribute.blasterStateClient, BlasterState.Disabled)
end

Bu davranışı test etmek isterseniz, Esc tuşuna basabilir, Ayarlar sekmesine gidip Karakteri Yenile butonuna tıklayabilirsiniz. Yeniden doğma ekranını tetiklediğinizde, hareket edemeyeceğinizi, kamerayı döndüremeyeceğinizi veya blaster’ınızı ateşleyemeyeceğinizi unutmayın.

Roblox'un ayarlar menüsü, Reset Character butonu vurgulanmış.
Karakteri Yenile Butonu
Yeniden doğma ekranı, bir oyuncunun tura geri dönerken görüntüleniyor.
Yeniden Doğma Ekranı

Bu betiğin aslında karakterleri yeniden doğurmadığını, yalnızca onların hareketlerini durdurarak oyunculara sunucu'nun karakterlerini yeniden doğurduğuna dair görsel geri bildirim sağladığını belirtmek önemlidir. Göstermek adına, ServerScriptServiceSetupHumanoidsetupHumanoidAsynconHumanoidDied'i inceleyin; bu script PlayerState değerini TaggedOut olarak ayarlamakta (özünde ReplicatedStoragePlayerStateHandler'a bildirimde bulunmaktadır) ve bazı görsel göstergeler eklemektedir. Yeniden doğma işleminin fiili mantığı Roblox'un yerleşik bir işlevidir.

Oyuncular yeniden doğduklarında, takım rengine göre SpawnLocation.TeamColor özelliğine göre, kendi takımının doğma yerinde yeniden doğacaklardır. Yeniden doğma süresini özelleştirmek için, SetupHumanoid'un en üstüne aşağıdaki satırı ekleyebilirsiniz. Bu tekniği öğrenmek için Players.RespawnTime'a bakın.

SetupHumanoid

local Players = game:GetService("Players")
Players.RespawnTime = 10 -- yeni satır, saniye cinsinden

Çeşitli kurulum

Başlangıç kurulumu sürecinin bir parçası olarak, örnek lazer tag deneyimi ayrıca bazı küçük fakat kritik adımlar gerçekleştirir:

  • Deneyimde, varsayılan Roblox sağlık regenerasyonunu devre dışı bırakan boş bir betik bulunmaktadır; bu betik StarterPlayerStarterCharacterScriptsHealth adını taşımaktadır. Bu özelliğin davranışı hakkında açıklama için Humanoid.Health'a bakın.

  • Deneyim, StarterPlayer.CameraMode.LockFirstPerson özelliğini ayarlayarak birinci şahıs kamerası kullanır. Ayrıca, eğer kullanıcılara birinci ve üçüncü şahıs kameraları arasında geçiş yapma izni vermek istiyorsanız, bu özelliği yalnızca Stüdyo'da bir kez ayarlamak yerine programlı olarak değiştirmeniz gerektiğini ve perspektif değişimi için kontrolleri ve UI'yi değiştirmeniz gerektiğini unutmayın.

  • Deneyim, oyuncuların her birini başka bir oyuncuyu etiketlediklerinde kazandıkları "puan" birimi ile yerleşik Roblox liderlik sırasını kullanmaktadır. Bunu ServerScriptServiceSetupLeaderboard içinde, fakat Deneyim İçi Liderlik Sıralamaları konusunda tam bir genel bakış bulabilirsiniz. onPlayerTagged liderlik sırasına puan ekler; bu, Turları Ekle ve Vuruşları Tespit Et bölümlerinde öğreneceğiniz bir konudur.

Artık oyuncular doğabilir, bir blaster seçebilir ve birinci şahıs bakış açısıyla hedef alabilirler; sonraki bölüm, tur bazlı oyun oluşturmanın arkasındaki betikleri öğretmektedir.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.