Is it possible get collision layer/mask value in code using array of layer names?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Robotex

Is it possible get collision layer/mask value in code using array of layer names?

Is it possible to get layer index by it’s name in code?

:bust_in_silhouette: Reply From: deaton64

Hi,

You can get the layer names:

print(ProjectSettings.get_setting("layer_names/2d_physics/layer_1"))

Looks like you are getting layer name by it’s id. I need a backward procedure.

For. i.e. I have layers named “units”, “buildings”, “projectiles”. I want to get indeces by names in code.

Robotex | 2021-06-24 15:55

OK, if there’s not a way of doing that, you could store all the layer names in a dictionary and look them up.

deaton64 | 2021-06-24 16:12

I think, I can add Autoload singleton with constants storing layer indexes and use them instead of names.

Maybe, it will be the best option

Robotex | 2021-06-24 16:30

But then you’ll have a list (I know it’s a small list) in two places. You may not have to update it, but you might and forget about the second place.

For me, I’d do something like this:
(You can put it in a singleton and call it from anywhere etc etc)

extends Node2D
var layer = []

func _ready():
	layer.append("")
	for i in range(1, 21):
		layer.append(ProjectSettings.get_setting("layer_names/2d_physics/layer_" + str(i)))
	
	print(get_layer("units"))
	print(get_layer("buildings"))
	print(get_layer("projectiles"))
	

func get_layer(layer_name):
	return layer.find(layer_name)

So that will printout:

1
2
3

deaton64 | 2021-06-24 21:21

Instead of appending an empty string at the beginning of layer, you could simply have get_layer( ) return the index plus 1

func get_layer(layer_name):
    return layer.find(layer_name) + 1

gneurshk | 2022-01-06 22:21

Whats the purpose for this?

If you need it to differentiate on collisions then just use the layer (bitwise number) instead. It doesn’t look as nice in code but saves you having to do any of this.

When you change the layer settings, you have to search all around in the code and modify all the bitwise number manually, and no compile or runtime error message helps you.
If you use something like get_layer(), at least it will inform you “layer name not found” to help you debugging.