基本スクリプティングのチュートリアルを通じて、プレイ可能なシーンを作成するために個々のパーツをスクリプト化してきました。前の方法では、パーツを複製するとスクリプトも複製されてしまいます。これにより、スクリプトを更新するのが面倒になり、変更をスクリプトごとに行う必要がありました。
このチュートリアルでは、ヘルスピックアップを作成するために異なるパターンを使用します。スクリプトは1つだけで、ヘルスピックアップの動作を決定します。ピックアップに触れると、プレイヤーのヘルスが回復し、少しフェードアウトして短時間無効になります。
セットアップ
まず、ピックアップとして使用するパーツまたはモデルが必要です。ショーダウンタウンの例の世界には、マップ全体に広がる多くのヘルスピックアップが含まれています。

各ヘルスピックアップは、内部に緑のPointLightを持つ2つの長方形のパーツのユニオンです。これらはすべて、スクリプトが探すHealthPickupsという名前のフォルダにWorkspace内に保存されています。マップにさらに追加する場合は、必ずこのフォルダに保存されていることを確認してください。


ヘルスを回復する
まず、スクリプトがプレイヤーのヘルスを回復する必要があります。このパターンは、デッドリーラバのチュートリアルからお馴染みのものでしょう。
ServerScriptServiceにPickupManagerという名前のスクリプトを追加します。
このスクリプト内で、値を100とする定数MAX_HEALTHを宣言します。
ピックアップに触れた他のパーツとピックアップ自体のパラメータを持つonTouchHealthPickupという関数を作成します。
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)end関数内で、otherPartの親からキャラクターモデルを取得します。次に、FindFirstChildWhichIsA()を使用して、Humanoidがあるかどうかを確認します。
ヒューマノイドがある場合は、そのHealthプロパティをMAX_HEALTHに設定します。
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
ピックアップフォルダを取得する
ヘルスピックアップを保持するフォルダは、スクリプトが実行される時点でゲームに読み込まれていない可能性があります。WaitForChildを使用してスクリプトを一時停止し、ヘルスピックアップフォルダが読み込まれるのを待つことができます。
フォルダに対して呼び出されたとき、GetChildren関数はフォルダの内容の配列を返します。
MAX_HEALTHの下に、healthPickupsFolderという変数を宣言し、WaitForChild関数を使用してWorkspaceからHealthPickupsフォルダを取得します。
healthPickupsFolderに対してGetChildren関数を呼び出した結果を格納するために、healthPickupsという名前の変数を作成します。
local MAX_HEALTH = 100local healthPickupsFolder = workspace:WaitForChild("HealthPickups")local healthPickups = healthPickupsFolder:GetChildren()local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
ipairsでループする
onTouchHealthPickupは、配列内の各ヘルスピックアップに対して呼び出す必要があります。これを効率的に行うために、新しい種類のループ構文を使用します。
ipairsは、forループと共に使用して配列の各要素を通過するための関数です。ループの開始と終了を指定する必要はありません。ipairsを使用したforループは次のように定義されます。

- Index: これは通常のforループの制御変数に相当します。
- Value: ループが反復するにつれて、配列内の各要素でこの変数が埋められます。値変数には、実際に含まれるものに基づいて名前を付けるのが良いアイデアです。
- Array: 反復処理したい配列がipairs関数に渡されます。
次のコードでは、インデックスは何にも必要ないので、_で空白にできます。ipairs関数を使用して、healthPickupsを渡すforループを作成します。
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
for _, healthPickup in ipairs(healthPickups) do
endヘルスピックアップをonTouchHealthPickup関数に渡すためのラッパー関数が必要です。
forループ内で、TouchedイベントをotherPartというパラメータを持つ匿名関数に接続します。
onTouchHealthPickups関数を呼び出し、otherPartパラメータとhealthPickupの両方を渡します。
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
今すぐコードをテストしてみてください。ヘルスピックアップがあなたのヘルスを回復することがわかるはずです。まずプレイヤーにダメージを与える必要があります - スポーンポイントの隣にあるベントの上に立ってみてください。

右上にヘルスバーが表示され、プレイヤーが回復すると消えます。
ピックアップのクールダウン
現在、ピックアップは触れたプレイヤーを無限に回復します。1回だけピックアップできるようにし、再度使用できるまでの短いクールダウンがあった方が効果的です。
まず、ピックアップがクールダウン期間にあるかどうかを記録する必要があります。以下のパターンは、フェードトラップからお馴染みのもので、今回はヘルスピックアップに属性を設定することでデバウンスを実現します。
forループ内で、"Enabled"という新しい属性をtrueに設定します。
onTouchHealthPickup内のコードを、条件healthPickup:GetAttribute("Enabled")を持つif文でラップします。
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendendendfor _, healthPickup in ipairs(healthPickups) dohealthPickup:SetAttribute("Enabled", true)healthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
ピックアップを無効にする
ピックアップは無効であることを視覚的に示す必要があります - 一般的な方法は、少し透明にすることです。
スクリプトの先頭に3つの定数を宣言します(各値はお好みに応じて調整してください):
- ENABLED_TRANSPARENCY = 0.4
- DISABLED_TRANSPARENCY = 0.9
- COOLDOWN = 10
local MAX_HEALTH = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")onTouchHealthPickupのif文内で、ピックアップのTransparencyをDISABLED_TRANSPARENCYに設定し、Enabled属性の値をfalseに設定します。
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendtask.wait()関数を呼び出し、待機する時間としてCOOLDOWNを渡します。
TransparencyをENABLED_TRANSPARENCYに戻し、Enabledをtrueに戻します。
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)task.wait(COOLDOWN)healthPickup.Transparency = ENABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", true)endendend
ピックアップを再度テストしてください。ピックアップに触れると、ヘルスが回復し、透明になり、再び使用できるようになります。
ピックアップが収集されたときにプレイヤーに対するフィードバックをよりインパクトのあるものにしたい場合は、透明度を変更するときにピックアップ内のPointLightの明るさを下げてみてください。
これらのヘルスピックアップを自分のプロジェクトで使用するか、外観や効果を変更してプレイヤーに異なる種類のパワーアップを提供してみてください。
最終コード
local MAX_HEALTH = 100
local ENABLED_TRANSPARENCY = 0.4
local DISABLED_TRANSPARENCY = 0.9
local COOLDOWN = 10
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
if healthPickup:GetAttribute("Enabled") then
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
healthPickup.Transparency = DISABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", false)
task.wait(COOLDOWN)
healthPickup.Transparency = ENABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", true)
end
end
end
for _, healthPickup in ipairs(healthPickups) do
healthPickup:SetAttribute("Enabled", true)
healthPickup.Touched:Connect(function(otherPart)
onTouchHealthPickup(otherPart, healthPickup)
end)
end