ptitca_zu
@ptitca_zu
Programmer. Reader. Introvert

Как отобразить линии сетки на игровом поле?

Здравствуйте.

Продолжаю пытаться наложить сетку на игровое поле :)
Итак, генерирую поле:
void BoardSetup()
    {
        board = new GameObject("Board");
        boardHolder = board.transform;

        for (int x = 0; x < columns; x++)
        {
            for (int y = 0; y < rows; y++)
            {
                GameObject toInstantiateBackground = snowTile;
                GameObject backgroundInstance = Instantiate(toInstantiateBackground, new Vector3(x, y, 0f), Quaternion.identity) as GameObject;
                backgroundInstance.transform.SetParent(boardHolder);

                AddRandomNumber(backgroundInstance, x, y);
            }
        }

        float step = snowTile.GetComponent<SpriteRenderer>().bounds.max[0] - snowTile.GetComponent<SpriteRenderer>().bounds.min[0];
        CreateGrid(new Vector3(0, 0, 0), new Vector3(rows-1, columns-1, 0f), step);
    }


Накладываю сетку (взял код отсюда и модифицировал)
void CreateLineMaterial()
    {

        if (!lineMaterial)
        {
            lineMaterial = new Material("Shader \"Lines/Colored Blended\" {" +
                "SubShader { Pass { " +
                "    Blend SrcAlpha OneMinusSrcAlpha " +
                "    ZWrite Off Cull Off Fog { Mode Off } " +
                "    BindChannels {" +
                "      Bind \"vertex\", vertex Bind \"color\", color }" +
                "} } }");
            lineMaterial.hideFlags = HideFlags.HideAndDontSave;
            lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
        }
    }

    private void CreateGrid(Vector3 start, Vector3 stop, float step)
    {
        GL.PushMatrix();
        
        CreateLineMaterial();
        // set the current material
        lineMaterial.SetPass(0);
        GL.LoadOrtho();

        GL.Begin(GL.LINES);
        GL.Color(gridColor);
        // Vertical lines
        for (float x = start[0]; x <= stop[0]; x += step)
        {

            GL.Vertex3(x, 0f, 0f);
            GL.Vertex3(x, stop[1], 0f);
        }
        // Horizontal lines
        for (float y = start[0]; y <= stop[1]; y += step)
        {

            GL.Vertex3(0f, y, 0f);
            GL.Vertex3(stop[0], y, 0f);
        }
        GL.End();
        GL.PopMatrix();
    }

Запускаю. Вижу поле без сетки. Если закомментировать генерацию тайлов и цифр (самый первый цикл), то просто черный экран.

Оригинальный вопрос на SOF
  • Вопрос задан
  • 449 просмотров
Решения вопроса 2
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Начиная с версии 5.1 компиляция шейдеров в рантайме не поддерживается. Предполагаю, что вы пользуетесь свежей версией, поэтому ваш конструктор материала ничего не делает. Можете вручную создать материал с шейдером, а потом сунуть ссылку на него в инспекторе.
Shader "Lines/Colored Blended"
{
    SubShader
    {
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off Cull Off Fog { Mode Off }
            BindChannels { Bind "vertex", vertex Bind "color", color }
        }
    }
}

Или можете попробовать другие способы для рисования линий.
Ответ написан
ptitca_zu
@ptitca_zu Автор вопроса
Programmer. Reader. Introvert
Сделал немного по-другому. Создал prefab GameObject с компонентом LineRenderer.
В рантайме создаю его сущность и передаю нужные параметры в LineRenderer.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы