👻

【Roblox】KnitというFramework利用してみた

2024/08/22に公開

はじめに

今回はKnitというFrameworkを触ってみたので共有します。

Knitを知ったきっかけはROBLOX MEET UP 2024/07/27で登壇された株式会社moze様の発表になります。
https://peatix.com/event/4042114/view?k=d210bb990af152b2a613c9998c8009e3c3f03daa

https://zenn.dev/p/moze_ai

https://note.com/moze_inc/n/n41188b6e5658

こういった交流会のおかげでいろいろな情報共有ができるのでとても楽しいですね。

公式サイト

https://github.com/Sleitnick/Knit

触ってみる

Knitを配置

以下のリンクからKnitを取得
https://create.roblox.com/store/asset/5530714855/Knit?viewFromStudio=true&keyword=&searchId=abb4cc4c-b810-43e7-abea-3925c4bad3c2

挿入したら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に当たるとそのイベントの購読をクライアントでもできるようになっていることが確認できます。

実行

https://youtu.be/AKNf1aKI7WI

Landelテックブログ

Discussion