Open5

Robloxゲーム開発Tips(記事にするまでもないような小ネタ集)

moritakumoritaku

表示方法の違い

  • SurfaceGuiで貼り付けると面に貼り付けられる。
  • Humaroidを設定してHeadのPartをつけると、Parentのモデルの名前が常にカメラに対して追従して見える→キャラクター名表示の仕組みを使っている模様

moritakumoritaku

参照を持たせてこのような感じに。
onTouchがPartじゃないとだめなので。

moritakumoritaku

Pluginの作成。
TycoonをWorkSpaceに配置したり、ServerStorageに移動したり。
ゲーム開始時は必要な要素以外をServerStorageにおいておくため。
でも開発時はWorkSpaceで確認したいので。。

moritakumoritaku

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で生成したテーブルはアドレスが別だが、それぞれのテーブルから参照されるデータのアドレスは同じ。
インスタンスごとに不要にデータをロードするということはなさそう。