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

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

      后来在实际运用中遇到了一个问题,请看图。更多精彩请关注【狗刨学习网】

       

      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. <font face="新宋体" size="2">1     private Camera camera;//主摄像机
  2. 2     private GameObject player;//角色

  3. 4     void Start()
  4. 5     {
  5. 6         camera = Camera.main;
  6. 7         player = GameObject.Find("player");
  7. 8     }

  8. 10     void FixedUpdate()
  9. 11     {
  10. 12         //计算角色和主相机的距离
  11. 13         Debug.Log(Vector3.Distance(player.transform.localPosition, camera.transform.localPosition));
  12. 14     }</font>
复制代码

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

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

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

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

     ok,写代码试试
  1. <font face="新宋体" size="2">1     //挂上脚本后把playerName拖放到个变量上
  2. 2     public GameObject playerName;

  3. 4     private Camera camera;//主摄像机
  4. 5     private GameObject player;//角色

  5. 7     void Start()
  6. 8     {
  7. 9         camera = Camera.main;
  8. 10         player = GameObject.Find("player");
  9. 11     }
  10. 12 
  11. 13     void FixedUpdate()
  12. 14     {
  13. 15         //计算角色和主相机的距离
  14. 16         float Distance = Vector3.Distance(player.transform.localPosition, camera.transform.localPosition);
  15. 17 
  16. 18         //0.1f / 1.5f 约等于 0.07f
  17. 19         float temScale = Distance * 0.07f;
  18. 20 
  19. 21         //置新的 playerName 大小
  20. 22         playerName.transform.localScale = new Vector3(temScale, temScale, temScale);
  21. 23     }</font>
复制代码

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

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

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

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

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

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

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

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

      解决方法很简单

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值