致命的な溶岩では、ユーザーの行動に基づいてコードをトリガーする方法を学びました。このチュートリアルでは、ユーザーが乗ると消えるプラットフォームを作成する方法をお教えします。
設定
致命的な溶岩をフォローした場合、ユーザーがジャンプできない溶岩の床の上にフェードするプラットフォームを置くことができます。
パーツを挿入し、世界の中に移動させて配置します。名前を FadingPlatform にします。
ユーザーがその上にジャンプできるようにサイズを調整します。
アンカーを設定してください。

パーツの中にスクリプトを挿入し、名前をFadeOnTouchに変更し、デフォルトコードを削除します。

プラットフォームの変数を作成し、プラットフォームのTouchedイベントに接続された空の関数を作成します。
local platform = script.Parentlocal function fade()endplatform.Touched:Connect(fade)
プラットフォームをフェードさせる
プラットフォームが瞬時に消えてしまうと、ユーザーはその隙間を越えるのが不可能になり、まったく楽しくありません。代わりに、プラットフォームはユーザーが落ちる前にフェードアウトする必要があります。そうすることで、ユーザーは跳び降りるチャンスを得ます。
Transparencyプロパティを変更し、非常に短い時間待って繰り返すことでこの効果を得ることができますが、徐々にフェードさせるには、0から1の間で少なくとも10回の変更が必要です。それには非常に繰り返しの多い20行のコードが必要になります。
これをより効果的に達成するには、特定の回数だけコードを繰り返すforループを使用します。コードの各繰り返しを反復と呼びます。forループは、コンマで区切られた3つの要素で定義されます:

- 制御変数 - ループを数えるために作成および使用される変数。この例ではcountで、開始値は1です。
- 終了値 - ループが停止するために到達する必要がある値。この例では10です。
- ステップ増分(オプション)- 各ループで制御変数に何を加えるかを決定します。省略すると、デフォルトは1になるため、この例では不要です。
FadeOnTouch内:
指定された1から始まる forループを作成し、10回繰り返します。
forループの中で、Transparencyプロパティを制御変数を10で割った値に設定します。
task.wait()関数を呼び出し、時間を0.1に設定します。
local platform = script.Parentlocal function fade()for count = 1, 10 doplatform.Transparency = count / 10task.wait(0.1)endendplatform.Touched:Connect(fade)
ループが実行されると、各反復ごとにcountが1ずつ増加します。これは、プラットフォームのTransparencyが0.1ずつ増加し、1秒後に完全に透明になることを意味します。
再出現
プラットフォームが消えると、ユーザーはその下を落下する必要があります。プラットフォームは、フェードした後に数秒後に再出現するべきです。さもなくば、ユーザーは失敗した場合、再びジャンプを試すことができなくなります。CanCollideプロパティは、ユーザーがパーツを通り抜けることができるかどうかを制御します。
forループの後で、プラットフォームのCanCollideプロパティをfalseに設定します。
task.wait()関数を使って数秒間待ちます。
CanCollideプロパティをtrueに戻します。
Transparencyプロパティを0に戻します。
local platform = script.Parentlocal function fade()for count = 1, 10 doplatform.Transparency = count / 10task.wait(0.1)endplatform.CanCollide = falsetask.wait(3)platform.CanCollide = trueplatform.Transparency = 0endplatform.Touched:Connect(fade)
デバウンス変数
致命的な溶岩では、ユーザーの体の一部がパーツに触れるたびにTouchedイベントが実行されることを学びました。この動作は、ユーザーがフェードプラットフォームを走り抜けるときに問題を引き起こします。関数は複数回実行され、毎回ループをリセットしてしまいます。
コードが正しく機能するためには、関数はユーザーがプラットフォームに初めて触れたときにのみ1回だけ実行されるべきです。アクションが本来複数回トリガーされるところで1回だけトリガーされるようにすることをデバウンスと呼びます。
デバウンス関数を行うには、boolean変数を使用してプラットフォームがすでに触れられたかどうかを追跡できます。ブール値はtrueまたはfalseの値のみを含めることができます。isTouchedという変数を作成し、falseに設定します。
local platform = script.Parent
local isTouched = false
local function fade()
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
end
platform.Touched:Connect(fade)
変数を確認する
if文を使って、isTouchedデバウンス変数がfalseのときのみフェード関数のコードを実行できます。フェード関数の本体をif文でラップし、条件をnot isTouchedとします。
local platform = script.Parent
local isTouched = false
local function fade()
if not isTouched then
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
end
end
platform.Touched:Connect(fade)
Luauのnot演算子は、その後に続く値を逆にします。条件的には、最初のif文は次のようなステートメントと同じ動作をします。
if not isTouched thenendif isTouched == false thenendif isTouched == nil thenend
デバウンスを切り替える
現在、fade関数内のコードは常に実行されます。なぜなら、isTouchedがfalseであり、not isTouchedがtrueになるからです。デバウンスルーチンを完成させるためには、変数の値を2箇所で切り替える必要があります。
- プラットフォームがフェードし始める前に、if文の中でisTouchedをtrueに設定します。
- プラットフォームが再出現した後、再びfalseに設定します。
local function fade()
if not isTouched then
isTouched = true
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
isTouched = false
end
end
platform.Touched:Connect(fade)
これで完了です!コードをテストしてみてください。ユーザーが跳び乗ったとき、プラットフォームがフェードアウトし、数秒後に再出現するはずです。
このプラットフォームを広い隙間を跨いで複製し、挑戦的な障害物を作成し、フェードする速度を変更して難易度を調整できます。
最終コード
local platform = script.Parent
local isTouched = false
local function fade()
if not isTouched then
isTouched = true
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
isTouched = false
end
end
platform.Touched:Connect(fade)