😸

【ロブロックス】クラスとプレイヤーを紐づける方法

2024/07/14に公開

はじめに

先日の投稿でメタテーブルでクラスを作ったものの具体的にどのようにプレイヤーと紐づけるかちょっとわからないかもしれません。今回はそのやり方について共有します。

https://zenn.dev/landel_tech/articles/9d6b66a1af21ea

Playerクラス作成

ReplicatedStoragePlayerControllerというモジュールスクリプトを作成

local playerController = {}
playerController.__index = playerController

function playerController.new(player)
	local instance = setmetatable({},playerController)
	instance.player = player
	return instance
end
return playerController

instance.player = playerここでplayerオブジェクトをカスタムなプレイヤークラスに保持させます。

playerオブジェクトさえあればそこからcharacterだったり、入室時に生成するIntValueオブジェクトやNameなどのメタ情報が簡単に取れますよね。

https://create.roblox.com/docs/reference/engine/classes/Player

Playerと紐づける

ServerScriptServicePlayerHandlerというスクリプトを作成

local P = game:GetService("Players")
local RS = game:GetService("ReplicatedStorage")

local playerController = require(RS.PlayerController)

local playerTable = {}

--PlayerAddEvent
P.PlayerAdded:Connect(function(player)
	local controller = playerController.new(player)
	playerTable[player.UserId] = controller
end)

--PlayerRemoveEvent
P.PlayerRemoving:Connect(function(player)
	table.remove(playerTable, player.UserId)
end)

PlayerAddedイベントで入室したplayerと新たに生成したコントローラークラスを紐づけていく感じになります。

local playerTable = {} を作り生成と同時にこのテーブルに入れていくことでplayerをキーにしてコントローラークラスを引っ張ってきて様々な操作を行うことができます。

応用

local playerController = {}
playerController.__index = playerController

function playerController.new(player)
	local instance = setmetatable({},playerController)
	instance.player = player
    instance.name = player.Name
	return instance
end

function playerController:getName()
   return self.name
end
return playerController

instance.name = player.Nameを新たに追加しプレイヤー名をクラスに保存させgetName()関数で名前を返すようにする。

local P = game:GetService("Players")
local RS = game:GetService("ReplicatedStorage")
--RemoteFunctionを新たに作成
local sampleFunction = RS.SampleFunction
local playerController = require(RS.PlayerController)

local playerTable = {}

--PlayerAddEvent
P.PlayerAdded:Connect(function(player)
	local controller = playerController.new(player)
	playerTable[player.UserId] = controller
end)

--PlayerRemoveEvent
P.PlayerRemoving:Connect(function(player)
	table.remove(playerTable, player.UserId)
end)

--RemoteFunctionが実行されたら名前を返す
sampleFunction.OnServerInvoke = function(player)
	local controller = playerTable[player.UserId]
	return controller:getName()
end

新たにSampleFuntionというRemoteFunctionを作成しローカルからSampleFuntionが実行されたらそのプレイヤーの名前を返す。

https://zenn.dev/landel_tech/articles/715df023adb4bc

まとめ

ユーザーの入力に関しては基本的にplayerオブジェクトが付属して送られてくるのでplayerをキーにしてプライヤークラスをとってきてそれに影響を与えてく設計になってきそうだ。

Landelテックブログ

Discussion