首页 > 解决方案 > 为什么我的相机不显示项目,除非我将其移动到 2D 中的负 Z 位置

问题描述

美好的一天

我正在开发一个基本的 2D 游戏来掌握使用 Unity 的窍门。我编写了一个函数,允许我限制几个游戏对象允许移动的距离,我用于相机以及我的玩家角色和我的敌方单位。该函数使用 Mathf.clamp 来限制这种移动。

当我将该功能应用于相机时,我的问题出现了。最初我使用 Vector2 来定义位置约束。然而,这导致所有游戏元素消失。

在我从上一篇文章中获得了一些好的建议之后(见这里)(另外,请不要将其标记为重复,因为我的问题集中在我的代码的更新版本上,我真的想了解为什么这个错误是发生),我发现我可以使用 Vector3 来更好地控制相机的最终位置。另一个用户建议 Vector2 位置将我的相机移动到不同的 Z 位置,如果我将相机移动到负 Z,这应该可以解决我的问题。

我的代码现在看起来像这样,实际上工作正常:

    public void constrain(GameObject obj, bool isCamera = false)
    {
        Vector3 pos = obj.transform.position;
        pos.x = Mathf.Clamp(pos.x, -maxX, maxX);
        pos.y = Mathf.Clamp(pos.y, -maxY, maxY);
        if(isCamera)
            pos.z = -10;
        else
            pos.z = 1;
        obj.transform.position = pos;
    }

    GameObject camera = GameObject.Find("Main Camera");
    constrain(camera.gameObject,true); //if you are constraining the camera object

    GameObject player= GameObject.Find("Player");
    constrain(player.gameObject,true); //skip the optional parameter if not referencing the camera

然而,另一位用户建议我不需要可选的 bool 参数来检查它是否是相机。相机不必更改其 Z 位置,因为这是在以下行中设置的:

Vector3 pos = obj.transform.position;

因此,我应该能够将功能简化如下:

    public void constrain(GameObject obj, bool isCamera = false)
    {
        Vector3 pos = obj.transform.position;
        pos.x = Mathf.Clamp(pos.x, -maxX, maxX);
        pos.y = Mathf.Clamp(pos.y, -maxY, maxY);            
        obj.transform.position = pos;
    }

    GameObject camera = GameObject.Find("Main Camera");
    constrain(camera.gameObject,true); //if you are constraining the camera object

    GameObject player= GameObject.Find("Player");
    constrain(player.gameObject); //skip the optional parameter if not referencing the camera

但是,当我这样做时,玩家角色和(有趣的是有时)其他游戏对象不会显示在相机上(例如,敌人会在随机位置产生,然后向玩家角色移动,并且只有在他们开始时才会显示在屏幕上)。

我在运行期间调整了相机的 Z 位置,如果我将它移动到负 Z 位置,我可以看到所有游戏对象。

这是没有移动相机的游戏屏幕截图: 在此处输入图像描述

在我将相机移动到 -1 Z 位置之后的另一个: 在此处输入图像描述

简而言之,我的问题是……

当我不理会我的相机并且不限制它时,它可以正常工作。一旦我限制它,它就开始变得扭曲。如果我约束它并将它移动到负 Z 位置,它就可以工作。

有人可以解释为什么会发生这种情况吗?我发布的第一个更复杂的功能是最时尚的解决方案,还是有人对如何改进我的代码有任何建议?

任何建议将不胜感激

更新有人建议我尝试将我的对象放在单独的排序层上。我试过这个,但它似乎不起作用。除非有办法将相机移动到另一个排序层,否则我不确定这是否是解决方案......

这是我所做的截图,以防万一我犯了错误: 在此处输入图像描述

标签: unity3d

解决方案


TL; 博士

这就是相机在 Unity 中的工作方式。


更长的版本:

当相机位于 0 z 位置时,即使在正交模式下,它也只是等于物体,因此它无法“看到”同一平面中的物体。如果您正在使用 2D 游戏(不是 2,5D),您应该使用排序层来制作漂亮的对象层次结构。


推荐阅读