unity3d - 为什么我的相机不显示项目,除非我将其移动到 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 位置,我可以看到所有游戏对象。
简而言之,我的问题是……
当我不理会我的相机并且不限制它时,它可以正常工作。一旦我限制它,它就开始变得扭曲。如果我约束它并将它移动到负 Z 位置,它就可以工作。
有人可以解释为什么会发生这种情况吗?我发布的第一个更复杂的功能是最时尚的解决方案,还是有人对如何改进我的代码有任何建议?
任何建议将不胜感激
更新有人建议我尝试将我的对象放在单独的排序层上。我试过这个,但它似乎不起作用。除非有办法将相机移动到另一个排序层,否则我不确定这是否是解决方案......
解决方案
TL; 博士
这就是相机在 Unity 中的工作方式。
更长的版本:
当相机位于 0 z 位置时,即使在正交模式下,它也只是等于物体,因此它无法“看到”同一平面中的物体。如果您正在使用 2D 游戏(不是 2,5D),您应该使用排序层来制作漂亮的对象层次结构。
推荐阅读
- git - 使用大写重命名目录后无法结帐到不同的分支
- api - API 平台和 Symfony:为收集操作制作自定义控制器的正确方法是什么?
- html - Twitter Bootstrap 列高变化在列网格中没有间隙?
- html - 通过容器恢复固定图像
- javascript - 如何从 Google Places 获取结果并将其传递给 render 方法?
- python - 小型网络中 CPU 和 GPU 的慢速训练(tensorflow)
- android - 如何使用 MediaStore 将媒体文件从 FirebaseStorage 下载到本地存储?
- swift - 如何以编程方式固定 UIImageView
- python - gitlab CLI - 获取项目变量值
- javascript - 如何在 Odoo14 中扩展 qweb 模板?