3-2 if/then の練習ートラップ

トラップは、多くの Roblox ゲームで使われています。これは、if ステートメントを使用して簡単に作成できます。このスクリプトは、パーツがプレイヤーに触れているかどうかを確認し、触れている場合は体力を 0 に設定します。

触れると絶命するパーツの作成

この特殊なパーツは、あらゆるゲームプロジェクトで使用可能です。特にアスレチックゲーム(オビー)のようなものには必須の要素です。

パーツとスクリプトの作成

そのパーツに触れると危ないと思わせるような色や素材にしてください。燃えるような赤でも構いません。Neonというマテリアルも面白いかもしれません。プログラムは、いくつかの基本的な変数と、触れたものが何なのかをチェックする関数から始まります。

  1. トラップ パーツを作成して名前を付けます。そのパーツに「TrapScript」 という名前のスクリプトを追加します。
  1. スクリプトにコメントを入れ説明文を入力します。スクリプトの親、つまりTrapPartを変数に入れておきます。
-- この部分にプレイヤーが触れると、体力が0になる

local trapPart = script.Parent
  1. otherPartという名前のパラメータを持つonTouch()関数を作成します。
-- この部分にプレイヤーが触れると、体力が0になる

local trapPart = script.Parent

local function onTouch(otherPart)

end
  1. 作成した関数を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 という名称のオブジェクトを探すということでも問題ないので、こちらでも構いません。

  1. onTouch ()で、「local character = otherPart.Parent」と入力します。
    トラップパーツにプレーヤーの手足が触れている可能性があります。その手足の親はキャラクターモデルになります。キャラクターモデルの子供の中にHumanoidが見つかれば、それはプレイヤーだということがわかります。
    これで、characterにはキャラクターモデルが入ります。(キャラクターモデルではない場合もありますが)
local function onTouch(otherPart)
    local character = otherPart.Parent
end
  1. 次に、「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 文を使用します。

  1. 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
  1. if 文内に、print を追加してコードを確認します。
    if humanoid then
        print("A player has touched the part")
    end
  1. コードを実行して、プレーヤーがパーツに触れるたびに表示されることを確認します。

プレイヤーの体力を変更する

if 文が真になった場合、Humanoidオブジェクトにあるプロパティ「Health」を0に設定すると絶命します。humanoid変数には、Humanoidオブジェクトが入っていますので操作は簡単です。

  1. thenとendの間に、 「humanoid.Health = 0」と入力します。
if humanoid then
    print("A player has touched the part")
    humanoid.Health = 0
end
  1. テスト実行して、プレイヤーをこのパーツに触れさせてみましょう。絶命すれば成功です。

トラブルシューティング

そのトラップが意図した通りに機能しない場合は、以下の項目をチェックしてください。

  • すべての変数が一致していることを確認してください。半角英字、大文字の区別は大丈夫ですか?
  • 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が減っていく可能性が高いのです。次のレッスンにチャレンジすると、プレイヤーの体力を減らす量をコントロールできるようになるでしょう。

コメントを残す