不能直接获取?聊聊如何在Shader Graph中获取深度图

0x00 前言

在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享。主要涵盖了** StreamingAssets、Profiler、Playable、Particle、Spine、Launcher、Scripting 、Shader、 Shader Graph**等领域,其中会着重介绍一下是用一个workaround的方式在ShaderGraph中获取_CameraDepthTexture。

同时,也欢迎大家加入我们这个讨论干货的官方技术群,交流看法分享经验。
Unity官方社区交流群:629212643

0x01 StreamingAssets

Q:请问一下,在Unity2018.2版本里,Unity会将放在StreamingAssets文件夹下的js文件当作Unity的UnityScript进行编译,但是我的资源里面有html页面,需要用到这个js文件。

A:我们分别在2018.2和2018.1上进行了测试。在Unity2018.2中,的确会将StreamingAssets文件夹下的js文件当作UnityScript进行编译,这应该是2018.2之后出现的一个Bug。

这个Bug已经提交,相关链接可以查看这里:
https://issuetracker.unity3d.com/issues/non-unity-javascript-files-inside-the-streamingassets-folder-are-being-compiled-as-unityscript-files。

0x02 Profiler

Q:请问使用Profiler.BeginSample去标识代码块或者方法以便在Profiler性能分析工具中查看对应代码块的资源消耗,在unity2017.4.5版本将标识写在脚本的start无法成功标识,然而一样的代码在unity5.4版本却可以标识出来,但在标识写在unity2017.4.5的Update方法貌似也可以标识代码块。这个问题是版本问题吗?在2017.4.5的版本在某些初始化时应该怎样成功呢?

A:嗯。查了一下2017.3之后的版本修改了profiler数据的发送方式,从以前的frame base变成了stream base,在第一帧engine向editor发送的profiler数据丢掉了很多sampler,所以导致没有显示出来。
但是beginsample并不是不会在start方法中生效,游戏启动之后开启脚本的话还是可以看到的。启动时sampler不全的问题应该在2018上进行了修改。
WechatIMG145.jpeg
所以,简单的说,没有显示BeginSample去标识代码块的原因是在2017.3-2017.4时有的sampler被丢弃了。并不是针对某个特定的方法。

0x03 Playable

Q:在使用Playable的api时遇到了一些问题,下面第一张图是正常的情况。第二张图是调用:

	mixerPlayable.SetInputWeight(0, 1.5f);

将input0的权重设置为1.5之后的情况。整个模型被不正确的拉伸,并且动作表现错误。
屏幕快照 2018-07-30 上午11.50.06.png

屏幕快照 2018-07-30 上午11.48.54.png

A: playerable mixer的混合是这样的机制:Weight1 * animation1 + Weight2 * animation2+Weight3 * animation3。因此在权重总和大于1的时候会出现问题。建议对传入的权重进行归一化。

0x04 Particle

Q: 我有这样一个结构,刚刚创建是正常的。
24BA21F38FF900E835A5532E8B77C511.png
现在把它Disable掉后调转180度。
CE2D84D29BDF47670C06ABB3C50B67F1.png
再激活,黄色部分的发射器是正常的,红色是子粒子,发射错误。
10CE4BA8C97F617B3CFCC8B48A558F39.png

A: 经过测试,这是一个Bug,即在play mode的情况下,disable掉parent对象并修改其transform数据后,subemitter并没有正确继承其parent的transform数据。
该问题已经向开发人员提交了Bug,可以在此查看:
https://issuetracker.unity3d.com/issues/particle-subemitters-dont-inherit-parents-rotation-correctly-while-the-parent-object-is-disabled-in-play-mode

0x05 Spine

Q:请问大家,当spine导出图片是两张时,unity编辑器里播放的动画就是乱的。有什么解决办法吗?
46FBC4D2E8E7861DA084A2253F14FD02.jpg

A: 导出设置里的“缩放”选项的scale缩小一下,比如改成0.8,导成一张。(成都-树林)383CB213558F79B7CBEEB4F46C8917DC.png

Q:还是不够放到一张,可以再缩小吗?
A:去掉空白处,图集小很多。(成都-树林)
251E4EDE65739133C2E70B2A7F3040AD.png

0x06 Launcher

Q:我遇到了启动界面白屏的问题,5.6.0和2018最新版本都有,而且网上讲的办法都试过了,都不行,试了一整天了。
F9A1B874CF7B4B9C6390A1E37F96F082.jpg

A:白屏的问题解决了,怀疑是双显卡导致的,Unity的快捷方式右键可以选择运行的显卡,我来回切了两次就可以了。(深圳~刘彦)
A:这种并非卡在loading页面的白屏,很多时候是DX的驱动不兼容造成的,可以尝试切换运行的显卡,也可以尝试一下在命令行强制使用GL启动。相关命令行参数可以参考这个文档:https://docs.unity3d.com/Manual/CommandLineArguments.html

Q:无限卡Loading…有人遇到过么?
03A2386A0B6148BA6B6E03C3EF7DAE10.jpg

A:卡Loading的问题,很多时候可以看看editor.log里面的相关输出。
例如下面这样的log:

No sufficient permissions while processing request "https://core.cloud.unity3d.com/api/login", HTTP error code 401

一般卡loading基本都是网络原因的多。可以试试断网,进入离线模式。有vpn的话也可以先去掉vpn这些,有的时候是因为vpn的各种奇葩的配置导致的,当然还可以查看一下防火墙的设置。

还有另外一种情况,例如下面这样的Log:

COMMAND LINE ARGUMENTS:
D:\u2017.1\Editor\Unity.exe [CEF] undefined in file:///C%3A%2FUsers%2Falex%2FAppData%2FRoaming%2FUnity%2FPackages%2Fnode_modules%2Funity-editor-home%2Fdist/assets/unity-editor-home.js at line 39 Error loading https://api.unity.com/v1/oauth2/authorize?client_id=launcher&display=launcher&locale=en_US&response_type=code&redirect_uri=launcher://unity/C%3A%2FUsers%2Falex%2FAppData%2FRoaming%2FUnity%2FPackages%2Fnode_modules%2Funity-editor-home%2Fdist/index.html#/login

此时可以考虑移除"C:\Users\XXXXXX\AppData\LocalLow\Unity"文件夹,因为该文件夹会缓存一些登陆信息,移除之后再尝试启动Editor。

0x07 Scripting

Q:刚学u3d不久,想问几个问题:
1.公司里是怎么生成json文件的
2.数据库的增删改,是直接在数据库文件里修改,还是写代码修改,如果公司有自己的服务器,
怎么拿到服务器里的数据.
求经验大佬来指教.
A:绝大多数编程语言都有生成json的方法,直接调用即可,比如java可以使用gson包。QQ20180731-0.png
B34F0305F6DFA6B799EE8C6A2F80563F.png

数据库操作可以使用第三方框架,java的后台可以考虑hibernate或者mybatis。安卓端本地的sqlite可以使用content provider来调用数据库。Unity也有自己的使用sqlite的方法,不过我没用过。(南京-科穆宁)

Q:话说开发手机ARCore要测试好不方便,每次都要打包出来.....请问大家有碰到过这个问题吗?有好的测试方法吗?谢谢~
A:Unity有提供一个叫做EditorConnection的类,可以用来满足类似的需求。相关文档可以查阅:
https://docs.unity3d.com/ScriptReference/Networking.PlayerConnection.EditorConnection.html

0x08 Shader Shader Graph

Q:怎样让着色器弄成这样,我翻了文档,没查到。。。
F90EDECF52F5D46ACAE74F3D7F48DD08.png

A:这个是因为Shader文件中没有标示出ShaderSnippets,比如你创建一个surface shader,然后把CGPROGRAM去掉,也会是这个效果。
67123F5A5B0CEE54DBB6ED16EAD93143.png

Q:请问如何在ShaderGraph中获取深度图,例如_CameraDepthTexture?Unity版本2018.2。
屏幕快照 2018-07-31 上午11.31.39.png

A: 默认情况下,ShaderGraph没有提供接口直接获取_CameraDepthTexture的。
但是有一个workaround的方式可以来获取_CameraDepthTexture。即创建一个新的property,该property的name和reference都叫_CameraDepthTexture,与此同时不勾选exposed。
屏幕快照 2018-07-31 上午11.34.54.png

同时,打开LightWeightRenderPipeline Asset中的深度图选项。
1533008271533.jpg

场景中的Camera要添加一个LightweightAdditionalCameraData组建,并且也打开深度图的选项。
1533011712705.jpg
之后,我们就可以正常的获取深度图_CameraDepthTexture了。
QQ20180731-1.png

0x09 后记

好了,以上就是想和大家分享的几个在群里讨论的小问题。
再次,欢迎大家加入我们这个讨论干货的官方技术群,交流分享呀。
Unity官方社区交流群:629212643

posted @ 2018-08-01 09:53  慕容小匹夫  阅读(6230)  评论(3编辑  收藏  举报