🤖

Udemy講座『クリスタル採掘シミュレーター』より学んだこと

に公開

FindFirstChildOfClassを使うとクラスが持っているメソッドなどを使えて便利

local tool = script.Parent

tool.Activated:Connect(function()
    local chara = tool.Parent

    -- このようにするとHealthなどが予測で出るようになる
    local humanoid = chara:FindFirstChildOfClass("Humanoid")
    humanoid.Health

    -- このようにするとHumanoidが持っているものを使うことはできるが予測には表示されない
    local humanoid = chara:FindFirstChild("Humanoid")
    humanoid.Health
end)

Sizeは数字を一つだけ指定するとその立方体になる

例:Sizeに4を入力
→ 4, 4, 4のサイズになる

型の指定

local model : Model = hit.Parent

HPの管理

属性(Attribute)から取得、変更

local hp = crystal:GetAttribute("HP")
hp -= 1
crystal:SetAttribute("HP", hp)
local maxHP = crystal:GetAttribute("MaxHP")
crystal:SetAttribute("HP", maxHP)

モデルを隠す(また元の位置で使う想定)

model.Parent = game.ServerStorage
wait(5)
model.Parent = workspace

クライアントで音を鳴らす

  1. Scriptでイベントを発火
game.ReplicatedStorage.RemoteEvent:FireClient(player, game.SoundService.GetCoin)
  1. ReplicatedStorageにRemoteEventを入れておくとRemoteEventが中継してくれる
  2. StarterPlayer > StarterPlayerScript にLocalScriptを追加
local remoteEvent = game.ReplicatedStorage.RemoteEvent

remoteEvent.OnClientEvent:Connect(function(se : Sound) 
    se:Play()	
end)

同じスクリプトを複数の場所で使う際の管理法

結論:パッケージ化する

共通化したいものを右クリックして「パッケージに公開」
パッケージにしたものをコピーして適宜配置
その前にPackageLink > AutoUpdate をEnableにすると自動更新されるようになる
スクリプトの場合は修正したら、同じく「パッケージに公開」で更新できる

パッケージ化の注意点

属性を変更してもAutoUpdateに引っかからない
ただし、他のものを変更して公開すると、属性の変更を反映されるので注意

ReplicatedStrageにはクライアントでもサーバーでも使うものを置く

例:BagData
クライアントのGUI表示にも使うし、バッグの容量をサーバー側で参照したりもする

GUIが設定したものよりも少し下がって表示される

デフォルトだとRobloxの左上にあるメニュー分GUIが下がって表示される仕様があるので以下を設定する
ScreenGui > IgnoreGuiInset を Enableに変更

LocalScriptでプレイヤーを取得

-- LocalScript上ではこのコードだけで取れる
local player = game.Players.LocalPlayer

セーブできるようにする

ゲーム設定 > セキュリティ > StudioのAPIサービスへのアクセスを有効化 を Enable

セーブ(DataStore)の使い方

まずはDataStoreServiceの取得とセーブデータの作成

local DataStoreService = game:GetService("DataStoreService")
local PlayerDataStore = DataStoreService:GetDataStore("PlayerData")

セーブする

game.Players.PlayerRemoving:Connect(function(player: Player) 
	local coin = PlayerData.GetCoin(player)
	PlayerDataStore:SetAsync(player.UserId, coin)	
end)

ロードする

game.Players.PlayerAdded:Connect(function(player: Player) 
	PlayerData.Init(player)
	 
	local saveData = PlayerDataStore:GetAsync(player.UserId)
	PlayerData.SetCoin(player, saveData)
end)

セーブデータをテーブルで管理する

game.Players.PlayerAdded:Connect(function(player: Player) 
	PlayerData.Init(player)
	 
	local saveData = PlayerDataStore:GetAsync(player.UserId)
	print("SaveData", saveData)
	PlayerData.SetCoin(player, saveData.Coin)
	PlayerData.SetCrystal(player, saveData.Crystal)
end)

game.Players.PlayerRemoving:Connect(function(player: Player) 
	local coin = PlayerData.GetCoin(player)
	local saveData = {
		Coin = PlayerData.GetCoin(player),
		Crystal = PlayerData.GetCrystal(player)
	}
	PlayerDataStore:SetAsync(player.UserId, saveData)	
end)

Asyncを安全に使用する

データストアのコンテンツにアクセスする関数は、失敗する場合があり、エラーをキャッチして処理するためにはpcall()でラップするようにする

pcallの中でエラーが起きても処理を継続する

local DataStoreService = game:GetService("DataStoreService")
local PlayerDataStore = DataStoreService:GetDataStore("PlayerData")

local success, saveData : PlayerSaveDataType = pcall(function()
    return PlayerDataStore:GetAsync(player.UserId)
end)

if not success then
    warn("LoadData error:", saveData)
    player:Kick("LoadData error, please rejoin.")
    return
end

Asyncの処理はプレイヤー数に応じた制限がある

  • プレイヤーがログアウトしたタイミング
  • プレイヤーが重要なアイテムを入手した、拡張した
  • 5分ごと
    など考慮して、必要に応じて実装する

リスポーン(死亡)した際にツールを失わないようにする

StarterGearはゲームを起動しないと見えないため予測が効かないので注意

tool:Clone().Parent = player.StarterGear

辞書

weld /wéld/

溶接する

constraint /kənstréɪnt/

強制、圧 迫、束縛、制約するもの

参考

https://www.udemy.com/course/roblox-simulator-tech/?couponCode=LOCLZDOFFPJPTRMT

Discussion