ツール(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回 ~鍵を拾ってドアを開ける~”
コメントを残す
コメントを投稿するにはログインしてください。
textlabelの文字を左寄せにする方法ってありますか?
TextLabelのTextXAignmentをLeftに設定します。
ありがとうございます!
パーツに触れたらServerStorageのツールがプレイヤーの所持品になるようにするにはどうすればいいですか?
こういう感じになります。
local tool = ServerStotage.Tool:Clone()
tool.Parent = player.Backpack
もちろん、すでにそのツールを持っているかを判断しないと無数のツールをゲットしてしまいますのでそれらの処理も必要になります。
https://roblox-jp.com/reference/tool/
教えてください!プログラミング講座【入門編】第20回~鍵を拾ってドアを開ける~の説明では、keyを挿入すると、StarterPackにkeyが挿入されるとありますが、ワークスペースの3つ下にkeyが出てきます。このまま作業を進めても大丈夫なのでしょうか
ToolになっていないアセットはそのままWorkspaceに入ります。よってそれは使用できません。
この動画ではToolになっている鍵を使用していますので、アセット追加時に「StarterPackに入れますか?」とメッセージが表示されるものを見つけてください。
ちなみにToolは作ることができます。下記のページに掲載していますのでチャレンジしてみるのもいいでしょう。
https://roblox-jp.com/reference/create-tool/
返信ありがとうございます。ツールボックスの検索の中からどうすれば、たくさんのk中からtoolになっているkeyだということがわかるのですか?
残念ながら、追加してみるまでは分かりませんね。
そうでしたか。わかりました。あれこれ試してみます!わかりやすい動画や解説ありがとうございます
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)
実際に上記のプログラムを入力して実行してみましたが正常に動作しました。
よってプログラムには問題はないようですね。
うまくいかないとのことですが、実際にどのようになるのでしょうか?
最後のスクリプトが実装しません。
— ドアを閉じる処理
task.wait(3) — ドアを閉じるまでの時間を待つ
door.CanCollide = true
door.Transparency = 0
open = false — ドアが閉まっている状態に戻す
ドアが一度開くと再出現してくれないのです。
原因がわかりません。おしえてください
もしかして。Part の Anchored が false になっているとかはありませんか?
Anchored が false になっていると、CanCollide を false にした瞬間にPartが下に落下し自動消滅してしまいます。
このような場合は、print 文を入れたり、実行中に Workspace の中を覗いて見たりすると原因が掴めることがあります。