👻
【Roblox】KnitというFramework利用してみた
はじめに
今回はKnitというFrameworkを触ってみたので共有します。
Knitを知ったきっかけはROBLOX MEET UP 2024/07/27で登壇された株式会社moze様の発表になります。
こういった交流会のおかげでいろいろな情報共有ができるのでとても楽しいですね。
公式サイト
触ってみる
Knitを配置
以下のリンクからKnitを取得
挿入したらWaorkspaceにPackagesというフォルダが配置されるのでそれをReplicatedStorage
に配置
必要オブジェクトの配置
当たり判定のPartを配置
コード
サーバーサイドのエントリーポイントを配置
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Knit = require(ReplicatedStorage.Packages.Knit)
for _,v in ipairs(ServerStorage:GetDescendants()) do
if v:IsA("ModuleScript") and v.Name:match("Service$") then
require(v)
end
end
Knit.Start():andThen(function()
print("Knit Server started")
end):catch(warn)
ゲームの一部システムの配置
ModuleScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Knit = require(ReplicatedStorage.Packages.Knit)
local testPart = workspace.TestPart
local TestService = Knit.CreateService {
Name = "TestService",
Client = {
CountChanged = Knit.CreateSignal(),
},
_TestPerPlayer = {},
}
function TestService.Client:GetCount(player : Player)
return self.Server:GetCount(player)
end
function TestService:GetCount(player : Player): number
return self._TestPerPlayer[player]
end
function TestService:AddCount(player : Player)
local currentCount = self:GetCount(player) or 0
local nextCount = currentCount + 1
self._TestPerPlayer[player] = nextCount
self.Client.CountChanged:Fire(player, nextCount)
end
function TestService:KnitStart()
testPart.Touched:Connect(function(hit)
local player = game.Players:GetPlayerFromCharacter(hit.Parent)
if player then
self:AddCount(player)
end
end)
print("TestService : KnitStart")
end
function TestService:KnitInit()
Players.PlayerRemoving:Connect(function(player)
self._TestPerPlayer[player] = nil
end)
print("TestService : KnitInit")
end
return TestService
クライアントのエントリーポイント配置
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Knit = require(ReplicatedStorage.Packages.Knit)
for _,v in ipairs(ReplicatedStorage:GetDescendants()) do
if v:IsA("ModuleScript") and v.Name:match("Controller$") then
require(v)
end
end
Knit.Start({}):andThen(function()
print("Knit Client started")
end):catch(warn)
サーバーとクライアントの中継をするシステムの配置
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Knit = require(ReplicatedStorage.Packages.Knit)
local TestController = Knit.CreateController {
Name = "TestController",
}
function TestController:KnitStart()
local function ObserveCount(count)
print("Count changed to ", count)
end
local TestService = Knit.GetService("TestService")
TestService:GetCount():andThen(ObserveCount):andThen(function()
TestService.CountChanged:Connect(ObserveCount)
end)
end
function TestController:KnitInit()
print("TestController : Init")
end
return TestController
以上の実装でworkspace上にあるTestPartに当たるとそのイベントの購読をクライアントでもできるようになっていることが確認できます。
実行
Discussion