😸
【ロブロックス】クラスとプレイヤーを紐づける方法
はじめに
先日の投稿でメタテーブルでクラスを作ったものの具体的にどのようにプレイヤーと紐づけるかちょっとわからないかもしれません。今回はそのやり方について共有します。
Playerクラス作成
ReplicatedStorage
にPlayerController
というモジュールスクリプトを作成
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などのメタ情報が簡単に取れますよね。
Playerと紐づける
ServerScriptService
にPlayerHandler
というスクリプトを作成
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が実行されたらそのプレイヤーの名前を返す。
まとめ
ユーザーの入力に関しては基本的にplayerオブジェクトが付属して送られてくるのでplayerをキーにしてプライヤークラスをとってきてそれに影響を与えてく設計になってきそうだ。
Discussion