ヘルスピックアップを作成する

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

基本スクリプティングのチュートリアルを通じて、プレイ可能なシーンを作成するために個々のパーツをスクリプト化してきました。前の方法では、パーツを複製するとスクリプトも複製されてしまいます。これにより、スクリプトを更新するのが面倒になり、変更をスクリプトごとに行う必要がありました。

このチュートリアルでは、ヘルスピックアップを作成するために異なるパターンを使用します。スクリプトは1つだけで、ヘルスピックアップの動作を決定します。ピックアップに触れると、プレイヤーのヘルスが回復し、少しフェードアウトして短時間無効になります。

セットアップ

まず、ピックアップとして使用するパーツまたはモデルが必要です。ショーダウンタウンの例の世界には、マップ全体に広がる多くのヘルスピックアップが含まれています。

ゲームのメインページからのスタジオでの編集オプション

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

ヘルスを回復する

まず、スクリプトがプレイヤーのヘルスを回復する必要があります。このパターンは、デッドリーラバのチュートリアルからお馴染みのものでしょう。

  1. ServerScriptServicePickupManagerという名前のスクリプトを追加します。

  2. このスクリプト内で、値を100とする定数MAX_HEALTHを宣言します。

  3. ピックアップに触れた他のパーツとピックアップ自体のパラメータを持つonTouchHealthPickupという関数を作成します。

    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. 関数内で、otherPartの親からキャラクターモデルを取得します。次に、FindFirstChildWhichIsA()を使用して、Humanoidがあるかどうかを確認します。

  5. ヒューマノイドがある場合は、そのHealthプロパティをMAX_HEALTHに設定します。

    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

ピックアップフォルダを取得する

ヘルスピックアップを保持するフォルダは、スクリプトが実行される時点でゲームに読み込まれていない可能性があります。WaitForChildを使用してスクリプトを一時停止し、ヘルスピックアップフォルダが読み込まれるのを待つことができます。

フォルダに対して呼び出されたとき、GetChildren関数はフォルダの内容の配列を返します。

  1. MAX_HEALTHの下に、healthPickupsFolderという変数を宣言し、WaitForChild関数を使用してWorkspaceからHealthPickupsフォルダを取得します。

  2. healthPickupsFolderに対してGetChildren関数を呼び出した結果を格納するために、healthPickupsという名前の変数を作成します。

    local MAX_HEALTH = 100
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
    local healthPickups = healthPickupsFolder:GetChildren()
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

ipairsでループする

onTouchHealthPickupは、配列内の各ヘルスピックアップに対して呼び出す必要があります。これを効率的に行うために、新しい種類のループ構文を使用します。

ipairsは、forループと共に使用して配列の各要素を通過するための関数です。ループの開始と終了を指定する必要はありません。ipairsを使用したforループは次のように定義されます。

for index, value in ipairs(array) do

  • 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関数に渡すためのラッパー関数が必要です。

  1. forループ内で、TouchedイベントをotherPartというパラメータを持つ匿名関数に接続します。

  2. onTouchHealthPickups関数を呼び出し、otherPartパラメータとhealthPickupの両方を渡します。

    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

今すぐコードをテストしてみてください。ヘルスピックアップがあなたのヘルスを回復することがわかるはずです。まずプレイヤーにダメージを与える必要があります - スポーンポイントの隣にあるベントの上に立ってみてください。

スポーンポイントの右側にある例の世界の蒸気ベント

右上にヘルスバーが表示され、プレイヤーが回復すると消えます。

ピックアップのクールダウン

現在、ピックアップは触れたプレイヤーを無限に回復します。1回だけピックアップできるようにし、再度使用できるまでの短いクールダウンがあった方が効果的です。

まず、ピックアップがクールダウン期間にあるかどうかを記録する必要があります。以下のパターンは、フェードトラップからお馴染みのもので、今回はヘルスピックアップに属性を設定することでデバウンスを実現します。

  1. forループ内で、"Enabled"という新しい属性trueに設定します。

  2. onTouchHealthPickup内のコードを、条件healthPickup:GetAttribute("Enabled")を持つif文でラップします。

    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
    end
    end
    end
    for _, healthPickup in ipairs(healthPickups) do
    healthPickup:SetAttribute("Enabled", true)
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

ピックアップを無効にする

ピックアップは無効であることを視覚的に示す必要があります - 一般的な方法は、少し透明にすることです。

  1. スクリプトの先頭に3つの定数を宣言します(各値はお好みに応じて調整してください):

    • ENABLED_TRANSPARENCY = 0.4
    • DISABLED_TRANSPARENCY = 0.9
    • COOLDOWN = 10
    local MAX_HEALTH = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. onTouchHealthPickupのif文内で、ピックアップのTransparencyDISABLED_TRANSPARENCYに設定し、Enabled属性の値をfalseに設定します。

    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)
    end
    end
    end
  3. task.wait()関数を呼び出し、待機する時間としてCOOLDOWNを渡します。

  4. TransparencyENABLED_TRANSPARENCYに戻し、Enabledtrueに戻します。

    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

ピックアップを再度テストしてください。ピックアップに触れると、ヘルスが回復し、透明になり、再び使用できるようになります。

ピックアップが収集されたときにプレイヤーに対するフィードバックをよりインパクトのあるものにしたい場合は、透明度を変更するときにピックアップ内の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
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。