unity判断范围内有物体_【Unity 检测物体是否在相机视野范围内】-VR/AR开发-【游戏蛮牛】-游戏出海,ar增强现实,虚拟现实,unity3d,unity3d教程下载首选u3d,unity3...

本文介绍如何在Unity中判断物体是否在相机视野范围内,通过WorldToScreenPoint和OnWillRenderObject方法初步实现,然后针对性能问题进行优化,使用IsInView函数结合Vector3.Dot判断物体方向,确保UI的正确显示。适用于VR/AR开发中的场景交互。
摘要由CSDN通过智能技术生成

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

9f547f370dcc586bae5ddae68dee88bc.gif

x

本帖最后由 暮呈晨曦 于 2017-4-19 15:24 编辑

需求:

类似NPC血条,当NPC处于摄像机视野内,血条绘制,且一直保持在NPC头顶。

开始:

网上查找资料,然后编写代码:

[C#] 纯文本查看 复制代码public RectTransform rectBloodPos;

void Update ()

{

this.gameObject.transform.Translate (Input.GetAxis ("Horizontal") * 10 * Time.deltaTime, 0, 0);

this.gameObject.transform.Translate (0, 0, Input.GetAxis ("Vertical") * 10 * Time.deltaTime);

Vector2 vec2 = Camera.main.WorldToScreenPoint (this.gameObject.transform.position);

rectBloodPos.anchoredPosition = new Vector2 (vec2.x - Screen.width / 2 + 0, vec2.y - Screen.height / 2 + 60);

}

实现效果图:

thread-103002-1-1.html

但是随后发现,若摄像机背对物体则如下图:

thread-103002-1-1.html

什么鬼,居然凭空出现UI,后来研究改进:

[C#] 纯文本查看 复制代码bool isRendering;

float curtTime=0f;

float lastTime=0f;

void OnWillRenderObject()

{

curtTime = Time.time;

}

void Update ()

{

isRendering = curtTime != lastTime?true:false;

Vector2 vec2 = Camera.main.WorldToScreenPoint (this.gameObject.transform.position);

if (isRendering)

{

rectBloodPos.gameObject.SetActive (true);

rectBloodPos.anchoredPosition = new Vector2 (vec2.x - Screen.width / 2 + 0, vec2.y - Screen.height / 2 + 60);

}

else

rectBloodPos.gameObject.SetActive (false);

lastTime = curtTime;

}

这种方法的原理是,当摄像机范围内出现挂有该脚本的物体,且该物体上存在Render组件的,则触发绘制UI。

虽然这个方法很好用,但是由于物体太多后,影响性能,故再次改进:[C#] 纯文本查看 复制代码public bool IsInView(Vector3 worldPos)

{

Transform camTransform = Camera.main.transform;

Vector2 viewPos = Camera.main.WorldToViewportPoint (worldPos);

Vector3 dir = (worldPos - camTransform.position).normalized;

float dot = Vector3.Dot (camTransform.forward, dir);//判断物体是否在相机前面

if (dot > 0 && viewPos.x >= 0 && viewPos.x <= 1 && viewPos.y >= 0 && viewPos.y <= 1)

return true;

else

return false;

}

void Update ()

{

Vector2 vec2 = Camera.main.WorldToScreenPoint (this.gameObject.transform.position);

if (IsInView (transform.position))

{

rectBloodPos.gameObject.SetActive (true);

rectBloodPos.anchoredPosition = new Vector2 (vec2.x - Screen.width / 2 + 0, vec2.y - Screen.height / 2 + 60);

}

else

rectBloodPos.gameObject.SetActive (false);

}

这个方法是用Vector3.Dot()的方法判断摄像机与物体的朝向以及前后从而判定是否显示UI。

以上完美实现NPC血条跟随。

如果小伙伴们有更好的方法,一定要记得分享啊!!!

原文连接http://www.cnblogs.com/AdvancePikachu/p/6733620.html

[qq]838820085[/qq]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值