タイトル「プレイヤー新規登録者を発射する」て、なんのこっちゃですね。
こんなの作っていました。
↑ 初めてgif動画埋め込んでみました。いいですね^^
なんか顔の書いた緑色の紙みたいなものがたくさん発射されていますね。
これ、Robloxにリアルタイムで新規登録された人の情報(顔と名前)らしいです!
すごい勢いでロブロックスのプレイヤー登録者(アカウント登録者)が増えている様子がわかります。世界中から登録されてるんでしょうね!すごい!
そしてゲーム開発側からそんな情報も取得できるんですね。
元にしたスクリプト
公開されているこちらのスクリプトをカスタマイズしたとのこと。
www.roblox.com
息子くんによると、このスクリプトはリアルタイムで新規登録者が増えるスピードに処理が追い付いていないから、追いつけるように修正したとのこと。
どのようにしたかというと、非同期でどんどん関数をコールして多重処理してるんですって。
スレッドをたくさん起動して同時に処理しているということです。
息子くん作スクリプトを紹介
そのスクリプトを公開します。
「適当に作ってるからね!」とソースコードが綺麗でないことを主張してましたw
--Get ChatService local ChatService = require(game:GetService("ServerScriptService"):WaitForChild("ChatServiceRunner"):WaitForChild("ChatService")) --Wait for the channel 'All' to exist if not ChatService:GetChannel("All") then while true do local ChannelName = ChatService.ChannelAdded:Wait() if ChannelName == "All" then break end end end local function getTime() local date = os.date("!*t") return ("%02d:%02d %s"):format(((date.hour % 24) - 1) % 12 + 1, date.min, date.hour > 11 and "PM " or "AM ".."(UTC)") end --Make your speaker and have it join the 'All' channel we waited for local Welecome = ChatService:AddSpeaker("Welecome!") Welecome:JoinChannel("All") --Change data for your speaker such as name color, chat color, font, text size, and tags Welecome:SetExtraData("NameColor", Color3.fromRGB(255, 255, 0)) Welecome:SetExtraData("ChatColor", Color3.fromRGB(255, 255, 204)) MaxPos = 0 function WelecomeMessage(PlayerName) Welecome:SetExtraData("NameColor", BrickColor.Random().Color) Welecome:SayMessage("Roblox Registered! Player Name is "..PlayerName.."!", "All") for _,player in pairs(game.Players:GetChildren()) do local PlayerLogGui = player.PlayerGui:FindFirstChild("Log") local AutoScrollEnabled if PlayerLogGui then local Template = PlayerLogGui.Window.Frame.PlayerTemplate:Clone() AutoScrollEnabled = PlayerLogGui.Window.Frame.CanvasPosition.Y <= MaxPos MaxPos = MaxPos + 50 PlayerLogGui.Window.Frame.CanvasSize = UDim2.new(0,0,0,MaxPos) Template.Position = UDim2.new(0,0,0,MaxPos) Template.Visible = true Template.Parent = PlayerLogGui.Window.Frame Template.PlayerName.Text = PlayerName Template.Time.Text = getTime() else game.ReplicatedStorage.Log:Clone().Parent = player.PlayerGui PlayerLogGui = player.PlayerGui:FindFirstChild("Log") local Template = PlayerLogGui.Window.Frame.PlayerTemplate:Clone() AutoScrollEnabled = PlayerLogGui.Window.Frame.CanvasPosition.Y <= MaxPos MaxPos = MaxPos + 50 PlayerLogGui.Window.Frame.CanvasSize = UDim2.new(0,0,0,MaxPos) Template.Position = UDim2.new(0,0,0,MaxPos) Template.Visible = true Template.Parent = PlayerLogGui.Window.Frame Template.PlayerName.Text = PlayerName Template.Time.Text = getTime() end if AutoScrollEnabled then PlayerLogGui.Window.Frame.CanvasPosition = Vector2.new(0,MaxPos) end end end local f=function(x) local y,r=pcall(function()return game.Players:GetNameFromUserIdAsync(x)end) if y then return r end end local x=0 for i=30,0,-1 do print("Isolating range ("..i..")") local n=x+2^i if f(n)or f(n+1)or f(n+2)then x=n end end print("Newest user located") while wait() do spawn(function() local ox = x while wait() do local newuser = f(ox) if newuser ~= nil then print("new user: "..newuser.." (".. tostring(x) ..")") WelecomeMessage(newuser) local Panel = game.ReplicatedStorage.UserPanel:Clone() Panel.Parent = workspace Panel.UserImage.Texture = "https://www.roblox.com/headshot-thumbnail/image?userId=" .. tostring(x-1) .. "&width=420&height=420&format=png" Panel.Gui.PlayerName.Text = newuser .. " (".. tostring(x) ..")" game.Debris:AddItem(Panel,30) break end end end) x = x + 1 end
割と下の方の
while wait() do spawn(function()
が、非同期で多重起動しているところだと教えてもらいました。
function を spawn してるんですね。なるほど。
また、「Players Log」という画面は改造して作成したとのことで、これを開くと登録時刻とユーザー名を確認することができます。
最近はOSいじりとRobloxとYouTube鑑賞が主な活動の息子くん。
もうすぐ中学生なんです。
中学はN中で、入学手続き済ませました。どんな感じになるかなー。