基本的なスクリプトのチュートリアルでは、プレイ可能なシーンを作成するために個々のパーツをスクリプト化します。以前のメソッドでは、パーツを複製するとスクリプトが複製されるため、スクリプトを更新するのが面倒になります。これは、スクリプトをスクリプトごとに更新する必要があるため、スクリプトを更新しているのが面倒になる可能性があります。
このチュートリアルでは、スクリプトのコピーのみを使用して、複数のヘルスピックアップを作成し、健康ピックアップの動作を決定するための 1つのコピーのみを使用します。ピックアップをタッチすると、プレイヤーの健康が回復し、わずかな間、無効になります。
セットアップ
まず、ピックアップとして使用するパーツまたはモデルが必要です。ショーダウンタウンの例ワールドには、マップ全体に散らばっている多くのヘルスピックアップが含まれています。
それぞれの体力のピックアップは、緑のポイントライトを含む正方形の 2つのパーツのユニオンです。それらはすべて HealthPickups というワークスペースの 1つのフォルダに保存されます。スクリプトがマップに追加されると、このフォルダ内のすべてを確認することは必須です。
体力を回復
まず、スクリプトはプレイヤーの健康を回復する必要があります。このパターンは、Deadly Lava チュートリアルからおなじみです。
In ServerScriptService で、 PickupManager というスクリプトを追加します。
このスクリプトで、MAX_HEALTH というコンストラクトを 100 で宣言します。
onTouchHealthPickup を呼び出す関数を作成し、ピックアップとそのピックアップ自体に対するパラメーターを持つ。
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)end関数で、otherPart の親からキャラクターモデルを取得します。次に、Humanoid を使用して、FindFirstChildWhichIsA() を持っているかどうかをチェックします。
人形がある場合は、健康 プロパティを 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 機能を使用して、ワークスペースから 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 ループは次のように定義されています:
- インデックス : これは、ループのコントロール変数と同等です。
- 値値 : ループが反復するたびにアレイの各要素によって埋められます。値変数の名前を指定するのが良いです。
- Array : 要素配列は、ipairs 関数に渡されます。
次のコードでは、インデックスは何も必要ないので、_ で空のままにしておくことができます。 for ループを使用して、ipairs をパスして、1> ipairs1> 機能を使用して、4>空の4>コードを作成します。
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 イベントにヘルスピックアップをパスする必要があります。
In the for loop, connect the Touched event to an anonymous function with a parameter called otherPart .
コールする onTouchHealthPickups 関数、otherPart パラメーターとhealthPickup を通り抜けます。
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
今すぐコードをテストして、健康ピックアップがあなたの健康を回復することを確認してください。まず、あなたのプレイヤーにダメージを与える必要があります - スポーンポイントの隣にある通気口に立ってください。
プレイヤーが回復すると消えるトップ右のヘルスバー。
ピックアップのクールダウン
現在、ピックアップはそれを触ったプレイヤーを無期限で癒します。ゲームでは、1度だけを癒せる、短いクールダウンがある場合、再び使用できるようになることがより効果的です。
まず、ピックアップがクールダウン期間にあるかどうかを記録する必要があります。下のパターンは、フェイディングトラップ - この時、デバウンスは、健康ピックアップにアトリビュートを設定することで達成されます。
In the for loop, set a new 属性 called "Enabled" to true .
ラップコード内 onTouchHealthPickup 内の if 文でコンディション healthPickup:GetAttribute("Enabled") でコードをラップします。
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")In the if statement in onTouchHealthPickup , set the Transparency of the pickup to DISABLED_TRANSPARENCY , and the value of the 1> Enabled1> attribute to 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)endendendコール task.wait() 関数、COOLDOWN を待つ量として扱います。
Transparency を ENABLED_TRANSPARENCY と Enabled に戻し、1>true1> に戻します。
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