Unity 检测物体是否在相机视野范围内
摘要:本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6733620.html
需求:
类似NPC血条,当NPC处于摄像机视野内,血条绘制,且一直保持在NPC头顶。
开始:
网上查找资料,然后编写代码:
public RectTransform rectBloodPos; void Update ()
{
this.gameObject.transform.Translate (Input.GetAxis ("Horizontal") * * Time.deltaTime, , );
this.gameObject.transform.Translate (, , Input.GetAxis ("Vertical") * * Time.deltaTime); Vector2 vec2 = Camera.main.WorldToScreenPoint (this.gameObject.transform.position);
rectBloodPos.anchoredPosition = new Vector2 (vec2.x - Screen.width / + , vec2.y - Screen.height / + );
}
实现效果图:

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

什么鬼,居然凭空出现UI,后来研究改进:
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 / + , vec2.y - Screen.height / + );
}
else
rectBloodPos.gameObject.SetActive (false); lastTime = curtTime; }
这种方法的原理是,当摄像机范围内出现挂有该脚本的物体,且该物体上存在Render组件的,则触发绘制UI。
虽然这个方法很好用,但是由于物体太多后,影响性能,故再次改进:
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 > && viewPos.x >= && viewPos.x <= && viewPos.y >= && viewPos.y <= )
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 / + , vec2.y - Screen.height / + );
}
else
rectBloodPos.gameObject.SetActive (false);
}
这个方法是用Vector3.Dot()的方法判断摄像机与物体的朝向以及前后从而判定是否显示UI。
以上完美实现NPC血条跟随。
如果小伙伴们有更好的方法,一定要记得分享啊!!!
Unity 检测物体是否在相机视野范围内的更多相关文章
- unity3d中检测一个物体是否在摄像机视野范围内
这个脚本最好是把模型对象的锚点设置在最低点.好了直接上脚本.可以直接复制代码,把CS文件拖到一个Camera上,然后把目标拖到targetTran中去就行了. using UnityEngine; u ...
- R-FCN:基于区域的全卷积网络来检测物体
http://blog.csdn.net/shadow_guo/article/details/51767036 原文标题为“R-FCN: Object Detection via Region-ba ...
- Unity 实现物体破碎效果(转)
感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...
- Selenium解决页面元素不在视野范围内的问题
当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[ ...
- OpenCV 使用光流法检测物体运动
OpenCV 可以使用光流法检测物体运动,贴上代码以及效果. // opticalflow.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...
- Unity查找物体的子物体、孙物体
Unity查找物体下的所有物体 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- Unity中Oculus分屏相机和普通相机一键切换
Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...
- unity中实现物体在一定角度范围内来回旋转
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate : ...
- unity检测鼠标是点击在UI上还是物体上
void Update() { if (Input.GetMouseButtonDown(0)||(Input.touchCount >0 && Input.GetTouch(0 ...
随机推荐
- Python拉勾爬虫——以深圳地区数据分析师为例
拉勾因其结构化的数据比较多因此过去常常被爬,所以在其多次改版之下变得难爬.不过只要清楚它的原理,依然比较好爬.其机制主要就是AJAX异步加载JSON数据,所以至少在搜索页面里翻页url不会变化,而且数 ...
- Java I/O之NIO Socket
PS:本文简单介绍下旧I/O和NIO下的Socket通讯,仅以UDP来示例. TCP/IP协议 首先简单回顾下TCP/IP协议 Application:应用程序:Socket:套接字:Host:主机: ...
- 出现http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException异常
解决方案 1.在eclipse的菜单中,进入Window > Preferences > Java > Installed JREs > Execution Environme ...
- jQuery获取Select选择的Text和Value
jQuery获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...}); //为S ...
- 属性property和字段的区别
在类中定义的一个成员变量叫字段,要把这个成员变量变成一个属性必须加上getter和setter方法
- react.js 获取真实的DOM节点
为了获取真实的dom节点,文本输入框必须有一个 ref 属性,然后 this.refs.[refName] 就会返回这个真实的 DOM 节点. var MyComponent = React.crea ...
- adt的问题An internal error has occurred. After scene creation, #init() must be called
这个问题困扰了我好久,我也尝试去百度.google无济于事啊,让我寝食难安,太难受了,我把它贴出来,希望后人不绕弯子... 解决办法: 即可,解决这一个问题,现在酣畅淋漓,挥洒自如的capy代码了
- mysql---数据控制语言(用户及其权限管理)
用户管理 用户数据所在位置: mysql中的所有用户,都存储在系统数据库(mysql)中的user 表中--不管哪个数据库的用户,都存储在这里.
- 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度
所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...
- oracle 11g centos6 安装
选型:32位的内存是个瓶颈,已经是64位的时代了.使用64位的CentOS6 和 64位的Oracle 11g R2在虚拟机器安装,采用hostonly方式设置网络注意:能上网的网卡要设置一下ICS( ...