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

在阅读本文之前请先阅读上一篇文章:http://www.cnblogs.com/shenggege/p/4179012.html

本来一篇文章就可以说完了,但是上次只是实现了已知的一些功能

后来在实际运用中遇到了一个问题,请看图

3D场景嘛!近大远小!

当我把视角移动得很远时,头顶信息就变得很小了,小得我看不见它显示的是什么

而且如果有多个玩家的话,每个玩家都有头顶信息

当我离另外一个玩家很远时,那个玩家的头顶信息就看不见了

那么要头顶信息有何意义?

本文就解决这个问题,其实很简单的

下面是解决后的截图:

聪明的小伙伴们是不是一眼就看出来什么思路了呢?

不管你看懂没看懂,请耐心的把本文看完!待我一一道来

首先,我们把要显示的头顶信息所有字体放大10倍

怕你们理解错误我举例说明:

ExpHUDText——FontSize:我原来是20,现在改为200

NameLabel——FontSize:同上

这里也许有小伙伴要发问了:那要是有图片怎么办?

嗯,的确,有些项目中需要制作血条,光字体放大了血条还是看不清楚不等于白说吗

我项目中不需要血条,我们这里就略过吧....

哈哈,跟大家开个玩笑!

这个问题我们在最后说,先继续往下看

我项目中用的是一个VIP logo,当玩家花钱充了VIP,这个logo就会显示出来

如图,左边的紫色钻石便是logo图片

因为角色名称有长有短,如果我的logo在固定的位置,那么就会出现logo被角色昵称遮挡

所以我们可以使用锚点来解决这个问题

值得注意的是,我的logo想一直显示在昵称最左边,那么我锚点的目标参照物就要设置成nameLabel

这样的话就可以一直保持在最左边了。

当然,具体看你项目需求,灵活运用

说到这里,如果你每一步都按照我说的做了,那么你会发现字体在场景中非常非常的大

这个时候,我们把playerName Scale的x、y、z都设置为0.1

为什么是0.1呢?因为上文中我们已经把字体放大了10倍

所以为了得到原本看见的字体尺寸,我们要修改playerName的大小。即:1 / 10 = 0.1

怕有些小伙伴看懵了,没事,我上截图来说明一下

如上图,playername只是一个空物体,它是头顶信息的容器

好了,这个时候,我们已经发现头顶信息恢复到原状了,而且还比以前清晰多了

我们手动放大playername,发现值越大,字体也就越大,值越小,字体也就越小

思路来了,我们能不能通过计算角色和摄像机的距离来动态修改这个值呢?

从而实现不管我们摄像机距离角色多远,字体都保持原有所看见的大小

为了证实这个想法,我们动手写代码试试

代码很简单,我就不一一解释了,不懂查手册

 1     private Camera camera;//主摄像机
 2     private GameObject player;//角色
 3
 4     void Start()
 5     {
 6         camera = Camera.main;
 7         player = GameObject.Find("player");
 8     }
 9
10     void FixedUpdate()
11     {
12         //计算角色和主相机的距离
13         Debug.Log(Vector3.Distance(player.transform.localPosition, camera.transform.localPosition));
14     }

将脚本挂在player身上,然后运行

在我的项目中,角色和摄像机最近距离为1.5,最远距离为3(这个值只是在我的项目中)

那也就是说,当角色和摄像机距离为1.5时,playername Scale为0.1

那么当摄像机距离为3时呢?即:0.1 / 1.5 * 3 = 当前 playername Scale

ok,写代码试试

 1     //挂上脚本后把playerName拖放到个变量上
 2     public GameObject playerName;
 3
 4     private Camera camera;//主摄像机
 5     private GameObject player;//角色
 6
 7     void Start()
 8     {
 9         camera = Camera.main;
10         player = GameObject.Find("player");
11     }
12
13     void FixedUpdate()
14     {
15         //计算角色和主相机的距离
16         float Distance = Vector3.Distance(player.transform.localPosition, camera.transform.localPosition);
17
18         //0.1f / 1.5f 约等于 0.07f
19         float temScale = Distance * 0.07f;
20
21         //置新的 playerName 大小
22         playerName.transform.localScale = new Vector3(temScale, temScale, temScale);
23     }

挂上脚本以后运行试试,怎么样,是不是成功了?

不管你怎么移动摄像机,字体永远是这么大

看到这里,上文中说的图片logo知道咋解决了吧

设置好锚点和放大倍数就行了,像字体放大一样操作,其他不用管

然后运行的时候父物体放大,子物体也跟着放大了!

现在又有了一个新的问题,我使用HUDText插件显示 +经验值

因为放大了十倍的原因,HUDText移动速度很慢,而且距离也很小

如果不理解我说的这句话可以自己动手去试试,无法用截图来说明

解决方法很简单

调整HUDText的Offset Curve曲线就可以了

这是我自己的项目我就不打包共享了,也没有太多时间从新新建一个项目

因为我要抓紧学习,过完年带着这个demo去上海找工作,找不到工作可就惨了

好了,就先说到这吧,不懂的多看几遍,也可以给我留言

本文链接:http://www.cnblogs.com/shenggege/p/4192797.html

时间: 2024-12-25 08:50:21

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

unity3d 角色头顶信息3D&2D遮挡解决方案

先上效果图,只凭文字描述,脑补应该有些困难- - 如图:有三个角色(我们暂且从左到右叫它们A.B.C),一个2D UI(中间动作选择的框框),一个cube(右边的方块) cube挡住了角色C的头顶信息 2D UI挡住了角色和cube 共同点是只显示未被遮挡的部分,遮挡的部分不显示 相信大多数人在看我这篇文章之前已经看过雨松momo的<人物头顶名称与血条更新与绘制> 没看过的可以去看看:http://www.xuanyusong.com/archives/1032 如果直接使用雨松momo文章中

Unity3d 角色穿墙, 或者互插的解决方案

如果你在Unity里面使用了Rigidbody, 并且勾选了Is Kinematic 想自己通过Transfrom来控制角色的位置的话.那么你一定会碰到如果角色跑动快了,会插入到其他运动的角色或者静止的单位中,比如墙壁,建筑等等. 1:网上的解决方案: (老的解决方案) 网上到是有解决方案,不过都太复杂,都需要自己去预判下一步的步长,这个就是以前的没有引擎的老方法,原理就是如果下一步会被碰到就把下一步的位置直接设置到碰撞的边缘,而不是走满那一步.既然说到这里我们就要说一下Unity带来的全新的解

Unity3D角色阴影制作

本文将重点介绍两种目前在移动平台上的主流阴影制作技术,同时也会简单介绍两种移动平台上相对较为高级的动态阴影生成方法. 由于目前主流使用Unity3.x在移动平台上并不支持阴影的动态生成技术,所以目前最普遍流行同时性价比也最高的阴影生成方法有以下两种: 1.  简单贴图法 所谓简单贴图法即是直接在角色的角底附加一个阴影半透明贴图,并让其跟随角色一起运动,一般是将该阴影Object成为角色模型的子物体,该种阴影生成效果如下: 阴影的Inspector视图如下: 其中ShadowComponent是控

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

using UnityEngine; using System.Collections; public class NPC : MonoBehaviour { //主摄像机对象 private Camera camera; //NPC名称 private string name = "我是雨松MOMO"; //主角对象 GameObject hero; //NPC模型高度 float npcHeight; //红色血条贴图 public Texture2D blood_red; //黑

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

原文:3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解 3D中z值会影响屏幕坐标系到世界坐标系之间的转换,2D中Z值不会产生影响(而只是屏幕宽高比会产生影响,z值只对深度剔除产生影响).所以U3D中如果用2D摄像机那么屏幕坐标和世界坐标之间的转换需要用指定的2D摄像机才行,如果用主3D摄像机那么UI转换会产生计算结果异常. 一.D3DXMatrixPerspectiveFovLH函数 作用:Builds a left-handed

Megatech.MegaCAD.3D 2D.v2014.Win32_64 计算机辅助设计软件

Megatech.MegaCAD.3D 2D.v2014.Win32_64 计算机辅助设计软件 Megatech.MegaCAD.3D.v2014.Win32_64 2CD计算机辅助设计软件Megatech.MegaCAD.2D.v2014.Win32_64 2CDMegaCAD是一套功能优良的计算机辅助设计软件,该软件由德国Megatech Software BMGH公司研制开发,MegaCAD提供中文界面 .图标菜单.鼠标操作.汉字提示;支持DOS.Windows.WindowsNT.LAN

SQL Server统计信息:问题和解决方案

在网上看到一篇介绍使用统计信息出现的问题已经解决方案,感觉写的非常全面.在自己看的过程中顺便做了翻译.由于本人英文水平有限,可能中间有一些错误.如果有哪里有问题欢迎大家批评指正.建议英文好的直接看原文:SQL Server Statistics: Problems and Solutions 正文: SQL Server统计信息协助查询优化器计算运行查询的最优方式. Holger描述了常见的统计信息出错的事情,并且如何改善 通常你不需要太担心执行SQL查询的方式.他们被传送到查询优化器,首先检查

【Unity 3D】学习笔记二十七:unity游戏脚本(七)

使用C#编写游戏脚本 在前面提到,unity支持三种语言编写脚本:js,C#,boo.入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格.但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高.下面总结下怎么使用C#编写脚本. 继承MonoBehaviour类 在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类.为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来. 在pr

ios7.1安装提示&quot;无法安装应用程序 因为证书无效&quot;的解决方案二(dropbox被封项目转移到Appharbor上)

6月18日起dropbox被天朝封了(这个真是无力吐槽),而ios7.1要求使用ssl安全连接,则需要重新找到一个支持https的免费服务器.Appharbor是个不错的选择,操作简单,此外需要添加配置文件来识别plist,ipa文件,有关如何使用Appharbor转自: 免费ASP和ASP.NET空间Webweb和.NET云计算空间Appharbor 一.Appharbor免费.NET云计算空间申请 PS:Appharbor官网: https://appharbor.com/ 1.进入Apph