RobloxAPIを活用したゲーム内へのガチャガチャマシーンの実装

# Robloxとは
主に海外で人気を博しているゲームプラットフォームのことであり、PCやスマホ、ゲーム機など幅広いデバイスで作成したゲームを公開、プレイできることが魅力です。
# RoBloxAPIとは
RobloxAPIとはRoblox公式がユーザーに提供するゲーム作りを快適にする様々な機能のことで、これを利用することでお手軽にゲーム内にギミックを導入することができます。
今回はそのうちのClickDetectorやRamdomAPIといったRobloxAPIを利用してゲーム内にガチャガチャマシーンを導入しようと思います。
# 作成手順
### ゲーム内にガチャガチャマシーンとなるパーツ（オブジェクト）を配置
ガチャガチャを実装したいゲームを開き画面上部のPartを押し、適当な形のパーツを配置、
次に画面右に表示されているExplorerウィンドウから先ほど配置したパーツの名前をGachaMachineに変更します。
その後ExplorerウィンドウにあるGachaMachineを右クリックしオブジェクトを挿入を押し、出てきた項目の中からRobloxAPIのひとつであるClickDetectorを選択します。
#### ⬇︎こうなっていれば正常
![スクリーンショット 2024-12-16 23.51.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963107/50f8a8e3-0c31-6d5a-ecd7-9e15e6184345.png)
### 排出されるアイテムを作成
Explorerウィンドウを右クリックしオブジェクトを挿入からToolを選択、これを４回繰り返しWorkspace内に４個のツールを生成、生成されたツールを右クリックし、オブジェクトを挿入からPartを選択して、名前をHandleに変更（このパーツの形状がツールの形状になる）。そして生成したツールの名前はそれぞれCommon,Rare,SuperRare,UltraRareとします。
最後に名前を変更したツールを全てExplorerウィンドウのSeverStorageにドラッグして入れます。
#### ⬇︎こうなっていれば正常
![スクリーンショット 2024-12-17 0.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963107/949825b1-334b-d781-cc16-6c9e55ae3f28.png)
### GachaMachineにガチャガチャとしての機能をつける。
ExplorerウィンドウのServerScriptServiceを右クリックしオブジェクトを挿入から、Scriptを選択、そうして挿入されたScriptをダブルクリックし、スクリプトを書き込みます。
#### ⬇︎書き込むスクリプト
```lua
-- 内部のアイテムと確立の設定
local GachaRewards = {
	{ Name = "コモン", Probability = 50, ItemName = "Common" },  -- 50%
	{ Name = "レア", Probability = 30, ItemName = "Rare" },      -- 30%
	{ Name = "スーパーレア", Probability = 15, ItemName = "SuperRare" }, -- 15%
	{ Name = "ウルトラレア", Probability = 5, ItemName = "UltraRare" }   -- 5%
}
--RandomAPIを利用して確立に基づいてアイテムを選択する
local function SpinGacha()
	local randomNumber = math.random(1, 100) -- 1～100の乱数生成
	local cumulative = 0
	for _, reward in pairs(GachaRewards) do
		cumulative = cumulative + reward.Probability
		if randomNumber <= cumulative then
			return reward.Name, reward.ItemName  -- アイテム名を返す
		end
	end
	return "はずれ", nil -- 保険用、アイテム名は返さない
end

-- 当選したアイテムをプレイヤーのバックパックに渡す関数
local function GiveItemToPlayer(player, itemName)
	local item = game.ServerStorage:FindFirstChild(itemName)
	if item then
		local newItem = item:Clone()  -- アイテムをServerStorageからクローンしてプレイヤーに渡す
		newItem.Parent = player.Backpack  -- プレイヤーのバックパックに追加
		print(player.Name .. " に " .. itemName .. " を渡しました。")
	else
		warn("アイテムが見つかりません: " .. itemName)
	end
end

-- ガチャガチャマシンのクリックイベント
local GachaMachine = workspace:WaitForChild("GachaMachine") -- マシンのパーツ
local ClickDetector = GachaMachine:WaitForChild("ClickDetector")

ClickDetector.MouseClick:Connect(function(player)
	local rewardName, itemName = SpinGacha()
	print(player.Name .. " がガチャで当てた: " .. rewardName)

	-- ガチャ結果に応じたツールをプレイヤーに渡す
	if itemName then
		GiveItemToPlayer(player, itemName)  -- アイテムを渡す
	end

	-- 結果を通知として送信（UIや通知に表示）
	game.ReplicatedStorage:WaitForChild("GachaResult"):FireClient(player, rewardName)
end)

```
次は当選結果をゲームプレイ中でも確認できるようにゲーム画面にも表示するようにします。
まず、サーバーから結果を受け取り、UIに表示するためExplorerウィンドウのReplicatedStorageを右クリックしオブジェクトを挿入からRemoteEventを選択、生成されたRemoteEventの名前をGachaResultに変更します。
次にExplorerウィンドウのStarterGuiを右クリックしオブジェクトを挿入から、LocalScriptを選択、そうして挿入されたLocalScriptをダブルクリックし、スクリプトを書き込みます。
#### ⬇︎書き込むスクリプト
```lua
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local GachaResultEvent = ReplicatedStorage:WaitForChild("GachaResult")

-- 結果をUIで表示
GachaResultEvent.OnClientEvent:Connect(function(reward)
	game.StarterGui:SetCore("SendNotification", {
		Title = "ガチャ結果";
		Text = "あなたが当てたアイテム: " .. reward;
		Duration = 3; -- 表示時間
	})
end)
```
### 最後に
ゲームをプレイしてみてガチャガチャマシーンをクリックし、ツールがプレイヤーのバックパックに出現したことを確認したら完成です。
これを拡張して出現したツールに機能を実装したり、プレイヤーがガチャガチャのアイテムを指定したりする機能などを入れればより完成度の高いガチャガチャが作れるでしょう。
Robloxを利用してゲームを自作したいと考えている方でガチャガチャを導入しようと考えている人がいたら、ぜひこの記事を足がかりにしてみてください。