Arrow is at Z = 0, walls are at Z = 1. Why is the arrow’s transparency at (about) 50%? It should be invisible since it’s underneath it. Everything, either on the arrow scene or the TileMapLayer, is default, except for the obvious.
Is there any alpha in the textures of your tilesets?
Oh, that’s a possible thing: Are you using modulate on any of the layers? If you’re adding transparency to the base layer with modulate its children will inherit it. self_modulate doesn’t inherit, modulate does.
Found the problem! But it’s… WEIRD. Unsure why this would do that…
Alright. In the game I have a CanvasModulate to tint the color of the light I want, for the ambiance and everything. I put a light transparency to the color, like opacity at 75%. Resetting this to 100% fixed the problem. The arrows are now visually properly under the wall.
Then my question becomes, why do tinting objects affects other objects’s transparency? Shouldn’t it just color them with a slightly hazy color without affecting said objects’s transparency values? Or am I misunderstanding how tinting works?
Docs says:
CanvasModulate applies a color tint to all nodes on a canvas. Only one can be used to tint a canvas, but CanvasLayers can be used to render things independently.
After having run the game with that transparency reset, it looks a lot better. Every sprite is clean and clear.
TL;DR: Avoid putting transparency in CavasModulate Color value. Everything will look better that way.
CanvasModulate tints every CanvasItem individually, so if you use low opacity values, every object will be translucent. However, objects are still drawn individually, so they will visibly overlap each other.
If you want to avoid this, group your overlapping CanvasItems nodes under a CanvasGroup node. Use this sparingly, as it can have a performance impact when used with a large amount of nodes.