第20回 ~鍵を拾ってドアを開ける~

ツール(Tool)の基本的な仕組みを理解します。ツールボックスにある鍵を使ってドアを開けるというプログラムを作ります。

登場する英単語

Starter Packスターターパック初めから所持するツールはここに入れる
Playersプレイヤーズgame下に位置するオブジェクト、ゲームにいるプレイヤーが入る
PlayerプレイヤーPlayers下に位置するオブジェクト、プレイヤー情報
CharacterキャラクターPlayerのプロパティ、Workspaceに表示されているキャラクターモデルが入る
Backpackバックパックプレイヤーが所持しているツールが入る場所
Handleハンドルツールに存在するパーツ

チェックポイント

  • ツール(Tool)とはプレイヤーが持つことができるアイテムのこと
  • ツールボックスに入っているツールを取得すると「Put this tool into the starter pack?」というメッセージが表示される
  • 「Yes」を選択すると「Starter Pack」に入る
  • ゲーム開始時から所持するツールは「Starter Pack」に入れる
  • 「Starter Pack」に入れられるものは「Tool」というオブジェクトのみ
  • 「No」を選択すると「Workspace」に入る
  • プレイヤーがゲームに入ると「Players」に「Player」追加される
  • さらにプレイヤーのModelは、Workspaceの方にも追加される
  • Playerのプロパティ「Character」に追加されたModelが設定される
  • Playerオブジェクトには、ユーザーIDやキャラクター名などの情報が含まれる
  • Playerの「Backpack」には、装備しているツールが入る
  • ツールを装備すると「Backpack」からアイテムが除外され、キャラクターモデルの中に移動する
  • タッチイベントは何回も呼ばれることが多いので、変数などを利用して制御する
local door = script.Parent
local touch = false

door.Touched:Connect(function(hit)
    local character = hit.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")

    if humanoid and touch == false then
        local key = character:FindFirstChild("Key")
        if key then
            touch = true
            door.CanCollide = false
            door.Transparency = 1
            wait(1)
            key:Destroy()
            door.CanCollide = true
            door.Transparency = 0
            touch = false
        end
    end
end)
  • 所持するツールは重複しないように、すでに持っているかどうかをチェックする
local keyBox = script.Parent
local clickdetector = keyBox.ClickDetector

local function checkHaveItem(player,item)
    local character = player.Character

    if character:FindFirstChild(item) then
        return true
    end
    if player.Backpack:FindFirstChild(item) then
        return true
    end 
    return false
end

clickdetector.MouseClick:Connect(function(player)
    if checkHaveItem(player,"Key") == false then
        local key = keyBox.Key
        local item = key:Clone()
        item.Parent = player.Backpack
    end
end)
14 thoughts on “第20回 ~鍵を拾ってドアを開ける~”
  1. 教えてください!プログラミング講座【入門編】第20回~鍵を拾ってドアを開ける~の説明では、keyを挿入すると、StarterPackにkeyが挿入されるとありますが、ワークスペースの3つ下にkeyが出てきます。このまま作業を進めても大丈夫なのでしょうか

    1. ToolになっていないアセットはそのままWorkspaceに入ります。よってそれは使用できません。
      この動画ではToolになっている鍵を使用していますので、アセット追加時に「StarterPackに入れますか?」とメッセージが表示されるものを見つけてください。
      ちなみにToolは作ることができます。下記のページに掲載していますのでチャレンジしてみるのもいいでしょう。
      https://roblox-jp.com/reference/create-tool/

      1. 返信ありがとうございます。ツールボックスの検索の中からどうすれば、たくさんのk中からtoolになっているkeyだということがわかるのですか?

          1. そうでしたか。わかりました。あれこれ試してみます!わかりやすい動画や解説ありがとうございます

  2. 20回の動画をみて、応用してゲームを作っているところです。
    ドアが開いて、3秒後に締まるスクリプトがうまくいきません。
    なにが原因が教えてください。

    local door = script.Parent
    local open = false
    local openTime = 1 — ドアが開いている時間(秒)
    local closeDelay = 3 — ドアが閉じるまでの時間(秒)
    door.Touched:Connect(function(hit)
    local character = hit.Parent
    local humanoid = character:FindFirstChildWhichIsA(“Humanoid”)
    — ヒューマノイドが存在し、ドアが閉まっている場合のみ処理
    if humanoid and not open then
    local key = character:FindFirstChild(“Key”)
    if key then
    print(“ドアを開けます”)
    open = true — ドアが開いている状態にする
    — ドアを透明にして通過可能にする
    door.CanCollide = false
    door.Transparency = 1
    — キーを破壊
    task.wait(openTime) — ドアが開いている時間だけ待つ
    key:Destroy()
    — ドアを閉じる処理
    task.wait(3) — ドアを閉じるまでの時間を待つ
    door.CanCollide = true
    door.Transparency = 0
    open = false — ドアが閉まっている状態に戻す
    print(“ドアを閉じます”)
    end
    end
    end)

    1. 実際に上記のプログラムを入力して実行してみましたが正常に動作しました。
      よってプログラムには問題はないようですね。
      うまくいかないとのことですが、実際にどのようになるのでしょうか?

      1. 最後のスクリプトが実装しません。
        — ドアを閉じる処理
        task.wait(3) — ドアを閉じるまでの時間を待つ
        door.CanCollide = true
        door.Transparency = 0
        open = false — ドアが閉まっている状態に戻す
        ドアが一度開くと再出現してくれないのです。
        原因がわかりません。おしえてください

        1. もしかして。Part の Anchored が false になっているとかはありませんか?
          Anchored が false になっていると、CanCollide を false にした瞬間にPartが下に落下し自動消滅してしまいます。
          このような場合は、print 文を入れたり、実行中に Workspace の中を覗いて見たりすると原因が掴めることがあります。

コメントを残す