今天在开发中需要给人物添加姓名和血条,让我们UI哥哥给了适合项目的字体,交代字体大小之后。便开始一顿乱敲键盘。用户名称+头顶小云彩一气呵成,没问题。测试小哥闲的无聊,刚上手就指出了一个BUG~~~
如图所示,这是BUG出现的情况,VR/AR相机面向 人物角色时候,UI出现,没毛病。然而,当相机转到玩家背面时候,又出现了人物的姓名和头顶的气泡!!!
角色明明没有在相机视野,怎么可能会这样呢?经过猜测可能是相机的叠加。也就是说相机可能是双面的,正面能照射到,反面也照射到。这样的BUG当然不能忍,在Scene视图下考虑了很久,决定判断相机和主角是不是在同一象限,(备注 :我这里相机是000点),如果相机和主角在同一个象限,他们的X或者Z轴都是同大于0或者同小于0,这样的判断就没问题了。于是在Update里面进行检测~~当摄像机拍摄范围和主角不在一个象限,关闭掉UI中的血条和头顶气泡显示,测试没问题。
当然,这还不算完成。在update里面的检测非常消耗资源,同屏角色达到30+个时,帧率急速下降。我这里加载了携程,携程死循环来做循环,这样做性能基本没什么损耗。部分代码如下:
IEnumerator CheckPos()
{
while (true) {
yield return new WaitForSeconds (2f);
Vector3 pt = Camera.main .WorldToScreenPoint (userNamePos.transform.position );
userNameUI.transform .position = pt;
//血条超出屏幕就不显示
if (pt.x > Screen.width || pt.x < 0 || pt.y > Screen.height || pt.y < 0)
{
userNameUI.gameObject.SetActive(false);
}
else
{
userNameUI.gameObject.SetActive(true);
}
//如果和摄像机观察的位置不一样 也关闭
Vector3 pt2 = Camera.main.WorldToScreenPoint (userChatPos.transform.position );
userChatUI.transform.position = pt2;
if (pt2.x > Screen.width || pt2.x < 0 || pt2.y > Screen.height || pt2.y < 0)
{
userChatUI.gameObject.SetActive(false);
}
else
{
userChatUI.gameObject.SetActive(true);
}
if ((_CheckPos.transform.position.x > 0 && this.gameObject.transform.position.x < 0) || (_CheckPos.transform.position.x < 0 && this.gameObject.transform.position.x > 0)) {
userChatUI.gameObject.SetActive(false);
userNameUI.gameObject.SetActive(false);
}
else {
Debug.Log ("当前的相机正在拍照到物体!");
}
}
}
好了。希望能给做AR/VR出现 UI双面的同学给一个解决问题的思路,如果不懂可以私信我。另外,用携程里面写死循环,延迟调用,时间的话可以自己控制,比在update里面进行检测 高效得多。这点大家可以借鉴。