基本スクリプトのチュートリアルでは、プレイ可能なシーンを作成するために個々のパーツをスクリプトしました。前の方法では、パーツを複製すると、スクリプトも複製されます。これにより、スクリプトの更新が面倒になり、変更がスクリプトごとに行われなければならないためです。
このチュートリアルでは、単一のスクリプトのみを使用して健康ピックアップの数を作成する別のパターンが使用され、健康ピックアップの動作を決定するスクリプトのコピーが 1 つだけ使用されます。ピックアップがタッチされると、プレイヤーの体力が回復し、少し薄くなり、短い期間停止します。
設定する
まず、ピックアップとして使用するパーツまたはモデルが必要です。The ショーダウンタウンの例の世界 には、マップ全体に広がる多くの健康ピックアップが含まれています。

各ヘルスピックアップは、内部に緑のポイントライトがある2つの長方形のパーツのユニオンです。すべては ヘルスピックアップ というワークスペースの 1つのフォルダに保存され、スクリプトがそれらを検索する場所です。マップにさらに追加する場合は、このフォルダにも保存されることを確認する必要があります。


健康を回復する
まず、スクリプトはプレイヤーの健康を回復する必要があります。このパターンは、死の溶岩 チュートリアルから熟知しているべきです。
In ServerScriptService で、 PickupManager というスクリプトを追加します。
このスクリプトでは、値 MAX_HEALTH で宣言された定数 **** を宣言します。
ピックアップに触れ、ピックアップそのものを触った他のパーツのパラメータを持つ関数 onTouchHealthPickup を作成します。
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)end機能では、 の親からキャラクタモデルを取得します。次に、 を使用しているかどうかをチェックします。
人形がある場合は、 体力 プロパティを 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 スクリプトを一時停止し、読み込み時に HealthPickups フォルダを取得するために使用できます。
フォルダに呼び出されると、GetChildren 関数は、フォルダのコンテンツのアレイを返します。
MAX_HEALTH の下で、変数 healthPickupsFolder を宣言し、WaitForChild 関数を使用してワークスペースから HealthPickups フォルダを取得します。
変数 healthPickups を作成して、結果を GetChildren 関数を呼び出す healthPickupsFolder に保存する。
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 ループを使用してアレイの各要素を通過するために使用できる関数です。ループが始まり終わる場所を指定する必要はありません。A for ループを使用する ipairs は次のように定義されます:
- インデックス : これは、通常の for ループでの制御変数と同等です。
- 値 : ループが反復するにつれて、配列の各要素で満たされます。実際に含まれるものの後に値変数の名前を付けるのが良い考えです。
- 配列 : ループしたい配列が ipairs 関数に渡されます。
次のコードでは、何のためにもインデックスは必要ないので、_ で空白のままにすることができます。Create a for ループを使用して、ipairs 関数を使用して、healthPickups をパスします。
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 イベントに接続すると、健康ピックアップをTouched 関数にパスする必要があります。
for ループでは、otherPart というパラメータを持つ無名の関数にタッチイベントを接続します。
onTouchHealthPickups 関数を呼び出し、両方の otherPart パラメータと healthPickup をパスします。
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
今コードをテストして、健康ピックアップが健康を回復することがわかるはずです。最初にプレイヤーにダメージを与える必要があります-スポーンポイントの隣にある通気口に立ってみてください。
プレイヤーが回復すると、右上隅にヘルスバーが表示され、消えるべきです。
ピックアップクールダウン
現在、ピックアップは無期限にどんなプレイヤーも回復させます。ゲームでは、再び使用できる前に短いクールダウンがあると、1回だけ選択できるとより効果的でしょう。
まず、ピックアップがクールダウン期間にあるかどうかを記録する必要があります。以下のパターンは、フェードトラップからおなじみです - 今回は、ヘルスピックアップにアトリビュートを設定することで、遅延が達成されます。
for ループでは、新しい 属性 を に設定し、 に呼び出される新しい 属性 を設定します。
コードを 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 を待つ量としてパスします。
Set 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
ピックアップを再びテストする:ピックアップに触れると、体力が回復し、透明になり、再び使用できるように戻ってくることがわかるはずです。
ピックアップが収集されると、プレイヤーにより大きな影響を与えるフィードバックを作成したい場合は、透明度を変更するときにポイントライトの明るさをカットしてみてください。
自分のプロジェクトでこれらの健康ピックアップを使用してみたり、外観と効果を変更して、プレイヤーに異なる種類のパワーアップを提供します。
最終コード
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