Collection Proxyとは何か?
Collection Proxyは、Defoldのゲームエンジンで使用される特殊なコンポーネントです。これを使うことで、異なるゲームシーンやレベル間でシームレスに移行することができます。
具体的にはどういうことをするの?
ゲームを作成するとき、たとえば「タイトル画面」「ゲームプレイ画面」「リザルト画面」といった異なるシーンや画面が存在しますよね。これらの各シーンを個別のコレクションとして管理し、Collection Proxyを使うことで、これらのコレクションを動的にロードしたり、アンロードしたりすることができます。
Collection Proxyのメリットは?
- メモリの効率的な使用: 必要な時だけ特定のゲームシーンをメモリにロードできるため、全てのシーンを同時にメモリに保持する必要がない。これにより、大きなゲームでもスムーズに動作する。
- ゲームのフローの柔軟性: タイトル画面からゲームプレイ画面に移行したり、逆にゲームプレイからタイトルに戻ることなどが容易になる。
使い方の基本
- まず、各ゲームのシーンを個別のコレクションとして作成します。
- メインのコレクション(例えばゲームのタイトル画面など)に「Collection Proxy」コンポーネントを追加します。
- Collection Proxyのプロパティで、ロードしたいコレクションを指定します。
- ゲームのロジックに合わせて、そのProxyを使ってコレクションをロード、初期化、有効化、アンロードするメッセージを送信することで操作します。
結論
Collection Proxyは、大きなゲームや複雑なゲームのフローを持つゲームを作成する際に非常に役立ちます。正しく使うことで、ゲームのロード時間を短縮したり、メモリの使用を最適化したりすることができます。
Collection Proxyに関する変数の扱い
DefoldのCollection Proxyを使ってシーンを移動する場合、以下の点を理解することが重要です。
-
変数の維持:
Collection Proxyを用いてコレクションをロードすると、そのコレクション内のゲームオブジェクトやスクリプトが新たに初期化されます。これにより、コレクションの変数はそれぞれの初期状態に戻ります。つまり、前回アンロードした際の変数の値を保持することはできません。 -
異なるコレクション間の通信:
通常、異なるコレクション間のゲームオブジェクトやスクリプトは直接的に通信することはできません。しかし、
msg.post()を用いて特定のゲームオブジェクトやコンポーネントにメッセージを送ることができます。これにより、あるコレクションから別のコレクションの特定のオブジェクトやスクリプトに命令を送ることができます。 -
グローバル変数の使用:
Defoldでは、
sys.set/getを使用してグローバル変数を設定・取得することができます。これを使用することで、異なるコレクション間で変数を共有したり、特定の変数の値を維持したりすることができます。 -
Luaモジュール:
Luaモジュール内の変数はグローバルであり、それはアンロード時にリセットされません。これを利用することで、コレクション間で情報を共有することができます。
-
コレクションの独立性:
それぞれのコレクションは独立した環境で動作するので、名前が同じゲームオブジェクトや変数が存在しても、それらは異なるコレクション間で干渉することはありません。
要するに、Collection Proxyを使ってコレクションを切り替えるとき、各コレクションは独立した環境で動作しますが、特定の方法(メッセージの送信、グローバル変数の使用、Luaモジュールなど)を利用することで、コレクション間での通信やデータの共有が可能です。
サンプルコード
コレクションのロードとアンロード
-- main.script
function init(self)
-- コレクションを非同期でロード
msg.post("my_collection_proxy#proxy", "load")
end
function on_message(self, message_id, message, sender)
if message_id == hash("proxy_loaded") then
-- コレクションがロードされたら、それを有効化
msg.post(sender, "enable")
end
end
function unload_collection(self)
-- コレクションをアンロード
msg.post("my_collection_proxy#proxy", "unload")
end
異なるコレクション間の通信
-- collectionA.script
function on_input(self, action_id, action)
if action_id == hash("touch") and action.pressed then
-- コレクションBにメッセージを送信
msg.post("collectionB#script", "hello_from_A")
end
end
-- collectionB.script
function on_message(self, message_id, message, sender)
if message_id == hash("hello_from_A") then
print("Hello from Collection A!")
end
end
グローバル変数の使用
sys.setとsys.getを使用してグローバル変数を設定・取得するサンプルです。
-- set_global.script
function set_global_score(score)
sys.set("global_score", score)
end
-- get_global.script
function get_global_score()
local score = sys.get("global_score")
return score
end
コメント