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 oyunda bir nesne veya karakter oluşturma sürecidir ve yeniden doğma ise bir nesne veya karakterin, bir kaldırma koşulunu karşıladıktan sonra oyuna geri eklenmesi sürecidir; örneğin, bir karakterin sağlığının sıfıra ulaşması veya haritanın dışına düşmesi gibi. Her iki süreç de önemlidir çünkü oyuncuların oyuna katılmasını sağlar ve becerilerini geliştirmeye devam edebilirler.

örnek lazer tag oyunu referans alarak, bu öğretici bölümünde, doğma ve yeniden doğmayı yönetmek için Roblox'un yerleşik özelliklerini nasıl kullanacağınızı ve özelleştireceğinizi öğreneceksiniz; bu, aşağıdakilerle ilgili betik rehberliğini içerir:

  • Oyuncuların yalnızca kendi takımlarının doğma bölgesine doğabilmesi için doğma yerlerini yapılandırma.
  • Yeni oyuncuları ve karakterlerini oyuna katıldıklarında tura ekleme.
  • Oyuncular doğarken ve yeniden doğarken hasarı önleyen güç alanlarını özelleştirme.
  • Oyun durumunu yönetme, böylece oyun doğru zamanda düzgün çalışır.
  • Karakterleri tura katıldıklarında yeniden doğurma.
  • Oyun ve karakter parametrelerini ayarlamak için kritik olan küçük, çeşitli eylemleri gerçekleştirme.

Bu bölüm bol miktarda betik içeriği içerir, ancak bir oyun oluştururken her şeyi sıfırdan yazmak yerine, mevcut bileşenleri kullanmanızı, hızlı bir şekilde iterasyon yapmanızı ve hangi sistemlerin vizyonunuza uyması için özel bir uygulama gerektirdiğini anlamanızı teşvik eder. Bu bölümü tamamladıktan sonra, puanları takip eden, oyuncu durumunu izleyen ve tur sonuçlarını gösteren tur tabanlı oyun mekaniklerini nasıl uygulayacağınızı öğreneceksiniz.

Doğma yerlerini yapılandırma

Eğer şu anda oyunu test etseydiniz, tüm oyuncular ya yeşil takımın doğma bölgesindeki SpawnLocation nesnesinde ya da pembe takımın doğma bölgesindeki SpawnLocation nesnesinde rastgele doğacaklardı. Bu, oyuncuların rakiplerinin güç alanı kaybolur kaybolmaz her doğma bölgesinde birbirlerini etiketleyebileceği bir oyun sorunu ortaya çıkarır.

Bu sorunu aşmak için, örnek lazer tag oyunu her iki doğma yerini de Neutral özelliği false olarak ayarlayarak karşıt takımın oyuncularının yanlış doğma bölgesinde doğmasını kısıtlar ve TeamColor özelliğini, önceki bölümdeki Takım Renklerini Atama ile ilgili Team.Color değerine ayarlar:

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

Bir oyuncu oyuna katıldığında, ServerScriptServiceGameplayRoundsspawnPlayersInMap her takımda kaç oyuncunun olduğunu kontrol eder ve ardından en az oyuncuya sahip olan takımı döndürür.

spawnPlayersInMap
local function getSmallestTeam(): Team
local teams = Teams:GetTeams()
-- Takımları en küçükten en büyüğe 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 olan takımı bildiğinde, oyuncuyu o takıma yerleştirir, Player.Neutral özelliğini false olarak ayarlar, böylece oyuncu yalnızca kendi takımının doğma yerine doğabilir ve yeniden doğabilir, ardından PlayerState değerini SelectingBlaster olarak ayarlar; bu konuda daha fazla bilgiye daha sonra öğreticide ulaşacaksınız.

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 bölümünü incelediğinizde, haritada bir tane daha doğma yeri olduğunu görebilirsiniz: NeutralSpawn. Bu doğma yeri diğerlerinden farklıdır çünkü TeamColor özelliği oyundaki iki takımdan birine ayarlanmamıştır; bunun yerine, bu doğma yerinin Neutral özelliği, bir turun aktif olup olmadığına bağlı olarak değişir.

Örneğin, eğer tur aktifse, Neutral özelliği false olarak ayarlanır, böylece spawnPlayersInMap oyuncuları takımlara ayırabilir ve arenaya doğurabilir. Ancak, eğer tur aktif değilse, bir tur ile diğerinin arasındaki zaman gibi, Neutral özelliği true olarak ayarlanır, böylece oyuncular takım durumlarına bakılmaksızın orada doğabilirler. Bu süreç, Neutral doğma yerinin işlevsel bir lobiyi oluşturmasını sağlar.

Neutral

Göstermek için, ServerScriptServiceGameplayRoundsSpawnPlayersInLobby bölümünü incelediğinizde, bir turun sonunda çalıştığını görebilirsiniz; players: { Player } tablosuna geçirilen her oyuncu için, betik:

  • Player.Neutral özelliğini true olarak ayarlayarak otomatik olarak Player.Team değerini nil olarak sıfırlar, böylece oyuncu bir tur aktif olmadığında lobide yeniden doğabilir, çünkü doğma yerinin Neutral özelliği de true olarak ayarlanmıştır.
  • PlayerState değerini InLobby olarak değiştirir, böylece oyuncunun blaster'ı ve birinci şahıs UI görselleri kaldırılır.

Nötr doğma bölgesi ve her tur için işlevselliği hakkında daha fazla bilgi için, öğreticinin bir sonraki bölümünde Turlar Ekleme bölümüne 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 genellikle olay odaklıdır, yani betikler bir Roblox hizmetinden gelen olayları dinler ve ardından bir işlevi yanıt olarak çağırır. Örneğin, çok oyunculu bir oyuna yeni oyuncular eklerken, oyuncuların başarılı bir şekilde bağlanması için gerekli her şeyi yöneten bir olay olmalıdır. Örnek lazer tag oyununda, bu karşılık gelen olay Players.PlayerAdded:Connect'dir.

Players.PlayerAdded:Connect, oyundaki birden fazla betiğin bir parçasıdır. Ctrl/Cmd+Shift+F kısayolunu kullanarak Players.PlayerAdded:Connect için arama yaparsanız, sonuçlar oyunun başlangıç ayarlarını anlamak için iyi bir başlangıç noktası sağlar.

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

Göstermek için, ServerScriptServiceSetupHumanoid bölümünü açın. Player ve Character arasındaki ayrım, bu betiği anlamak için anahtardır:

  • Bir oyuncu, bağlı bir istemcidir ve bir karakter, bir Humanoid modelidir.
  • Oyuncular bir blaster seçmeli ve liderlik tablosuna eklenmelidir. Karakterler doğmalı ve bir blaster almalıdır.

SetupHumanoid, oyuncunun bir karaktere sahip olup olmadığını (yeni katıldı) veya sahip olmadığını (yeniden doğuyor) hemen kontrol eder. Birini bulduğunda, onCharacterAdded() çağrılır, karakterden Humanoid modelini alır ve özelleştirme için ServerScriptServiceSetupHumanoidsetupHumanoidAsync'e iletir. Bu değerleri ayarladıktan sonra, betik karakterin sağlığının sıfıra ulaşmasını bekler. Yeniden doğma hakkında daha fazla bilgiye bu bölümde ulaşacaksınız.

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 betikte önemli bir not, özelliklerin tamamen isteğe bağlı olmasıdır; yani, işlevin ilk altı satırını kaldırırsanız, oyun yine de düzgün çalışır. Fonksiyonel gereksinimler olmaktan ziyade, her özellik, oyun hedeflerinizi karşılayan tasarım kararları almanıza olanak tanır. Örneğin:

  • Karakter adlarının daha yakın mesafelerde görüntülenmesini istiyorsanız, Humanoid.NameDisplayDistance değerini azaltın.
  • Bir karakterin sağlığının yalnızca %100'ün altındaysa görüntülenmesini istiyorsanız, Humanoid.HealthDisplayType değerini DisplayWhenDamaged olarak ayarlayın.
  • Karakterlerin sağlığı 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ştirirseniz, yeni ayarlarınızın etkisini görebilmek için oyun test etmeniz önemlidir. En az iki karakteri seçerek bir Server & Clients testinden çok istemcili simülasyon oluşturabilirsiniz.

Studio'nun mezzanine'inin test modları açılır menüsündeki Sunucu & İstemciler seçeneği.

Players.PlayerAdded:Connect olayının bir diğer örneği ServerScriptServicePlayerStateHandler'dadır. Önceki örnekte olduğu gibi, PlayerStateHandler hemen bir karakter kontrolü yapar. 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çebileceği bir turun başlangıç durumudur. Bu durum ayrıca, oyuncular seçimlerini yaparken hasar almalarını önleyen bir güç 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'da tartışmayı gerektiren bir değişken var: attributeChangedConnectionByPlayer. Bu tablo, tüm oyuncuları ve GetAttributeChangedSignal'a olan Connections bağlantılarını saklar. Bu bağlantıyı bir tabloda saklamanın nedeni, PlayerStateHandler'ın oyuncu oyundan ayrıldığında bunu bağlantıyı kesmesi içindir. Bu süreç, bağlantı sayısının zamanla büyümesini önlemek için bir tür bellek yönetimi işlevi görür.

PlayerStateHandler
local attributeChangedConnectionByPlayer = {}
local function onPlayerAdded(player: Player)
-- Oyuncu durumundaki tüm gelecekteki güncellemeleri yönetin
attributeChangedConnectionByPlayer[player] = player
:GetAttributeChangedSignal(PlayerAttribute.playerState)
:Connect(function()
local newPlayerState = player:GetAttribute(PlayerAttribute.playerState)
onPlayerStateChanged(player, newPlayerState)
end)
end
-- Oyuncu oyundan ayrıldığında nitelik değişiklik bağlantısından bağlantıyı kesin
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 de onPlayerStateChanged() çağrısını yaptığını görebilirsiniz. Bir oyuncu bir takıma ayrıldıktan sonraki başlangıç ayarları sırasında, onPlayerAdded() PlayerState değerini SelectingBlaster olarak ayarladığında, ilk if ifadesi yanlış değerlendirildiği için BlasterState devre dışı bırakılır. Daha sonraki Blaster'ları Uygula bölümünde, bu sürecin daha fazla ayrıntısını öğreneceksiniz.

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

Eğer kesme noktaları ekler veya sadece bir print() ifadesi kullanırsanız, onPlayerStateChanged()'in oyunun birçok yerinde çağrıldığını görebilirsiniz: örneğin, bir turun başlangıç ayarları sırasında, ana kod yoluna ayarlandığında, oyuncu bir blaster seçtiğinde ve oyuncu lobide veya Neutral doğma yerinde geri döndüğünde. Ayrıca, oyuncu bir blaster seçtikten sonra, ServerScriptServiceBlasterSelectedHandler PlayerState değerini Playing olarak ayarlar ve PlayerStateHandler nihayet güç alanını kaldırmak için scheduleDestroyForceField() çağrısını yapabilir.

Güç alanlarını özelleştirme

Özel bir uygulama kullanmak yerine, örnek lazer tag oyunu, oyuncuların blaster'larını seçerken hasar almalarını önlemek için Studio'nun yerleşik ForceField sınıfını kullanır. Bu, oyuncuların bir güç alanıyla doğmaları için tek gereksinimin, 0'dan büyük bir SpawnLocation.Duration özelliğine sahip doğma yerlerini içermesi olduğunu garanti eder. Örnek, güç alanlarını etkinleştirmek için 9,999 gibi keyfi bir değer kullanır ve ardından gerçek süreyi programatik olarak ReplicatedStorageForceFieldClientVisuals içinde yönetir.

setupHumanoidAsync'a benzer şekilde, ForceFieldClientVisuals içindeki çoğu satır isteğe bağlıdır. Örneğin, işlevin içeriğini aşağıdaki betikte olduğu gibi yorum satırı haline getirirseniz, oyun varsayılan parlayan güç alanını kullanır, StarterGuiForceFieldGui içindeki altıgen betiği yerine.

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

Özel güç alanı bir GUI olduğundan, yeni bir ParticleEmitter değil, ForceFieldClientVisuals betiği yalnızca her oyuncunun birinci şahıs görsellerini etkiler, diğer oyunculara bakıldığında üçüncü şahıs görsellerini etkilemez. Üçüncü şahıs görselleri varsayılan Roblox görünümünü korur. Güç alanlarını değiştirme hakkında daha fazla bilgi için, ForceField.Visible'a bakın.

Birinci şahıs güç alanı görselleri, ekranın çevresinde geleceğe ait altıgen bir ızgara içerir.
Birinci şahıs güç alanı görselleri
Üçüncü şahıs güç alanı görselleri, oyuna doğan oyuncunun etrafında mavi parlayan bir küre içerir.
Üçüncü şahıs güç alanı görselleri

Güç alanları, oyunculara doğma ve yeniden doğma arasında düşman oyuncularla endişelenmeden yeterince zaman sağladıkları için faydalıdır, ancak sonunda ana lazer tag oyun mekanikleri için kaybolmaları gerekir. Güç alanı kaldırma işlemini yöneten betik ReplicatedStoragescheduleDestroyForceField içindedir ve üç benzersiz durumu kontrol eder:

  • Oyuncular bir blaster seçtikten sonra, güç alanlarının oyuncuların çevrelerine alışmaları için yeterince uzun süre kalması gerekir.
  • Bu alışma süresi boyunca, güç alanları avantaj olmamalıdır, bu nedenle bir oyuncu blaster'ını ateşlediği anda kaybolmaları gerekir.
  • Güç alanları, oyuncular blaster'ı ateşlemeden veya güç alanı süresi dolmadan önce karakterlerini sıfırladıklarında kaybolmalıdır.

scheduleDestroyForceField betiğindeki her bir kontrol, bu koşullar için endForceField() çağrısını yapar.

scheduleDestroyForceField
-- Oyuncu blaster'ı ateşlerse güç alanını sonlandır
local blasterStateAttribute = getBlasterStateAttribute()
attributeChangedConnection = player:GetAttributeChangedSignal(blasterStateAttribute):Connect(function()
local currentBlasterState = player:GetAttribute(blasterStateAttribute)
if currentBlasterState == BlasterState.Blasting then
endForceField()
end
end)
-- Oyuncu sıfırlarsa güç alanını sonlandır
characterRespawnedConnection = player.CharacterRemoving:Connect(endForceField)
-- 8 saniye sonra güç alanını sonlandır
task.delay(MAX_FORCE_FIELD_TIME, endForceField)

endForceField() içinde, forceFieldEnded boolean'ı etrafında görünüşte garip bir if ifadesi vardır. Kontroller sıralı olarak çalıştığı için, betik endForceField() fonksiyonunu iki veya üç kez çağırabilir. forceFieldEnded boolean'ı, fonksiyonun yalnızca bir kez bir güç 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ı isimde başka bir betik vardır. Ayrımın nedeni, istemci-sunucu mimarisidir:

  • İstemcinin, uygun bir şekilde yanıt verebilmesi için oyuncu durumu bilgilerini anlaması gerekir; örneğin, doğru kullanıcı arayüzü öğelerini görüntülemek veya oyuncuların hareket etmesini ve ateş etmesini sağlamak gibi.

  • Sunucunun, istismarları önlemek için bu aynı bilgilere ihtiyacı vardır. Örneğin, sunucu ayrıca oyuncu durumuna ihtiyaç duyar; karakterleri doğurmak ve donatmak, güç alanlarını devre dışı bırakmak ve bir liderlik tablosu görüntülemek gibi işlemleri gerçekleştirmek için. Bu nedenle, bu betik ReplicatedStorage içindedir ve tamamen istemci tarafında bir konumda değildir.

Bu temel mantığı görmek için, kullanıcının mevcut durumunu doğrulayan ve ardından o duruma karşılık gelen eylemleri yöneten uygun işlevi çağıran ReplicatedStoragePlayerStateHandler içindeki aşağıdaki betiği 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 yanıtları, benzer davranış gerektirdikleri için bu betikte mantıksal olarak gruplandırılmıştır; bu, oyuncu kontrollerini etkinleştirme veya devre dışı bırakma, kamera hareketi ve hangi UI katmanının görünür olduğunu içerir. Örneğin, blaster seçimi sırasında, oyuncular hem savunmasız olmalı hem de hareket edememelidir. Sunucu zaten güç alanını yönetirken, istemci hareketi yönetir. Göstermek için, onSelectingBlaster() işlevinin mantığını kontrol ederseniz, istemcinin blaster seçerken oyuncu hareketini devre dışı bıraktığını görebilirsiniz.

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

onPlaying() işlevi de benzer şekilde basittir. Hareketi etkinleştirir, ana gösterge ekranına (HUD) geçiş yapar, blaster'ı etkinleştirir ve sunucudaki aynı güç 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 oyunu, karakterleri bir tura yeniden doğurmayı ReplicatedStoragePlayerStateHandler içindeki onTaggedOut() durumu aracılığıyla yönetir. onSelectingBlaster() ve onPlaying() durumu gibi, onTaggedOut() da playerState niteliğindeki değişikliklere göre benzersiz davranışları tetikler. Özellikle, oyuncu hareketini devre dışı bırakır, yeniden doğma UI'sini sunar ve blaster'ı devre dışı bırakır.

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

Bu davranışı test etmek isterseniz, Esc tuşuna basabilir, Ayarlar sekmesine gidebilir ve ardından Karakteri Sıfırla butonuna tıklayabilirsiniz. Yeniden doğma ekranını tetiklediğinizde, hareket edemediğinizi, kamerayı döndüremediğinizi veya blaster'ınızı ateşleyemediğinizi fark edin.

Roblox'un ayarlar menüsü, Karakteri Sıfırla butonu vurgulanmış.
Karakteri Sıfırla Butonu
Yeniden doğma ekranı, bir oyuncunun tura geri doğarken görüntülenir.
Yeniden Doğma Ekranı

Bu betiğin aslında karakterleri yeniden doğurmadığını, sadece onların hareketlerini durdurduğunu ve oyunculara sunucunun karakterlerini yeniden doğurduğuna dair görsel geri bildirim sağladığını belirtmek önemlidir. Göstermek için, ServerScriptServiceSetupHumanoidsetupHumanoidAsynconHumanoidDied bölümünü incelediğinizde, betiğin PlayerState değerini TaggedOut olarak ayarladığını (temelde ReplicatedStoragePlayerStateHandler'a bildirimde bulunarak) ve bazı görsel göstergeler eklediğini görebilirsiniz. Yeniden doğmanın gerçek mantığı, yerleşik bir Roblox davranışıdır.

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

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

Çeşitli ayarlar

Başlangıç ayarlarının bir parçası olarak, örnek lazer tag oyunu bazı küçük ama kritik adımlar da gerçekleştirir:

  • Oyun, varsayılan Roblox sağlık yenilenmesini devre dışı bırakan boş bir betik olan StarterPlayerStarterCharacterScriptsHealth içerir. Bu özelliğin davranışı hakkında açıklama için, Humanoid.Health'a bakın.

  • Oyun, StarterPlayer.CameraMode.LockFirstPerson özelliğini ayarlayarak birinci şahıs kamerası kullanır. Kullanıcıların birinci ve üçüncü şahıs kameraları arasında geçiş yapmalarına izin vermek istiyorsanız, bu özelliği yalnızca Studio'da bir kez ayarlamak yerine programatik olarak değiştirmeniz ve perspektif değişikliğine karşılık gelen kontrolleri ve UI'yi değiştirmeniz gerektiğini unutmayın.

  • Oyun, her oyuncunun başka bir oyuncuyu etiketlediğinde kazandığı "puan" birimi ile yerleşik Roblox liderlik tablosunu kullanır. Yapılandırmayı ServerScriptServiceSetupLeaderboard içinde görebilirsiniz, ancak Oyun İçi Liderlik Tabloları tam bir genel bakış sunar. onPlayerTagged puanları liderlik tablosuna ekler; bunu Turlar Ekle ve Vuruşları Tespit Et bölümlerinde öğreneceksiniz.

Artık oyuncular doğabiliyor, bir blaster seçebiliyor ve birinci şahıs bakış açısıyla nişan alabiliyorlar; bir sonraki bölüm, tur tabanlı oyun mekaniklerini oluşturmanın arkasındaki betikleri öğretir.

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