马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册帐号
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);
}
实现效果图:
但是随后发现,若摄像机背对物体则如下图:
什么鬼,居然凭空出现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]