Unity - Physics.CheckSphere problem with Masks

Viewed 62

I am having trouble with Unity Physics.CheckSphere. I have added a mask "Wall" and assigned it to the object.

In my custom editor window I can select this mask and set values as a grid to check for this object. However, when I click the button I don't get any collisions. But when I change the object's mask to something like "TransparentFX" I get the results I expected.

What am I missing here?

Here is the code for the custom editor window:

private void OnGUI()
{
    GUILayout.Label("Generate A*", EditorStyles.boldLabel);

    showGridTools = EditorGUILayout.BeginFoldoutHeaderGroup(showGridTools, "Grid Tools");
    if(showGridTools)
    {
        this.GridDimensions = EditorGUILayout.Vector3IntField("Grid Dimensions", GridDimensions);
        this.ObstacleMask = EditorGUILayout.LayerField("Obstacle Mask", this.ObstacleMask);

        if (GUILayout.Button("Generate Grid"))
            CreateGrid();
    }

    EditorGUILayout.EndFoldoutHeaderGroup();
}

And for checking the collisions:

private void CreateGrid()
{
    for (int x = 0; x < this.GridDimensions.x; x++)
    {
        for (int z = 0; z < this.GridDimensions.z; z++)
        {
            for (int y = 0; y < this.GridDimensions.y; y++)
            {
                Vector3Int position = new Vector3Int(x, y, z);
                bool obstacle = Physics.CheckSphere(position, 0.3f, this.ObstacleMask);

                if(obstacle)
                    Debug.Log($"Position: {position}, Obstacle: {obstacle}");
            }
        }
    }
}

Not Working Layer

Working Layer

----------- EDIT -----------

I just did this. Might be pretty slow, I don't know, but at least it works for now.

private void CreateGrid()
{
    this.Grid = new Node[this.GridDimensions.x, this.GridDimensions.y, this.GridDimensions.z];

    for (int x = 0; x < this.GridDimensions.x; x++)
    {
        for (int z = 0; z < this.GridDimensions.z; z++)
        {
            for (int y = 0; y < this.GridDimensions.y; y++)
            {
                Vector3Int position = new Vector3Int(x, y, z);

                var collisions = Physics.OverlapSphere(position, 0.3f);
                bool obstacle = collisions.Where(c => c.gameObject.layer == this.ObstacleMask).Count() > 0;

                if (obstacle)
                    Debug.Log($"Position: {position}, Obstacle: {obstacle}");
            }
        }
    }
}
0 Answers
Related