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ış.


Bir oyuncu deneyime katıldığında, ServerScriptService ⟩ Gameplay ⟩ Rounds ⟩ spawnPlayersInMap 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
Workspace ⟩ World ⟩ Map ⟩ Spawns 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.

Göstermek için, ServerScriptService ⟩ Gameplay ⟩ Rounds ⟩ SpawnPlayersInLobby'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.

Örnek olarak, ServerScriptService ⟩ SetupHumanoid dosyasını açın. Player ile Character arasındaki ayrım, bu betiği anlamanın anahtarıdır:
- 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 ServerScriptService ⟩ SetupHumanoid ⟩ setupHumanoidAsync'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.

Players.PlayerAdded:Connect olayının bir diğer örneği ServerScriptService ⟩ PlayerStateHandler'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, ServerScriptService ⟩ BlasterSelectedHandler 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 ReplicatedStorage ⟩ ForceFieldClientVisuals 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 StarterGui ⟩ ForceFieldGui 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.


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 ReplicatedStorage ⟩ scheduleDestroyForceField 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 ServerScriptService ⟩ PlayerStateHandler'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 ReplicatedStorage ⟩ PlayerStateHandler 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, ReplicatedStorage ⟩ PlayerStateHandler 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.


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, ServerScriptService ⟩ SetupHumanoid ⟩ setupHumanoidAsync ⟩ onHumanoidDied'i inceleyin; bu script PlayerState değerini TaggedOut olarak ayarlamakta (özünde ReplicatedStorage ⟩ PlayerStateHandler'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.
SetupHumanoidlocal 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 StarterPlayer ⟩ StarterCharacterScripts ⟩ Health 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 ServerScriptService ⟩ SetupLeaderboard 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.