In 死の溶岩 では、ユーザーの行動に基づいてコードをトリガーする方法を学びました。このチュートリアルでは、ユーザーがそれを踏むと消えるプラットフォームを作る方法を示します。
設定する
死の溶岩 に従った場合、消えるプラットフォームをユーザーが飛び越えることができない溶岩フロアの上に配置できます。
パーツを挿入し、ワールドに移動して名前を付けます FadingPlatform 。
ユーザーがそれに飛び乗れるようにサイズを変更します。
Make sure it's 固定されている 。
パーツに スクリプト を挿入し、名前を FadeOnTouch に変更し、デフォルトコードを削除する
プラットフォームの変数と、プラットフォームの Touched イベントに接続された空の関数を作成します。
local platform = script.Parentlocal function fade()endplatform.Touched:Connect(fade)
プラットフォームをフェードする
プラットフォームが瞬間的に消えると、ユーザーがギャップを渡るのが不可能になるため、楽しいことはありません。代わりに、プラットフォームは 消えてしまう 前にユーザーがそれを通り抜けて飛オフ降りるチャンスを与えるために消えるべきです。
Transparency プロパティを変更し、この効果を得るために非常に短い時間を何度も繰り返し待つことができますが、グラデーションは少なくとも 0 から 1 の間で 10 回の変更が必要になります。それは非常に繰り返し的なコードの 20 行です。
これは、特定の数回コードを繰り返す for ループを使用することで、より効果的に達成できます。コードの各ループは、 反復 と呼ばれます。ループ A は、セミコロンで区切られた 3つのもので定義されます:
- コントロール変数 - ループをカウントするために作成され、使用される変数。この例では、それは count であり、開始値は 1 です。
- 終了値 - ループを停止するために取得する値。この例では、10です。
- ステップ増加 (オプション) - 各ループでコントロール変数に追加するものを決定します。省略すると、デフォルトで 1 に設定されるので、この例では不必要です。
In タッチでフェード :
機能では、for ループを作成し、1 から始まる、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)
ループが実行されると、各回転ごとにカウントが 1 増加します。これは、プラットフォームの Transparency が 0.1 秒ごとに 0.1 増加し、1秒後に完全な透明度に達することを意味します。
リアパーする
プラットフォームが消えた後、ユーザーはそれを通り抜けるべきです。プラットフォームは、消えた後数秒戻ってくるべきでもあります - そうでなければ、ユーザーは失敗した場合、ジャンプを再試行することがありません。CanCollide プロパティは、ユーザーがパーツを通り抜けることができるかどうかを制御します。
プラットフォームの CanCollide プロパティを、for ループの後に 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)
デバウンス変数
In 死の溶岩 では、ユーザーの身体部分がパーツと接触するたびに Touched イベントが実行されることを学びました。この動作は、ユーザーが薄くなるプラットフォームを横断すると問題が発生します:機能は複数回実行され、それぞれループをリセットします。
コードが適切に機能するには、ユーザーがプラットフォームを初めて触ったときにのみ、機能は 1回だけ実行する必要があります。アクションが通常複数回トリガーされるのではなく、1回だけトリガーされるようにすることを「 デバウンス 」と呼びます。
機能を遅延させるには、ブール 変数を使用して、プラットフォームがすでにタッチされた時を追跡できます。ブールは 真 と 偽 の値のみを含めることができます。変数 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 場所で切り替える必要があります。
- プラットフォームが消失する前に、isTouched を true 文の内部に設定し、プラットフォームが消失する前に、if 文を設定します。
- プラットフォームが再出現したら、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)