不能直接獲取?聊聊如何在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章