【问题标题】:How to instantiate tiles based on a 2D Array into a Platform Game using Unity?如何使用 Unity 将基于 2D 数组的图块实例化为平台游戏?
【发布时间】:2016-12-31 00:16:17
【问题描述】:

我正在构建一个非常简单的平台游戏,使用 2D 数组来构建基于它的地图。

我想要两个简单的目标,但我目前找不到答案:

  1. 确保相机为 16:9,并且我的场景将 100% 显示在其中
  2. 以数组形式构建 2D 平台图块集

我的环境:

  • Unity 5.5.0f3(2D 模式)
  • 相机投影正射尺寸 10.9
  • 游戏以 16:9 显示
  • 图块尺寸为 128x128 像素

这是我当前的代码:

public Camera camera;
public GameObject prefab;

void Start () {
    Vector3 pos = camera.ScreenToWorldPoint(new Vector3 (0, 0, 0));
    Vector3 nextPosition = pos;
    for (int i = 0; i < 32; i++)
    {
        for(int j=0; j < 18; j++)
        {
            GameObject a = Instantiate(prefab, new Vector3(nextPosition.x, nextPosition.y, 0), Quaternion.identity);
            nextPosition = new Vector3(pos.x+(prefab.GetComponent<Renderer>().bounds.size.x)*i, pos.y+(prefab.GetComponent<Renderer>().bounds.size.y)*j,0);
        }
    }
}

有 3 点需要注意:

  • 我正在使用 ScreenToWorldPoint 获取 0,0,0 的位置
  • 我的构建顺序是从左下角到右上角,每次迭代都被放置为过去的位置 + 块宽度/高度(x 和 y)
  • 我正在使用 16:9 的方案,即 32:18

使用它,这是我的结果:

如您所见,它位于相机边界之外,即使相机和代码都是 16:9,它也超过了 1 列。另请注意,实例化点正好在我的游戏对象的中间,所以我开始将它实例化为游戏对象宽度和高度的一半,意思是:

Vector3 pos = camera.ScreenToWorldPoint(new Vector3 (64, 64, 0));

结果如下:

完全不是我所期望的,经过反复试验,我发现它应该是在 16,16:

Vector3 pos = camera.ScreenToWorldPoint(new Vector3 (16, 16, 0));

现在它非常适合,但它在顶部超过 1 行,在右侧超过 1,5 列。这不应该是因为它们都是 16:9

我显然做错了什么,但我看不出是什么,我过去曾遇到过这个问题,但我不记得我发现了什么。

【问题讨论】:

  • 是你的inspector相机视图正交,以及游戏相机视图。检查器布局看起来像检查器中的相机视图仍然是 3D(透视)。
  • 这是我的相机检查员:prntscr.com/dq44p0
  • 不,我的意思是viewpoint gizmo。单击 Gizmo 中心的正方形以在检查器中的正交视图和透视视图之间切换。这能解决您的问题吗?
  • 这里:prntscr.com/dq471b 在 Gizmos 下没有选择任何内容的 2D
  • 啊抱歉,我从来没有构建 2D,所以不知道这是隐藏的。运行游戏时您的游戏视图是什么样的?

标签: c# unity3d 2d


【解决方案1】:

Pos”一开始就需要换档。可以使用Bounds.extents来实现

    Vector3 pos = camera.ScreenToWorldPoint(new Vector3 (0, 0, 0));

    pos = new Vector3( pos.x + prefab.GetComponent<Renderer>().bounds.extents.x,
                      pos.y + prefab.GetComponent<Renderer>().bounds.extents.y,
                      0);


    //....the rest is the same as your code

这将比使用幻数 (16,16,0) 更好。无论您使用什么比例,第一个图块都将位于左下角。

128x128 像素仅告诉我您使用的是方形瓷砖。所以它是 128x128 像素但我可以用一个图块填满整个屏幕,或者我可以让它尽可能小(在世界坐标中思考)。解决方案是缩放图块或更改相机的orthognalSize

简单的解决方案是更改 orthographicSize 以适合图块。

camera.orthographicSize = 18 * prefab.GetComponent<Renderer>().bounds.size.y * 0.5f;

orthographicSize 等于世界坐标高度的一半,您需要 18 块高度。

所以所有代码合并:

        Bounds bound = prefab.GetComponent<Renderer>().bounds;

        camera.orthographicSize = 18 * bound.size.y * 0.5f;

        Vector3 pos = camera.ScreenToWorldPoint(Vector3.zero);
        pos = new Vector3( pos.x + bound.extents.x, pos.y + bound.extents.y, 0);

        //....The rest is the same as your code

【讨论】:

  • 你是天使,我会骄傲地给你赏金!也非常感谢您的帮助,很好的答案!它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多