这是第151篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


本期目录:

  • 如何规划UI图标图集
  • 如何在Unity中不使用Native DLL实现进程间通讯
  • 如何通过??运算符给物体添加组件
  • 摄像机跟随人物被建筑物遮挡半透方案
  • 如何通过脚本向Timeline增加关键帧

UI

Q:道具图标可能有几百上千个,如果打到同一图集里,大小都有2048P,实际游戏过程中有额外的内存浪费。

按类型拆分也不太好,新手各类道具各一个,所有类型的图集就都引用了一遍,跟打到一个里没太大区别。
如果按等级段来规划,可能会好一点,但是对于像商城或者某些特定UI上展示的图标,很可能就不是同一个等级段的,也会造成引用好多个图集的情况。如果按常用或者不常用来分图集,得要策划全程来跟进这块内容,感觉也很容易出问题。
或者直接对这大量的图标都不打到图集,都是散图,这样虽然不会有太多内存浪费,但渲染效率就低了。

请问下有没有比较好的方案来处理这个问题?

A:1、如果图量远超单屏显示量,那比较实际的是自己实现动态图集,也就是图标是散图,在运行过程中根据需求实时拼装成大图,可以用Render to Texture实现。
2、对于大多数游戏,如果不是常驻画面的界面,以现在机器的性能,忍受一下DrawCall也非不可。

感谢招文勇@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c70038e2b3589332f1a4ade


Script

Q:如何在Unity中不使用Native DLL实现进程间通讯?在Unity中实现IPC遇到了一些问题,主要是.Net 3.5 没有System.IO.MemoryMappedFiles 这个类,而我在制作Unity Editor插件时要用 File mapping的方式实现 IPC,需要普遍适配各个项目,必须兼容.Net3.5,这样似乎除了Import C++编写的DLL之外就没有什么好的方法了,但插件又是纯Editor在用的,所以不想因为这个原因导致游戏无关的DLL可能被打到Build里,所以想请教一下有没有兼容.Net 3.5的共享内核内存实现IPC的方法。

A1:1、纯C#可以socket做IPC,很通用且跨平台。
2、用Native DLL也可以选择是否打进包里,至少现在版本Unity可以。
感谢招文勇@UWA问答社区提供了回答

A2:一些和底层比较近的功能还是自己写Native插件吧,可以通过DLL的Import Setting和宏定义避免你说的问题。

PS:Unity对一些非渲染功能的封装大多效率不高也不太可控,其他诸如Camera、Microphone等等。

感谢志鹏Zipper@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c6fd6142b3589332f1a4add


Script

Q:为什么通过??运算符给物体添加组件添加不上?

public class PlayerMoveTest : MonoBehaviour
{CharacterController controller;private void Awake(){controller = transform.GetComponent<CharacterController>() ?? gameObject.AddComponent<CharacterController>();}
}    
public class PlayerMoveTest : MonoBehaviour
{CharacterController controller;private void Awake(){controller = transform.GetComponent<CharacterController>();if (controller == null){controller = gameObject.AddComponent<CharacterController>();}}
}  

如上面的代码,第一段是不行的,controller 显示为null,而第二段是可以添加上组件的,请问这是为什么?
对于??运算符,难道不是??前面的为null,就会执行??后面的表达式吗?

A1:我试了下:

public class PlayerMoveTest : MonoBehaviour
{CharacterController controller;private void Awake(){controller = transform.GetComponent<CharacterController>();if (controller == null){controller = gameObject.AddComponent<CharacterController>();}}
}  

把上面代码反编译:

    if (GUI.Button(new Rect(100f, 100f, 200f, 80f), "Test") && (Object)base.transform.GetComponent<CharacterController>() == (Object)null){base.gameObject.AddComponent<CharacterController>();}if (GUI.Button(new Rect(200f, 200f, 200f, 80f), "Test2") && (object)base.transform.GetComponent<CharacterController>() == null){base.gameObject.AddComponent<CharacterController>();}   

可以看出2段代码是不一样的,第一个比较的是UnityEngine.Object类型,第二个比较的是System.object类型。

再写段代码测试下:

     var c1 = (object)base.transform.GetComponent<CharacterController>();if(c1 == null)Debug.Log(1);var c2 = (Object)base.transform.GetComponent<CharacterController>();if(c2 ==(Object)null)Debug.Log(2);if(c2 == null)Debug.Log(3);  

输出结果是2和3。

断点调试下这几个值:

原因是UnityEngine.Object类型重载了==运算符,所以"null"和null认为是相等的,而用System.object类型比较的时候认为是不相等的。
感谢deviljz@UWA问答社区提供了回答

A2:看了一下,发现此"null"非彼null:

其实在contor = transform.GetComponent();执行这句的时候已经赋值了,只不过赋的值是"null",看一下打印的就知道两个null有什么区别了。

再加一句,当我打印contor的Type时,在one那里,会报对象的引用未设置为实例,而在two的时候会打印他的类型,也就是说 ?? 操作符左边必须是为未赋值的变量时才会执行右边的,例子看下面的代码b,最后打印的是v,c是我定义的一个未赋值的string c。

感谢Marco@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c7101bc63826a332ad9966c


Script

Q:摄像机跟随角色的时候被建筑物遮挡,想让建筑物半透,这个时候需要射线检测,但是因为性能问题,场景物体不允许添加Collider组件, 用纯Shader写的时候效果总是有些问题,想请教大神们有没有其他方案。

A1:一种做法是,场景做的时候用Box Collider做物体形状的近似来进行物理碰撞的检测,不知道你们不允许使用添加Collider组件是不是也不允许用这种方式。

不知道你纯Shader编写是什么思路,我感觉单纯Shader里是没办法处理这个需求的。

不知道有没有更好的方案,在比较通用又不做很tricky的处理的情况下,感觉物理反而是比较直接、高效的方式。

PS:如果是2.5D的视角,相机不会俯仰的情况下,可以预计算一份2D的数据在Runtime做检索用,不过这里面有限制和问题,我没这么做过,这里只是提一句。
感谢贾伟昊@UWA问答社区提供了回答

A2:在Unity 3D里面确实没有想到比Box Collider来做成场景物体的近似形状来进行物理检测更直接的办法了。

贾伟昊提到可以预计算一份数据做Runtime检测所用,我想起来在Quake系列里面,场景的渲染和物理碰撞检测数据是预先烘焙进了BSP树里面的,Quake在Runtime阶段的碰撞检测是基于BSP的。

感谢张锐@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c74f9e163826a332ad996e5


Timeline

Q:在使用新的Timeline时发现,没有手动添加关键帧的选项/按键,也没有发现相关的API,那应当手动如何添加关键帧呢?先谢过各位~

A:在编辑器中,可以通过鼠标拉动Clip的两边来在Clip的头部或者尾部添加关键帧,并且编辑器中会显示出当前操作中+/-了多少帧。

如果是想Runtime向built-in的轨道添加关键帧,目前Unity确实没有提供相关的接口。
可以通过脚本来实现自定义的Track/Clip,在脚本中控制Timeline的Playhead停留在固定的时间,或者是跳到指定的时间。

具体需要自己实现TrackAsset、PlayableAsset和PlayableBehaviour。
其中:

  • 实现TrackAsset用于提供给外部的Mono脚本来操作Track。
  • 实现PlayableAsset用于提供自定义的Clip,用于为Track提供相关数据。
  • 实现PlayableBehaviour,实现控制Timeline播放的控制逻辑。

感谢张锐@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c6666a92b3589332f1a4a34

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)

(封面图来源来源于网络)

如何规划UI图标图集相关推荐

  1. datagridview 手动添加的行如何进行重载_【厚积薄发】如何规划UI图标图集

    这是第151篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...

  2. UI图标设计素材|风格多样的图标

    无论是软件标识类图标还是功能标识类图标,都需要讲究"创意". 图标服务于更实用的目的,适合描述非常具体的概念.而插图使用隐喻和叙述来描绘大的主题 概念.优图 www.uppsd.c ...

  3. 一招学会绘制UI图标超椭圆

    原创不易,如需转载,请附上本文链接,谢谢支持 https://blog.csdn.net/weixin_44775811/article/details/109372997 超椭圆是介于"方 ...

  4. 扁平化ui设计界面的方式以及扁平化ui图标设计特点

    扁平化是近两年手机图标设计发展的一种趋势,因此作为一名全栈UI设计师,扁平化ui设计界面的方式以及扁平化ui图标设计特点还是非常熟悉的.今天就跟大家谈谈扁平化ui设计界面的方式以及扁平化ui图标设计特 ...

  5. 2016 Micu课堂王铎UI图标设计特训班高级高清原版教程

    2016 Micu课堂王铎UI图标设计特训班高级高清原版教程 下载地址:http://www.javaxxz.com/thread-283753-1-2.html

  6. 8个免费的高质量UI图标大全网站

    UI图标素材是设计师必不可少的设计元素. 高质量的UI图标会让设计师的设计效率事半功倍. 本文分享8个免费的高质量UI图标大全网站. 即时设计资源社区 即时设计资源广场中精选了多款专业免费的UI图标设 ...

  7. jquery 自定义正方形图标_8个设计师必看的,免费UI图标设计资源站,赶紧收藏!...

    图标是我们日常APP及网页设计过程中必不可少的元素之一,通过小小的图标,可以快速方便的实现视觉引导和功能划分.在创作时,我们需要寻找各种各样的图标来满足自己的设计需求,非常浪费时间和精力. 今天,我给 ...

  8. 分享很不错的10个UI图标资源站

    最近迷上了android开发,在开发过程中,发现需要用到的图标很多.于是就在网上到处搜索,但是花了好长时间也没有找到自己想要的图标,慢慢的就开始琢磨这个问题,怎么样找到高质量又免费的图标资源呢,经过查 ...

  9. 火爆全网的5个免费UI图标素材网站!

    图片太花哨,纯文字太单调?别忘了设计师的重要法宝--图标!在界面设计中,图标不仅可以提高界面设计的美观,还可以增加与用户的互动体验.本文将分享5个免费的图标素材网站供设计师挑选,看完记得收藏! 1.即 ...

最新文章

  1. CV绿色的上限和下限
  2. Struts2 interceptor使用经验小结
  3. 聪明人的游戏(3)镜子颠倒了什么?
  4. js: live和die,bind和unbind
  5. wxpython有哪些基本功能_用Python中的wxPython实现最基本的浏览器功能
  6. $ajax({}).done 和 $ajax({}) success 区别
  7. OpenVINO+OpenCV 文本检测与识别
  8. Java 面试之数据库
  9. 四边形不等式优化dp
  10. 《肖申克的救赎》--[美]斯蒂芬·金
  11. 计算机学科a类排名,哈工大17个学科排名位列A类
  12. 做直流逆变中用到的全桥逆变电路测试mos管好坏的方法
  13. 计算机中求声音传输时间公式,计算机常用计算公式汇总
  14. 我是怎么做到开源系统中的文件上传等功能的?
  15. 一个基于.Net高性能跨平台内网穿透工具
  16. 强网杯2019(高明的黑客强网先锋上单)
  17. obsolete or deprecated parameter(s) specified for RDBMS instanc
  18. 字符串模板和dom模板的区别
  19. oracle函数之NULLIF
  20. Linux目录配置与FHS标准

热门文章

  1. UESTC 图论专题 A-D
  2. java腾讯字符串面试题_面试百度、阿里、腾讯,这134道Java面试题你会多少?
  3. Vue 脱坑记 -——查漏补缺
  4. wifi共享精灵2014.04.25.001已经更新,wifi热点中文名走起!
  5. 电子商务解决方案与电子商务发展
  6. 【Dev Club 分享第三期】iOS 黑客技术大揭秘
  7. 用关键词搜索商品拼多多数据接口
  8. android手机系统检测工具下载,手机设备信息检测软件下载-设备信息检测appv1.0 官方版-腾牛安卓网...
  9. 四川高考2021高考成绩查询,2021四川高考成绩查询入口已开通
  10. Ceph cache tier 中 flush 和 evict 机制源码分析