// Create a playfield using a PlayfieldLayoutValues value
    private void SetPlayfield(int vLayout)
    {
        if ((vLayout < 0) || (vLayout >= PlayfieldLayoutValues.Length))
        {
            Debug.Log("Invalid playfield layout identifier specified");
            return;
        }

        if (!(FloorObject))
        {
            Debug.Log("FloorObject has not been assigned");
            return;
        }

        if (!(HoleObject))
        {
            Debug.Log("HoleObject has not been assigned");
            return;
        }
        else if (!(HoleObject.GetComponentInChildren <TriggerCounter>()))
        {
            Debug.Log("HoleObject requires a child with a TriggerCounter component");
            return;
        }

        if (!(BallObject))
        {
            Debug.Log("BallObject has not been assigned");
            return;
        }

        if (!(ResetObject))
        {
            Debug.Log("ResetObject has not been assigned");
            return;
        }

        ResetObject.ForceReset();
        ResetObject.gameObject.SetActive(false);

        // Destroy previous tiles
        for (int i = 0; i < pPlayfieldObjects.Length; i++)
        {
            Destroy(pPlayfieldObjects[i]);
        }

        // Destroy previous balls
        for (int i = 0; i < pBalls.Length; i++)
        {
            Destroy(pBalls[i]);
        }

        // Create new tiles
        pPlayfieldObjects = new GameObject[Size * Size];

        float lHalfSize = 0.5f * (Size - 1);
        int   lValue    = PlayfieldLayoutValues[vLayout];

        pHoles = 0;

        for (int i = 0; i < Size * Size; i++)
        {
            Vector3 lPos = new Vector3(Mathf.Floor(i / Size) - lHalfSize, 0f, (float)(i % Size) - lHalfSize) * Spacing;

            // Check if bit at index i of lValue is set to determine if a HoleObject should be spawned
            if (((1 << i) & lValue) != 0)
            {
                pPlayfieldObjects[i] = Instantiate(HoleObject, lPos, Quaternion.identity);

                pHoles++;
            }
            else
            {
                pPlayfieldObjects[i] = Instantiate(FloorObject, lPos, Quaternion.identity);
            }

            // Make it look cleaner in the editor
            pPlayfieldObjects[i].gameObject.transform.SetParent(this.transform);
        }

        // Get all trigger counters
        pHoleTriggers = new TriggerCounter[pHoles];
        lValue        = 0;

        for (int i = 0; i < pPlayfieldObjects.Length; i++)
        {
            TriggerCounter lTrigger = pPlayfieldObjects[i].GetComponentInChildren <TriggerCounter>();

            if (lTrigger)
            {
                pHoleTriggers[lValue] = lTrigger;
                lValue++;
            }
        }

        pBalls    = new GameObject[pHoles];
        lHalfSize = -0.5f * (pHoles - 1);

        // Spawn a ball for each hole
        for (int i = 0; i < pHoles; i++)
        {
            Vector3 lPos = new Vector3(-0.5f * (Size - 1) - 3f, 0.5f, lHalfSize + i);

            pBalls[i] = Instantiate(BallObject, lPos, Quaternion.identity);
        }

        if (Indicator)
        {
            Indicator.SetWaiting();
        }

        pLastPlayfield   = vLayout;
        pWaitingForReset = false;
    }