😎

[Godot] Layer Maskの値の決め方

2024/05/27に公開

GodotではLayerで表示されるレイヤーを設定できます。VisualInstace3DやDecalでset_layer_mask(int value)set_cull_mask(int value)でLayerを特定できます。

選択するレイヤーをスクリプトから変更しようとしたときに以下の疑問が生じました。
「20個あるレイヤーをたったひとつのvalueで設定するというのはどういうことなのか?」

いろいろ調べてみてわかったんですが、ただビット演算しているだけでした(泣)

Layerをひとつだけ選ぶとき

選びたいLayerが一つの時は2の累乗で計算できます。valueをn-1乗の値にすればよいだけです。

layer.gd

# 1を選ぶとき
value = 1 # 2の0乗
# 2を選ぶとき
value = 2 # 2の1乗
# 3を選ぶとき
value = 4 # 2の2乗
# 4を選ぶとき
value = 8 # 2の3乗
# 5を選ぶとき
value = 16 # 2の4乗
.
.
.
# 10を選ぶとき
value = 512 # 2の9乗
.
.
.
# nを選ぶとき
valueは2のn-1

Layerを1,2,3...など一つだけ選ぶ場合はvalueは2のn-1乗になります。

なぜそうなるのか

一つのvalueで1~20までのどのlayerの組み合わせも表現しようとすると、複数選択するときに選択対象の中で一番大きい数字を除いた残りの数字の組み合わせの数だけパターンが必要になるからです。

combination.gd
value -> selected layers
1 -> 1 (選択対象1のみ-> 1つだけ)
2 -> 2 (選択対象は12 -> 1を選ぶか否かの2通りが必要)
3 -> 1, 2 (選択対象は12 -> 1を選ぶか否かの2通りが必要)
4 -> 3 (選択対象は123 -> 1を選ぶか否かの2通りと2を選ぶか否かの2通りで計4通りが必要)
5 -> 1 3 (選択対象は123 -> 1を選ぶか否かの2通りと2を選ぶか否かの2通りで計4通りが必要)
6 -> 2 3 (選択対象は123 -> 1を選ぶか否かの2通りと2を選ぶか否かの2通りで計4通りが必要)
7 -> 1 2 3 (選択対象は123 -> 1を選ぶか否かの2通りと2を選ぶか否かの2通りで計4通りが必要)
8 -> 4
9 -> 1, 4
10 -> 2, 4
11 -> 1, 2, 4
12 -> 3, 4
13 -> 1, 3, 4
14 -> 2, 3, 4
15 -> 1, 2, 3, 4
16 -> 5
.
.
.
# 複数選択するパターンの数は一番大きい数字以外の数字の個数分だけ2を累乗した数になります

Godotで内部的にどのように計算しているのかを調べたわけではないのでもしかしたら間違っているかもしれません。
そういうときは優しく教えてください(笑)

Layerをスクリプトから変更する

set_layer.gd
# 2のn-1乗はpow(2, n-1)です。返り値はfloat型なのでint型に変換して使います。
mesh.set_layer_mask( int(pow(2, n-1)) )
decal.set_cull_mask( int(pow(2, n-1)) )

Discussion