剣や銃など、手に持って動作するものをToolと言います。ツール制作はかなり難しいのですが、最も基本的なことだけを書いておきます。
- WorkspaceにToolを追加します。
- Toolの中にPartを入れます。
- Partの名称をHandleに変えます。
- ToolをStarterPackに移動します。
これだけでPartがツールになります。ツールを複数のPartで構成したい場合は、それぞれのPartをWeldConstraintで繋げる必要があります。すべてのPartのAnchoredは必ずオフにしてください。
プログラムを書く
Toolには、サーバーで動作するScriptと、クライアントで動作するLocalScriptの2つを使うことができます。下記のプログラムで動作チェックをしてみてください。
- ToolにScriptを挿入します。(サーバーで動作するプログラム)
- さらに RemoteEventを入れます。(マウスクリックなどでサーバーで処理する場合)
local tool = script.Parent
-- クライアントから、FireServer で呼ばれる
tool.RemoteEvent.OnServerEvent:Connect(function(player,hit)
print(hit)
end)
-- ツールを装備した状態でマウスダウンで呼ばれる
tool.Activated:Connect(function()
print("マウスダウン(サーバー)")
end)
-- ツールを装備した状態でマウスアップで呼ばれる
tool.Deactivated:Connect(function()
print("マウスアップ(サーバー)")
end)
-- ツールを装備したら呼ばれる
tool.Equipped:Connect(function(mouse)
mouse.Button1Down:Connect(function() -- ←当然サーバーでは呼ばれません!
-- マウス操作はクライアントで行うこと
print(tostring(mouse.Hit.Position).."(サーバー)")
end)
print("ツールを装備する(サーバー)")
end)
-- ツールを外したら呼ばれる
tool.Unequipped:Connect(function()
print("ツールを外す(サーバー)")
end)
- ToolにLocalScriptを挿入します。(クライアントで動作するプログラム)
local tool = script.Parent
-- ツールを装備した状態でマウスダウンで呼ばれる
tool.Activated:Connect(function()
print("マウスダウン(クライアント)")
end)
-- ツールを装備した状態でマウスアップで呼ばれる
tool.Deactivated:Connect(function()
print("マウスアップ(クライアント)")
end)
-- ツールを装備したら呼ばれる
tool.Equipped:Connect(function(mouse)
mouse.Button1Down:Connect(function() -- このイベントはツールを外すと自動的に解除される
-- サーバーの方で何かしたい場合は、RemoteEvent(FireServer)を使う
tool.RemoteEvent:FireServer(mouse.Hit) -- OnServerEvent に接続された関数が呼ばれる
print((tostring(mouse.Hit).."(クライアント)"))
end)
print("ツールを装備する(クライアント)")
end)
-- ツールを外したら呼ばれる
tool.Unequipped:Connect(function()
print("ツールを外す(クライアント)")
end)
Activated でのマウスクリック処理
上記のサンプルでは、Equipped の中でマウスクリックを処理していましたが、Activated イベントを使用することもできます。Activated イベントは、ツールを装備した状態でクリック(タップ)されると発生するものです。
Button1Down イベントは、パラメータで mouse が渡されましたが、Activated イベントにはそれがないので、player の GetMouse() を使って、mouse 情報を取得する必要があります。mouse のプロパティについては、デバイスからの入力の投稿をご覧ください。
tool.Activated:Connect(function()
-- Toolを使用しているPlayerのMouseを取得
local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
-- Mouseが指しているパーツを取得
local clickedPart = mouse.Target
if clickedPart then
print("クリックしたパーツ:" .. clickedPart.Name)
else
print("パーツがクリックされていない")
end
end)
バックパックのUIを表示させない方法
バックパックのアイコンは自動的に表示されます。これを表示したくない場合は、StarterGui または、StarterPlayer の StarterPlayerScripts に LocalScript を追加し、下記のプログラムを入れると表示されなくなります。この場合、ツールの装備・非装備は、プログラムで行わなくてはなりませんのでご注意ください。
local CoreGui = game:GetService("StarterGui")
CoreGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false)
初めまして。
質問なのですが、ツールをHandle無しで作るにはどうすれば良いでしょうか。
他の人のゲームをプレイしていて気になりました。
ご回答よろしくお願いします。
Handleなしだとイベントが発生しないようですね。
HandleのTransparencyを1にして、透明にしてはどうでしょうか。
ご回答ありがとうございます。
しつこいですが、もう一つ質問させてください。
「Toolを持つと腕が上がる動作」を無効にすることはできるのでしょうか。
こちらの動画が参考になると思いますのでお試しください。
https://www.youtube.com/watch?v=opRJ0Jm_dNc