如何在Unity中显示网格线?

4

我正在制作我的第一个2D游戏。

在生成游戏场地方面,我遇到了困难,需要完成以下三件事情:

  1. 使用正方形png瓷砖填充游戏场地(已完成)
  2. 在每个瓷砖上显示随机数字(已完成)
  3. 显示网格线(问题就在这里

为了创建我的游戏板,我使用了附加到主摄像头的脚本。

这是我使用的函数:

    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);
}

这是我的CreateGrid块:
    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)
{
    CreateLineMaterial();
    // set the current material
    lineMaterial.SetPass(0);
    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();
}

我使用了来自这里的示例(并进行了修改)。
但是当我运行游戏时,我只看到雪地和数字Screenshot 1
我尝试仅运行CreateGrid(),但在这种情况下,我只看到黑屏。
1个回答

1

你提到的链接是在三维空间中画线。你应该加载正交矩阵以在屏幕空间中绘制二维基元。首先,推入一个新矩阵,加载正交矩阵,进行绘制,然后在完成时弹出矩阵:

GL.PushMatrix();
mat.SetPass(0);
GL.LoadOrtho();
GL.Begin(GL.LINES);

 // Set colors and draw verts

GL.End();
GL.PopMatrix();

不要忘记你的顶点坐标应该在0和1之间。


谢谢。但我仍然看到黑屏或没有线条的板子。 - Dmitriy Demidov
你能否解释一下你最后一句话的意思?为什么是在0和1之间? - Dmitriy Demidov
@DmitriyDemidov 在正交投影中,您的向量被视为屏幕空间的百分比,而不是世界空间坐标。 - Foggzie
非常感谢!这对我来说很有启发!我该如何将我的坐标转换为百分比? - Dmitriy Demidov
@DmitriyDemidov 这取决于您如何存储它们,但如果您知道它们的x和y像素坐标应该是什么,您可以将它们除以屏幕宽度和屏幕高度。 - Foggzie
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接