9
votes

I've got WallCreator script to place walls in Unity, and another one, WallCreatorSwitcher to turn WallCreator ON/OFF by checking the toggle. I also wanted to change wallPrefab's layer there by using GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("LayerName");, so when the toggle is checked (WallCreator ON) layer is "Ignore Raycast" - and it works, and if the toggle is unchecked (WallCreator OFF) layer is "Default" - but the problem is, it's not changing the layer in this case.

public class WallCreatorSwitcher : MonoBehaviour {

public Toggle toggle;
public Text text;


// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
    if (toggle.isOn)
    {
        GetComponent<WallCreator>().enabled = true;
        Debug.Log("Wall Creator is ON");
        text.enabled = true;
        GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("Ignore Raycast");

    }

    else
    {
        GetComponent<WallCreator>().enabled = false;
        Debug.Log("Wall Creator is OFF");
        text.enabled = false;
        GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("Default");

       }

   }    

}
2
Presumably, the issue you're facing here is that GetComponent<WallCreator>().enabled = false; stops the component being interacted with at all, as a result you may have to turn it on, change the layer, and then turn it back off, alternatively make the layer switch before switching it off - Alfie Goodacre
Even when I deleted that GetComponent<WallCreator>().enabled = false; (so I'm able to place walls even when the toggle is unchecked) the layer is changing only for new objects. I mean, for example, I place wall1 with toggle ON - it's layer is "Ignore Raycast", then i switch toggle to OFF, place wall2 - it's layer is "Default", but the layer of wall1 doesn't change - artur47wien
I didn't realise you meant the walls placed before, that's a different issue entirely. The newer walls are in the default layer after it's changed - and that is because changing the prefab changes what is placed when you create a wall, not what's already there. To change the layer of ALL walls, you can do something like this (assuming the walls have the tag wall): GameObject[] walls = GameObject.FindGameObjectsWithTag("wall"); then you may manipulate them through a foreach loop - Alfie Goodacre
You should also post your WallCreator script and describe where each script is attached - Programmer
@AlfieGoodacre yeah I probably presented my problem not correctly. Anyway, your answer helped a lot, it's working now, thank you - artur47wien

2 Answers

8
votes

The newer walls, when placed, are in the Default layer after it's been changed in the prefab - and that is because changing the prefab changes what is placed when you create a wall, not what's already there. To change the layer of ALL walls, you can do something like this (assuming the walls have the tag wall)

GetComponent<WallCreator>().wallPrefab.gameObject.layer = LayerMask.NameToLayer("Default");
GameObject[] walls = GameObject.FindGameObjectsWithTag("wall");
foreach(GameObject wall in walls)
{
    wall.layer = LayerMask.NameToLayer("Default");
}

This will loop through every wall in the scene and change its layer to the one you want. It is also important that the WallCreator still has its property changed also, so that walls placed after this change, will remain on the new layer as opposed to the old one

2
votes

It appears as if you aren't referencing the gameObject of the wallPrefab, which could be the problem. Change:

GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("Ignore Raycast");

To:

GetComponent<WallCreator>().wallPrefab.gameObject.layer = LayerMask.NameToLayer("Ignore Raycast");

Without seeing the other scripts, I can't be sure this will fix the problem though.