トラップは、多くの Roblox ゲームで使われています。これは、if ステートメントを使用して簡単に作成できます。このスクリプトは、パーツがプレイヤーに触れているかどうかを確認し、触れている場合は体力を 0 に設定します。
触れると絶命するパーツの作成
この特殊なパーツは、あらゆるゲームプロジェクトで使用可能です。特にアスレチックゲーム(オビー)のようなものには必須の要素です。
パーツとスクリプトの作成
そのパーツに触れると危ないと思わせるような色や素材にしてください。燃えるような赤でも構いません。Neonというマテリアルも面白いかもしれません。プログラムは、いくつかの基本的な変数と、触れたものが何なのかをチェックする関数から始まります。
- トラップ パーツを作成して名前を付けます。そのパーツに「TrapScript」 という名前のスクリプトを追加します。
- スクリプトにコメントを入れ説明文を入力します。スクリプトの親、つまりTrapPartを変数に入れておきます。
-- この部分にプレイヤーが触れると、体力が0になる
local trapPart = script.Parent
- otherPartという名前のパラメータを持つonTouch()関数を作成します。
-- この部分にプレイヤーが触れると、体力が0になる
local trapPart = script.Parent
local function onTouch(otherPart)
end
- 作成した関数をTrapPartのTouchedイベントに接続して、何かがパーツに触れるたびに実行されるようにします。
local function onTouch(otherPart)
end
trapPart.Touched:Connect(onTouch)
プレイヤーが触れたのかを確認する
パラメータotherPartには、このパーツに触れたオブジェクトが入りますが、それはプレーヤーの一部であるか、Baseplateである可能性があります。以前、パーツを空中に配置しましたが、これはBaseplateが触れては困るからです。if 文が使えるようになれば、パーツの種類を判断できるようになりますので、今回はBaseplateに触れても大丈夫です。
このトラップがプレイヤーの体力を奪うようにするには、if/then ステートメントを使用して、otherPartの親の子供の中にHumanoidオブジェクトが含まれているかどうかを確認します。otherPartの兄弟の中にHumanoidがあるかどうか、という意味にもなります。
Humanoidオブジェクトは、Roblox のプレイヤーのためにさまざまな情報を保存しています。その属性の1つにHealth(体力)があり、この値に0を入れることで絶命します。
特定のオブジェクトを見つける
特定のオブジェクトを見つけるには、オブジェクトのメソッド(関数の一種)にある FindFirstChildWhichIsA() を使用します。これを使うことで、その子供の中から、特定タイプのオブジェクトを探すことができます。Humanoidタイプのオブジェクトを探すのに便利です。また、FindFirstChild() というメソッドもあります。これはオブジェクトの名前を探し出すものです。Humanoid という名称のオブジェクトを探すということでも問題ないので、こちらでも構いません。
- onTouch ()で、「local character = otherPart.Parent」と入力します。
トラップパーツにプレーヤーの手足が触れている可能性があります。その手足の親はキャラクターモデルになります。キャラクターモデルの子供の中にHumanoidが見つかれば、それはプレイヤーだということがわかります。
これで、characterにはキャラクターモデルが入ります。(キャラクターモデルではない場合もありますが)
local function onTouch(otherPart)
local character = otherPart.Parent
end
- 次に、「local humanoid = character:FindFirstChildWhichIsA(“Humanoid”)」と入力します。
キャラクターモデルの子供の中にHumanoidタイプのオブジェクトが入っていた場合は、それが humanoid 変数に入ります。入っていない場合は nil が入ります。
local function onTouch(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
end
if文で確認する
Humanoidオブジェクトがその変数に入っているかどうかを調べるには、if 文を使用します。
- Humanoidオブジェクトが入っていると、「humanoid」は「真」になりますので、if 文内のプログラムを実行します。「if humanoid ~= nil」とも書けます。「nil」は「空(から)」を示すキーワードで、『空ではなかったら」という意味になります。
local function onTouch(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
end
end
- if 文内に、print を追加してコードを確認します。
if humanoid then
print("A player has touched the part")
end
- コードを実行して、プレーヤーがパーツに触れるたびに表示されることを確認します。
プレイヤーの体力を変更する
if 文が真になった場合、Humanoidオブジェクトにあるプロパティ「Health」を0に設定すると絶命します。humanoid変数には、Humanoidオブジェクトが入っていますので操作は簡単です。
- thenとendの間に、 「humanoid.Health = 0」と入力します。
if humanoid then
print("A player has touched the part")
humanoid.Health = 0
end
- テスト実行して、プレイヤーをこのパーツに触れさせてみましょう。絶命すれば成功です。
トラブルシューティング
そのトラップが意図した通りに機能しない場合は、以下の項目をチェックしてください。
- すべての変数が一致していることを確認してください。半角英字、大文字の区別は大丈夫ですか?
- endは2つ登場します。1 つは if/then ステートメント用で、もう 1 つは onTouch 関数用です。
完成したプログラム
-- プレイヤーがパーツに触れると絶命するプログラム
-- パーツにアクセスしやすいようにする
local trap = script.Parent
-- Humanoidの有無をチェックする
local function onTouch(otherPart)
-- otherPart の親を代入(プレイヤーモデルを想定)
local character = otherPart.Parent
-- プレイヤーモデルの子供の中にHumanoidタイプのオブジェクトを探す
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 体力を0にする
humanoid.Health = 0
end
end
-- Touched イベントを onTouch に接続する
trap.Touched:Connect(onTouch)
まとめ
このトラップ・パーツは条件を使ってHumanoidのパーツを検出し、HumanoidのHealthを0にします。しかし、まだいくつかの欠点があります。Humanoidはプレイヤーの中だけにあるものではありません。HumanoidはNPCにもあるでしょう。また、このスクリプトはプレイヤーの体力をゼロにすることしかできません。少しだけHealthを減らすことは試せますが、想定されるよりも早くHealthが減っていく可能性が高いのです。次のレッスンにチャレンジすると、プレイヤーの体力を減らす量をコントロールできるようになるでしょう。
[ 3-1 If 文の概要 ]