以前のチュートリアルでは、フェイディングプラットフォーム や毒性のある溶岩 など、さまざまなエクスペリエンス機能を作成しました。このチュートリアルは、ユーザーが最も長く生存できるプレイヤブルなエクスペリエンスを作成するために、これらを組み合わせます。ユーザーが最も長く生存できるとき
セットアップ
まず、エクスペリエンスのシーンを設定する必要があります。以前のチュートリアルで作成した フェーディングプラットフォーム を複製し、ユーザーがプラットフォームのボードに長く滞在できるようにしましょう。
また、ユーザーがプラットフォームから落ちるときに 死の溶岩を使用 して殺すこともできます。ユーザーがプラットフォームにジャンプできるようにする スポーン場所 を置くことを忘れないでください。
プレイヤーポイント
Roblox には、ユーザーの統計を表示するための内蔵の リーダーボード があります。プレイヤーポイントをリーダーボースコアボードで設定すると、エクスペリエンスの右側に表示されます。
あなたは後のチュートリアルで情報を表示する方法をカスタマイズすることができますが、リーダーボードは Roblox で見えるスコアシステムを作成する最も簡単な方法です。
エクスペリエンスステートを設定するスクリプトを ServerScriptService に入れるべき 、エクスペリエンスが開始されると自動的に実行されます。In ServerScriptService に 、「 SetupPoints 」という名前のスクリプトを作成します。
プレイヤーをリスニング
In Roblox、サービス は、Players を実行するオブジェクトです。PlayerAdded サービスには、2> Class.Players.PlayerAdded|PlayerAdded2> というイベントがあり、ユーザーがエクスペリエンスに参加するたびにポイントを設定できます。
Class.DataModel|game オブジェクトの game 関数でサービスにアクセスできます。game は、あなたのエクスペリエンス内のすべてを含む変数にアクセスできる、任意の場所からアクセス可能な変数です。
ゲームame:GetService("Players") を使用して、PlayerService の変数を作成します。
入ってくるプレイヤーのパラメーターで onPlayerAdded という関数を作成します。
PlayerAdded イベントに onPlayerAdded 機能を接続します。
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
統計フォルダを作成
ユーザーのポイントをランキングに表示するには、Folder オブジェクトの新しい Player を作成し、"leaderstats" を呼び出す必要があります。新しいオブジェクトはスクリプト内のスクリプトファイルから作成できます。新しいオブジェクトは、
新しい Folder オブジェクトを作成するには、Instance.new("Folder") を使用し、結果を新しい変数に保存します leaderstats 。
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")endleaderstats の名前プロパティを "leaderstats" に設定します。
親 leaderstats を player に。
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
ポイントの作成
リーダーボードシステムは、leaderstats フォルダ内の値を読み込んで、見つけたものを表示します。
プレイヤーのポイントを追跡する新しい IntValue オブジェクトを追加するには、leaderstats フォルダの親になる新しい IntValue オブジェクトを追加できます。値オブジェクトの名前は、現在の値と一緒に表示されます。
- 変数名 points を使用して、IntValue オブジェクトを作成します。
- Name を "Points" に設定します。
- Value を 0 に設定します。これは、リーダーボードがプレイヤーに最初に表示するものです。
- 親 points オブジェクトを leaderstats フォルダに。
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
end
Players.PlayerAdded:Connect(onPlayerAdded)
あなたのエクスペリエンスをテストし、リーダーボードが右上隅にあり、ユーザーの名前とポイントスコアがそれぞれ隣に表示されていることを見る必要があります。
カウントダウン
各ユーザーは、生きている秒数ごとにポイントを獲得します。while ループとtask.wait() 機能を使用して、ポイントの値を毎秒更新できます。
- スクリプトの終わりに、 while ループを作成し、 true をコンディションとして使用します。
- Library.task.wait() を 1 秒間ループします。
Players.PlayerAdded:Connect(onPlayerAdded)while true dotask.wait(1)end
プレイヤーリスト
エクスペリエンス内のすべてのユーザーにコードを実行するには、Class.Players:GetPlayers()|GetPlayers 関数によって返されるユーザーの GetPlayers 配列をイテレートする必要があります。
配列は、ストレートされたアイテムのリストです。各アイテムは、それぞれの インデックス 位置からアクセスできます。配列の長さは、 1 から付けることができます。
- Class.Players:GetPlayers() の結果を playerList 変数に保存します。
- ループの開始値 1 と終了値 playerList を持つロープを作成し、それぞれのプレイヤーにループの 1 回のイテレーションを得るようにします。
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList do-- playerList の各プレイヤーのためにロジックを追加するendend
ポイントを授与する
ループ中の各ユーザーにポイントを割り当てるには、ユーザーを配列から取り出し、 ポイント オブジェクトを leaderstats フォルダに追加する必要があります。
配列に保存されたオブジェクトは、 正しい括弧 - たとえば、playerList 配列の最初のアイテムは、playerList[1] でアクセスできます。1>playerList[currentPlayer]1> を for ループで書き込むと、ループの各ユーザーに対してリストを移動で
- Store the user at playerList[currentPlayer] in a variable called player .
- ユーザーの ポイント オブジェクトを変数「points」に保存します。
- Class.IntValue.Value|Value プロパティの points を points.Value + 1 に設定します。
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList dolocal player = playerList[currentPlayer]local points = player.leaderstats.Pointspoints.Value += 1endend
あなたのエクスペリエンスをテストし、リーダーボードがあなたのプレイヤーのスコアを 1 秒ごとに 1 でカウントすることを発見するでしょう。
キャラクターをリスニング
エクスペリエンスの目的は、最も長く生存できるユーザーを見つけることです。そのため、死亡するユーザーは、ポイントを 0 にリセットする必要があります。
ユーザーが死亡したときに検出するために、ユーザーの キャラクター モデルを取得する必要があります。このモデルは、Class.Player オブジェクトが読み込まれた後にのみエクスペリプレイヤー
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
ユーザーを onCharacterAdded 機能のパラメータに含めた場合でも、実際の CharacterAdded イベントは、アソシエイトされたユーザーではなく、キャラクターのみを返します。player
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
ポイントのリセット
ユーザーが死亡すると、自動的に Humanoid が Died イベントを発動します。このイベントを使用して、ポイントをリセットするタイミングを確認できます。
ヒューマノイドはキャラクターモデル内にありますが、そのモデル内のコンテンツは、ユーザーがスポーンするときにのみ組み立てられます。コードを安全に待ち、ヒューマノイドオブジェクトを読み込むためには、Class.Instance:WaitForChild()|WaitForChild()
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
end
死亡イベントに接続する必要がある関数は非常に短く、ここでのみ使用されるため、匿名関数を再び使用できます。
- 新しい匿名関数をヒューマノイドの Died イベントに接続します。
- 匿名関数で、プレイヤーの points オブジェクトのための変数を作成します。
- Class.IntValue.Value|Value プロパティの points を 0 に設定します。
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
end)
end
これをテストすると、ユーザーのスコアが死亡時にリセットされることがわかります。
プレイヤーをチェック中
ユーザーが死んでいるときでもポイントを獲得し続ける場合、それは体験の精神にほとんど関係ありませんので、コードはポイントを付与する前にユーザーが生きているかどうかをチェックする必要があります。
ユーザーが生きているかどうかをチェックするために、onPlayerAdded 関数の中の onPlayerAdded を定義する必要があります。この時点で、ユーザーはまだ生きていません。また、ユーザーのキャラクターモデルがまだ追加される必要があります。
アトリビュートを使用すると、Roblox のオブジェクトを自分のデータでカスタマイズできます。アトリビュートは名前と値の両方を持つオブジェクトです。 Class.Instance:SetAttribute()|Class.Instance:SetAttribute
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
ユーザーのキャラクターモデルがリスポーンすると、IsAlive の値は true に変更され、ユーザーがポイントを再び獲得できるようになります。
- In onCharacterAdded で、IsAlive 属性の player を 1> true1> に設定します。
- In onCharacterDied で、IsAlive 属性の player を 1> false1> に設定します。
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end
最後に、 IsAlive はスクリプトの終わりの while ループの前にチェックする必要があります。 while 機能はプレイヤー性の名前
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList dolocal player = playerList[currentPlayer]if player:GetAttribute("IsAlive") thenlocal points = player.leaderstats.Pointspoints.Value += 1endendend
今すぐあなたのエクスペリエンスをテストして、あなたが生きているときにユーザーがポイントを獲得し、0で死んだときに残ります。友達とプレイして、誰が最高得点を獲得できるかを見てください。
これは開始まりにすぎません:ユーザーのためにエクスペリエンスを改善し続けることができます。ここにいくつかのヒントがあります:
- すべてのプラットフォームのコードを単一のスクリプトに入れて、更アップデートがはるかに簡単になります。
- ユーザーがエクスペリエンスエリアにテレポートされるのを待つロビーエリアを作成し、ユーザーが同時に開始できます。
- それぞれのラウンドの勝者を発表します。
最終コード
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for i = 1, #playerList do
local player = playerList[i]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
end