先上效果图,只凭文字描述,脑补应该有些困难- -

如图:有三个角色(我们暂且从左到右叫它们A、B、C),一个2D UI(中间动作选择的框框),一个cube(右边的方块)

cube挡住了角色C的头顶信息

2D UI挡住了角色和cube

共同点是只显示未被遮挡的部分,遮挡的部分不显示

相信大多数人在看我这篇文章之前已经看过雨松momo的《人物头顶名称与血条更新与绘制》

没看过的可以去看看:http://www.xuanyusong.com/archives/1032

如果直接使用雨松momo文章中的代码的话,那么你会发现有一些问题,如图

这里我没有用血条,只绘制了文字,都一样的!

第一:因为是用OnGUI绘制的,所以使用的过程之中角色昵称和血条会挡住NGUI创建的UI。你可以脑补一下当你打开背包时,一排文字和血条挡住了你的背包。。。

第二:当角色被其他物体遮挡时,这里我说的是3D物体,不是UI。怎么说比较好理解呢!!就好比角色走到了墙后面,角色已经被墙遮挡住了,但是角色昵称和血条依旧显示(或许有一些人就要这种效果!好吧,至少在我的项目中这种效果给我的感觉是非常差的)

第三:当同一个场景出现两个角色时,两个角色都有自己的昵称和血条,如果你和另个角色距离太远且旋转了角度时,名称和血条居然奇迹的出现在了天上!没错,就是天上

......以上所述只是指出一些bug,并没有多余的意思,大家勿喷,我也是菜鸟,只是和大家分享下经验!!

雨松momo的写这篇文章的目的也就是给大家一个思路,具体在项目中怎么实现成预想效果得靠自己了

这个思路挺好,但是由于一些我自身项目的原因就暂且不用这个思路,这个思路大家可以去看看,以后肯定能用到

现在用另外一种思路实现,这里我们要学到一个东西:Layer(层)

关于layer的介绍请看圣典:http://game.ceeger.com/Components/Layers.html

其实我自己也没有看过,为了写这篇文章才去搜的,自己没事的时候瞎点点就知道是干嘛的了

因为我们要用到NGUI,所以先导入NGUI插件包

进入正题:

1、创建一个空GameObject,改名为NamePanel,设为角色子物体,然后Reset并且调整位置到角色头顶位置

2、将NamePanel的Layer设置和角色同一个层,并且添加一个UIPanel

3、在NamePanel下添加UILabel,方法为:选中NamePanel->NGUI->Create->Label,并且将Label Overflow属性设置为ResizeFreely(自动适应文字大小以及长度的)

4、设置UILabel组件的属性。字体、显示文字、字体颜色。Effect选择OutLine,颜色选择为黑色,这个参数是描边的,让字体更清晰

咦,搞毛啊,字体怎么这么大啊?把字体修改小一点,10、5、1,尼玛怎么还是这么大,而且还看不清了

别急别急,不是你操作错误,是还没操作完!

我一开始遇到这个问题的时候我也纳闷了,后来想了想,有可能是没有添加UIRoot的原因

用过NGUI的都知道,UIRoot是NGUI必不可少的一部分,在手机上自适应分辨率就靠它了

那既然知道原因了,我们就添加一个UIRoot试试呗

5、选择NamePanel,添加一个UIRoot组件,Scaling Style选择FixedSizeOnMobiles

哈哈,字体恢复正常了!如果感觉字体比较小,可以在把字体调大一些

运行游戏,你会发现角色移动的时候,头顶信息虽然跟随角色了,但是角色旋转或相机旋转的时候,头顶信息旋转面向摄像机。如果你就想这样,那是大大滴不行的,不能图方便就少了代码

现在我们来写代码,代码很简单

     public GameObject targets;
private Camera camera; void Start()
{
//获得主摄像机
camera = Camera.main;
} void Update()
{
//设置旋转角度
targets.transform.rotation = camera.transform.rotation;
}

保存代码,将脚本挂到角色上,然后把NamePanel拖到参数targets

最后运行游戏,在看看效果,ok,完美

最后总结一下:

代码上是非常简单的,看我代码就知道了,可以说就只有一句代码。。。

主要就是设置层,层一定要分清楚,很重要!

本文地址:http://www.cnblogs.com/shenggege/p/4179012.html

unity3d 角色头顶信息3D&2D遮挡解决方案(一)的更多相关文章

  1. unity3d 角色头顶信息3D&2D遮挡解决方案(二)

    在阅读本文之前请先阅读上一篇文章:http://www.cnblogs.com/shenggege/p/4179012.html 本来一篇文章就可以说完了,但是上次只是实现了已知的一些功能 后来在实际 ...

  2. Unity3D人物头顶名称与血条更新与绘制

    using UnityEngine; using System.Collections; public class NPC : MonoBehaviour { //主摄像机对象 private Cam ...

  3. 【转载】3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解

    原文:3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解 3D中z值会影响屏幕坐标系到世界坐标系之间的转换,2D中Z值不会产生影响(而只 ...

  4. 智慧机房3D可视化技术解决方案

    随着夏季气温越来越高,机房内大量设备同步工作时,难免使机房内温度飙升. 机房温度每升高10℃,计算机的可靠性就下降25% 磁盘磁带也会因热涨效应造成记录错误 计算机的时钟主频在温度过高都会降低 UPS ...

  5. Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    本文为霍格沃兹测试学院学员学习笔记. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”. ...

  6. unity3d 摄像机跟随角色时被物体遮挡解决方案

    参考文章:http://www.xuanyusong.com/archives/1991 在看此文章时请先看上面的参考文章 看完以上文章后,你也许会想人家都已经给出所有代码了,你还写个毛啊 别急,现在 ...

  7. Unity3D使用溶解技术解决障碍物遮挡

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  8. Unity3D 角色(物体) 移动方法 合集

    1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...

  9. Unity3D ——强大的跨平台3D游戏开发工具(五)

    第九章 图形用户界面类G.U.I 您在玩很多3D游戏的时候,不知是否注意到在游戏界面中,总有一些图形和文字信息是不随着3D视角的改变而改变的.这也是由于游戏本身的要求而决定的.比如说英雄的生命值,聊天 ...

随机推荐

  1. ASP.NET CORE 边学边记之 SwaggerUI简单配置

    前言 当使用 ASP.NET CORE 开发WebApi程序时候,一般使用SwaggerUI生成接口文档.本文记录最简单的一个配置.(生成的文档无注释) 操作 首先安装Nuget包. 然后在Start ...

  2. WCF 双向通讯实例-简易的聊天程序

    源码下载 程序分四个部分: 1.原理 使用WCF的nettcp绑定.nettcp绑定类似原来的RPC,即.net remoting,只是在WCF提供统一协定,同一服务可以拥有多种客户端. 2.代码展示 ...

  3. Redis通过IO进行序列化+反序列化

    必须引用序列化Serializable接口 创建类:Role package com.wbg.springRedis.entity; import java.io.Serializable; publ ...

  4. 使用ITextSharper小结

    用到了生成PDF版的合同,上网研究了一圈,发现不需要服务器端安装插件的,比较好用的就是这个ITextSharper了,于是便开始了研究. 1.解决汉字不显示的问题,指定一下字体,默认的字体好像不支持中 ...

  5. List<子类>转List<父类>过程中犯的一些错误

    新人犯的错误,记录一下供以后参考. 有两个类 public class A { public string Name{get;set;} } public class B:A { public int ...

  6. Node.js笔记07——不使用generator自定义一个项目,深入了解项目结构

    一.初始化项目 新建项目 git init manager 新建view文件夹,建几个静态文件夹 新建app.js 快速初始化项目依赖 npm init -y 安装express npm instal ...

  7. php新闻静态化方法

    $view=file_get_contents('./a.tpl'); //新闻详情页模板模式,需要数据位置定义标签如{title},{content} $php_content=str_replac ...

  8. 谨慎修改Oracle数据库字符集(UTF8<->ZHS16GBK)

      Preface       Today,I'm gonna say something what is related with the character set in Oracle datab ...

  9. es6 数组扩展方法

    1.扩展运算符 含义: 扩展运算符,三个点(...),将一个数组转为用逗号分隔的参数顺序. 例如: console.log([1,2,3]); console.log(...[1,2,3]);   结 ...

  10. ztree的用法

    哎哟,好久没写什么这个虽然没人看的博客了,其实这段时间情绪非常低谷,就没有写博客了,不过我还是回来了,回到正题,在前端页面编程的时候,我们经常用到树状,用原始的树状呢,功能没有那么强大,所以这个时候 ...