🤖
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
クライアントで音を鳴らす
- Scriptでイベントを発火
game.ReplicatedStorage.RemoteEvent:FireClient(player, game.SoundService.GetCoin)
- ReplicatedStorageにRemoteEventを入れておくとRemoteEventが中継してくれる
- 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/
強制、圧 迫、束縛、制約するもの
参考
Discussion