“A game object can only be in one layer. The layer needs to be in the range [0…31]”
How can i fix it?
thanks
I see what you mean! I edited my answer, why do you think calling Resources.UnloadAsset(prefab) wont work? GameObject derives from Object and since this was loaded from memory shouldn't this unload it?
First, let’s go over how layers and layermasks work.
A layermask is a group of layers, it can contain no, one, multiple, or all layers. This is done with layers having 32 possible values, 0 to 31, and layersmasks having 32 bits (0 or 1), i.e. 00001111000011110000111100001111. Every bit that is 1 means a layer is in the layermask.
Next, let’s go over how left/right shift operators (<</>>) work. x << y moves all the bits in x left y times. For instance: 101<<2 = 10100. This is useful to convert layers to a layermask. Layer 0 is the 0th bit in a layermask so you can use 1<<0 to get the right bit while layer 31 is the 31th bit in a layermask so you can use 1<<31. Bitwise operations are very inexpensive so converting from layer to layermask is very cheap and then bitwise operations can be used to get the mask you want. I.e. (1<<0) | (1<<31) is the layermask with bits 0 and 31 set to 1.
In your code you are attempting to convert a layermask to a layer. However a layermask can have zero or multiple layers so this doesn’t make sense. The method you are using, right shifting 1 bit, also doesn’t make sense. Supposing that a layermask only has the 16th layer you start with 00000000000000010000000000000000 and end with 00000000000000001000000000000000 instead of 16. Your Debug.Log(reversedLayer.value >> 1); would print the value in decimal which is 32768.
I would suggest not using layermasks if you want to use layers, Instead use strings/ints. For instance if your layers are called “Default” and “Reversed” you can use the following:
public int defaultLayer;
public int reversedLayer;
void Start()
{
defaultLayer = LayerMask.NameToLayer("Default");
reversedLayer = LayerMask.NameToLayer("Reversed");
}
void Reverse()
{
Debug.Log(reversedLayer);
if (reversed)
{
gameObject.layer = defaultLayer;
}
else
{
gameObject.layer = reversedLayer;
}
reversed = !reversed;
}
"UnloadAsset may only be used on individual assets and can not be used on GameObject's / Components or AssetBundles". As my Prefab is a GameObject, it won't work.
I see what you mean! I edited my answer, why do you think calling Resources.UnloadAsset(prefab) wont work? GameObject derives from Object and since this was loaded from memory shouldn't this unload it?
– hulahoolgames