这是第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. vue设置点击电话跳转到手机拨打电话的界面
  2. WCF 第四章 绑定 netMsmqBinding
  3. iis 404错误从定向完美方案
  4. 非法操作 login.php,阅文游戏中心 h5游戏接入wiki
  5. 加加减减的奥秘——从数学到魔术的思考(三)
  6. mtk android 5.1 logo,Android ROM DIY之MTK平台手机通用移植
  7. JAVA实现1到100的平方根之和_手算平方根和基于 Java BigInteger 的大整数平方根的实现...
  8. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_7_Lambda表达式有参数有返回值的练习...
  9. mysql建表指定表空间_Oracle中建表和指定表空间
  10. 信息论笔记(需要编辑格式)
  11. 如何删除顽固文件或文件夹?
  12. 康佳电视系统升级服务器地址,【当贝市场】康佳智能电视本地升级教程
  13. 苹果服务器是不是在维修,苹果维修中心玩转这些才是真懂iPhone
  14. 数字逻辑电路(二、逻辑代数基础)
  15. 教你怎么快速读出python numpy中给定的array的shape
  16. 串口调试助手没有显示
  17. 2021-2027全球与中国韧带连结植入物市场现状及未来发展趋势
  18. C#串口通讯+BigEndian+Little-Endian(大端和小端方案)
  19. 数电快速入门(二)(复合逻辑运算和逻辑代数的基本定律的介绍)
  20. 给自己5个月,月薪1万唾手可得!

热门文章

  1. TypeError: can't assign to property LAY_TABLE_INDEX on \u7537\u88C5: not an object
  2. 涂鸦智能CBU二次开发指导手册入门版——智能插座
  3. 微信授权登陆界面无法再次弹出,无法用户切换
  4. 【小f的刷题笔记】(JS)单调栈 - 下一个更大元素 LeetCode496 下一个更大元素的下标 LeetCode739 循环数组中下一个更大元素 LeetCode503
  5. WebDAV之葫芦儿·派盘+纸间书摘
  6. 统计学习导论(二)习题
  7. python实现全国省会城市随机出题
  8. linux编写路由器固件,基于linux系统的无线路由器固件组成
  9. 工作三年四面(技术面)里巴巴拿offer阿定级P6,月薪36K(Java岗)章
  10. IEEE官方确认限制华为审稿:为保护会员,必须遵守美国法规