Open5
Robloxゲーム開発Tips(記事にするまでもないような小ネタ集)
表示方法の違い
- SurfaceGuiで貼り付けると面に貼り付けられる。
- Humaroidを設定してHeadのPartをつけると、Parentのモデルの名前が常にカメラに対して追従して見える→キャラクター名表示の仕組みを使っている模様
参照を持たせてこのような感じに。
onTouchがPartじゃないとだめなので。
Pluginの作成。
TycoonをWorkSpaceに配置したり、ServerStorageに移動したり。
ゲーム開始時は必要な要素以外をServerStorageにおいておくため。
でも開発時はWorkSpaceで確認したいので。。
Luaのrequire関数は、モジュール(スクリプト)を一度だけ読み込む仕組みになっているらしい。 だから、同じスクリプトを何度もrequireしても、最初に読み込んだデータが使い回される。
MyData.luaが読み込まれ、そのデータは変わらないことを確認。
MyClassのインスタンスは新しく作られるが、MyDataはrequireで読み込んだ時点でキャッシュされるためそれ以降は同じデータが使われる。
モジュールスクリプト
-- MyClass.lua (モジュールスクリプト)
local MyClass = {}
MyClass.__index = MyClass
-- コンストラクタ
function MyClass:new(name)
local self = setmetatable({}, MyClass)
self.name = name
self.myData = require(script.Parent.MyData)
return self
end
-- メソッド
function MyClass:getName()
return self.name
end
return MyClass
-- MyData.lua (モジュールスクリプト)
local MyData = {
value = "I am constant data!"
}
return MyData
読み込んで確認
-- main.lua (メインスクリプト)
local MyClass = require(script.Parent.MyClass) -- MyClass.luaを読み込む
-- インスタンスを作成
local instance1 = MyClass:new("Alice")
local instance2 = MyClass:new("Bob")
-- 各インスタンスから名前を取得
print(instance1:getName()) -- 出力: Alice
print(instance2:getName()) -- 出力: Bob
-- インスタンスが違うことを確認
print(tostring(instance1)) -- 出力: table: 0xXXXXXX (アドレス)
print(tostring(instance2)) -- 出力: table: 0xYYYYYY (別のアドレス)
-- インスタンスが同じことを確認
print(tostring(instance1.myData)) -- 出力: table: 0xZZZZZZ (アドレス)
print(tostring(instance2.myData)) -- 出力: table: 0xZZZZZZ (同じアドレス)
実行ログで確認
Alice - サーバー - InitializeGame
Bob - サーバー - InitializeGame
table: 0xbc5a34dc44a76238 - サーバー - InitializeGame
table: 0x2266bb69d357cf88 - サーバー - InitializeGame
table: 0x4dc35eb080babbf8 - サーバー - InitializeGame
table: 0x4dc35eb080babbf8 - サーバー - InitializeGame
確かに、newで生成したテーブルはアドレスが別だが、それぞれのテーブルから参照されるデータのアドレスは同じ。
インスタンスごとに不要にデータをロードするということはなさそう。
衝突の設定はCollisionGroup