我正在开发一个应用程序,其中几个GUI Label的平面显示名称。
这是结果:
问题是,如果我将相机旋转180°,那些标签就在这里,就像有一个点对称:
所以我的标签出现两次,一次出现在飞机上,这很好,第二次出现在相机后面。
我检查我的脚本是否没有添加两次,但是没有问题,更奇怪的是,如果从上面的视图看,问题就消失了:
我不知道这可能来自哪里,这是我的代码,附在每架飞机上:
void OnGUI()
{
if (showInfos)
{
Rect r = new Rect((Camera.main.WorldToScreenPoint(gameObject.transform.position)).x+25, Camera.main.pixelHeight - (Camera.main.WorldToScreenPoint(gameObject.transform.position)).y+25, 75f, 75f);
GUI.Label(r, gameObject.transform.root.name);
}
}
答案 0 :(得分:1)
您正在绘制标签,无论它们是否在视锥体中。
来自Camera.WorldToScreenPoint(强调我的):
屏幕空间以像素为单位定义。屏幕的左下角是(0,0);右上角是(pixelWidth,pixelHeight)。 z位置是相机的世界单位。
您需要检查屏幕点的Z值是负值还是正值(我不知道哪一个在凸轮前面,哪一个在它后面,我不使用Unity) ,并据此决定是否需要渲染。
void OnGUI()
{
if (showInfos)
{
var pt = Camera.main.WorldToScreenPoint(gameObject.transform.position);
if (pt.z > 0) //or < 0, no idea.
{
Rect r = new Rect(pt.x + 25, Camera.main.pixelHeight - pt.y + 25, 75f, 75f);
GUI.Label(r, gameObject.transform.root.name);
}
}
}