摘要:本文原创,转载请注明出处: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 检测物体是否在相机视野范围内的更多相关文章

  1. unity3d中检测一个物体是否在摄像机视野范围内

    这个脚本最好是把模型对象的锚点设置在最低点.好了直接上脚本.可以直接复制代码,把CS文件拖到一个Camera上,然后把目标拖到targetTran中去就行了. using UnityEngine; u ...

  2. R-FCN:基于区域的全卷积网络来检测物体

    http://blog.csdn.net/shadow_guo/article/details/51767036 原文标题为“R-FCN: Object Detection via Region-ba ...

  3. Unity 实现物体破碎效果(转)

    感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...

  4. Selenium解决页面元素不在视野范围内的问题

    当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[ ...

  5. OpenCV 使用光流法检测物体运动

    OpenCV 可以使用光流法检测物体运动,贴上代码以及效果. // opticalflow.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  6. Unity查找物体的子物体、孙物体

    Unity查找物体下的所有物体 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  7. Unity中Oculus分屏相机和普通相机一键切换

    Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...

  8. unity中实现物体在一定角度范围内来回旋转

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate : ...

  9. unity检测鼠标是点击在UI上还是物体上

    void Update() { if (Input.GetMouseButtonDown(0)||(Input.touchCount >0 && Input.GetTouch(0 ...

随机推荐

  1. hadoop使用笔记

    一:hadoop程序添加三方包: 使用hadoop jar 运行时 抛出 java.lang.NoClassDefFoundError 原因:找不到三方包 解决方案: 1.可以将需要使用的包添加进 $ ...

  2. TypeScript设计模式之门面、适配器

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  3. 一份关于组建.NET Core开源团队的倡议书

    组建这个.NET Core开源团队,旨在为社区出一份力,对自己能力也是一个提升,是一个即利于他人,也利于自己的想法和行动.如果你有很多想法,如果你需要认识更多志同道合的朋友,如果你想展示自己的才华,如 ...

  4. 基于cxf开发restful风格的Web Service

    一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点 ...

  5. T——SQL基础语句(定义变量,赋值,取值,分支,循环,存储过程)

    T--SQL基础语句 1.定义变量: declare @变量名 数据类型 ; declare @a int ; declare @b  nvarchar(10) ; 2.赋值: 法1:set @变量名 ...

  6. php表单提交--文件

    创建一个文件上传表单 允许用户从表单上传文件是非常有用的. 请看下面这个供上传文件的 HTML 表单: <!doctype html> <html> <head> ...

  7. (9)集合之Set,HashSet,TreeSet

    TreeSet子类 注意事项: 1.向TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储 2.往TreeSet添加元素的时候,如果元素本身不具备自 ...

  8. (1) 类构造块,this(),static,单例模式串讲

    类构造块 在类只用一对大括号包含的内容,构造所有的对象时都会执行的内容,如果某个类有好几个够赞函数,公共部分抽取出来,放到构造块中. clas Boy { ... { syso("哭...& ...

  9. [译]Selenium Python文档:六、页面对象

    本章是介绍页面对象设计模式的教程.一个页面对象代表了web应用用户接口的一片区域,你的测试代码将与之交互的. 使用页面对象模式的好处: 可以创建在多个测试样例中都可使用的可重用代码 减少重复性代码 如 ...

  10. 免安装版Tomcat配置内存

    去安装目录下 找 bin 目录找到这个文件 catalina.bat在文件的头部加上 set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k具体大小自己调整