ランダムパスコード生成機をSingleton化
vary = 変化する
varying length = 可変長
Singleton & Autoload
オブジェクトをシングルトンにするということを、わかりやすく解釈すると、
1つだけられるインスタンスを自動ロードして、どのシーンでもアクセスできる
ということ
Template Level でも Level1 でも Level 2 でも、別のドアでも
同じCombinationGeneratorを共有する。
どのscene / script からでも永久的に利用できる
多くの問題を解決するが、多くの問題を引き起こす
Singleton & Autoloadのユースケース
以下のケースでは有用
グローバルに使えるhelper純粋関数
グローバルなconst
mutableなデータをSingletonで扱うのはおすすめできなさそう。
グローバルなライブラリの import みたいなものと考えたほうが良さそう
AutoloadするNodeを作成
Autoload は、ゲーム全体に関わる設定なので
Project Setting で設定する。
1. New Script > CombinationGenerator.gd
Levels/ などに保存
code: CombinationGenerator.py
extends Node
func generate_combination(length: int) -> Array:
var combination = []
for i in range(length):
combination.append(randi() % 10)
return combination
2. Project Setting > AutoLoad タブ
3. パス > CombinationGenerator.gd を選択
4. 追加
これで、どこからでもgenerate_combination()関数が使える
Singletonのメソッドを他のスクリプトから利用する
Globalアクセスできる
code: NumPad.py
func generate_Combination():
combination = PoolIntArray(CombinationGenerator.generate_combination(4))
print(combination)
code: LockedDoor.py
func _on_Door_input_event(viewport, event, shape_idx):
if Input.is_mouse_button_pressed(BUTTON_LEFT) and can_click:
$CanvasLayer/NumberPad.generate_combination()
$CanvasLayer/NumberPad.popup_centered()
NumPadを表示するときに、ランダムな4桁を変更する。
補足. AutoLoad した Singletonの場所
Godot Editorで編集中は見えない
実行中に、Remote タブを見ると、/root 直下に見える。
(scene の兄弟要素、同じレベル)
https://gyazo.com/2cec57c1435d6af468284f8fb22b039d
まとめ
Singleton & AutoLoad
2つはセット
Singleton
グローバルにインポートされるライブラリのように使うべし
純粋関数
const
AutoLoad
どのシーンでも必ずLoadするNode
Project Setting から設定できる
CombinationGenerator
さらなるfor loop
randi() % 10 : 1桁の乱数