天天看點

技術分享連載(八十七)

Q1:我們每次大批量地合入美術資源時,經常會出現建構出來的版本出現材質引用丢失、Animator Controller引用錯誤、貼圖引用錯誤等資源引用錯誤的問題,美術資源在本地是正确的,其他人機器上Editor看也是正确的,建構機Editor看也是正确的,但建構出來的Bundle是壞的。有時删除Bundle再編會解決,有時則不行,目前遇到這種情況,隻能讓程式同僚在建構機上删Meta重新做一次Prefab,費時費力而且不規範。

想問問這是Unity的Bug嗎?大家有沒有規避或者優化的方法?在管理美術資源合入的時候有沒有更好的流程,我們目前使用Perforce管理Unity工程,要求美術顯式上傳資源配套的Meta檔案。

我根據我們項目遇到過的問題猜測下,我覺得項目資源導入某個地方有問題的可能性更大些,題主是否可能存在以下情況: 1、是否使用代碼混淆。在Prefab 上挂的腳本忘記添加到排除混淆的清單,導緻序列化的字段被混淆,打完Bundle後的Prefab資源加載時候,挂接的腳本出現引用錯誤; 2、資源導入都重載過OnPostProcess并處理了資源設定,這一步是否修改了什麼不合理的地方,比如破壞了引用關系; 3、打包AssetBundle時,在建構Bundle 之前有沒有使用檔案操作API(不是 Unity 的AssetDatabase的API)來直接修改了某個檔案夾或者其他會破壞引用關系的行為,然後建構Bundle,完成後恢複檔案夾名字(或者恢複資源原始狀态),這樣丢失引用關系的幾率很大; 4、有沒有可能釋出機器上,看着正常,但是Perforce裡面已經存在一堆已修改的Meta檔案;這種問題常出現于美術本地有兩個A1,A2個相同資源在不同檔案夾,A1受版本控制,但是由于某種操作,本地臨時資源A2使用了原本A1的Guid,原本正确的 A1 被迫使用了不正确的新生成Guid(相當于兩人交換),然後上傳了A1的Meta,結果釋出機器的下來的A1 Meta就會跟别人丢失引用,或者更新下來本地重新配置設定了新的Guid;美術策劃最容易犯這個錯誤; 5、我們是Unity 5.3.8p2,上周遇到一個疑似bug,美術多上傳了一組相同的資源,我們更新下來都會重新生成Guid,但是很多挂起的Meta在Unity裡重新導入後,在版本控制裡神奇地消失了,但修改還在; 6、如果都不是,隻能嘗試最小排除法了,删除項目絕大部分資源,一點點增加,然後打包,重制,排除原因;不行的話然後删除代碼,一點點添加,打包,重制...有時候笨辦法也是最容易接近真相的。

該問題來自UWA問答社群,感謝Yaukey提供了回答,如您對該問題仍有疑問,可以轉至社群進行進一步交流。

https://answer.uwa4d.com/question/5a0e8184e8a3d9357ce19473

Q2:我在UGUI 使用一個UIRoot,類型使用Screen Space - Camera,使用錄影機的 Culling Mask, 如果UIRoot可視,下面的UI子物體設定不可視Layer,是不是不會被裁掉?有沒有什麼解決辦法嗎?

UGUI的網格合并是以Canvas為機關的,是以隻能改Canvas的Layer才有效。如果隻是個别UI元素要快速隐藏和顯示,可以考慮用Scale為0來做,Scale為0時UI的頂點資訊會被清空,是以隐藏時就不會參與網格重建了。

該問題來自UWA問答社群,如您對該問題仍有疑問,可以轉至社群進行進一步交流。

https://answer.uwa4d.com/question/5a10004eabfda3486d8d6811

Q3:我在Unity 5.5.4版本下烘焙建築物(Windows平台下),中間樓層出現黑塊,請問什麼原因導緻呢?,我隻用了一個方向燈,但烘焙的時候環境色用了白色,如下圖:

上傳了工程例子供參考:testLightmap.unitypackage

技術分享連載(八十七)
我找到了另一種方式,修改LightmapParameters的,建立一個LightmapParameters,修改裡面的Backface,Tolerance改為很小的值就行,我的是0.2,如圖:
技術分享連載(八十七)

https://answer.uwa4d.com/question/5a07e839e923796076c9b5db

Q4:NGUI(3.11.1)、Unity5.6.4版本下出現兩個Panel控件後,通過RenderQ控制特效層級失效的情況,具體操作如下:

在一個UIroot下面有兩個Panel,Panel A 下面有個Effect 通過腳本particleLayerControl.cs 控制Render Q 來解決在UI上特效的層級問題,當有另一個Panel B(一個空的Panel,它的layer < Panel A的Layer),就會發生特效永遠最先繪制的問題。在附件中有個測試場景:

當沒有Panel B的時候是正常的,我通過FrameDebug調試發現,當Panel B 被啟用後,特效是永遠最先繪制的,但通過讀取Render Q 的值,可是特效要大于UI,不知道是為什麼。

上傳了例子工程供參考:testRenderQ.unitypackage

測了下例子确實可以複現。這是因為較新版本的NGUI,UI Panel也加入了SortingOrder的概念,在開啟Panel B時,Panel A的SortingOrder從0變為1(Panel B的Depth比Panel A的Depth小),這個時候粒子的SortingOrder還是0,是以就被覆寫掉了。如果把Panel B禁用了,或者把PanelB的Depth改到40(大于Panel A的Depth)都可以使得粒子出現。 是以需要在particleLayerControl中加上SortingOrder的處理,即保持粒子的SortingOrder和所在的UI Panel的SortingOrder始終是相同的。

https://answer.uwa4d.com/question/5a0a50113a88251e734e5628

Q5:我想問下Unreal 4的 Movable光源的Shadow Map Cache問題,它的具體更新政策是什麼樣的呢?如何處理動态物體與靜态物體的關系?需不需要對Shadow Map進行Cascade?

我同時也參考了Cry Engine的文檔:

http://docs.cryengine.com/display/SDKDOC2/Cached+Shadows

同時如果想移植到Unity,可行嗎?或者我想解決大面積實時陰影的問題(光源方向會變化,大部分物體是動态物體 但是頻率都不高)有什麼解決方案嗎?我可以在光源Space下預烘焙資料來達到光源方向變化,用一張Shadow Map的可能性嗎?類似 Directional Light Map那種建立空間的?

Unreal 4的這個Movable Light的Shadow Map Cache隻能給Static、Stationary物體用,是以我覺得其實是想給Movable光照下的Static物體陰影計算做個優化。但是Mobile端沒必要用Movable,Stationary就好,Static物體的陰影是預計算的。 Unreal 4的動态物體在計算陰影的時候會計算兩次,一次是從靜态場景投射到動态物體,一次是動态物體投射到靜态場景。在計算靜态場景投射到動态物體陰影時,引擎會緩存一張靜态場景的Shadow Map,用于計算投射到動态物體上的陰影。是以,對于動态物體也能接收到來自靜态場景的精确陰影遮擋,但是這個方式比較耗時,而且mobile也不支援。 Unreal 4也提供了類似Unity的對靜态場景投射到動态物體陰影近似解決方案,也是将shadow的預計算結果存儲到帶有間接光資訊(也是SH)的點雲(在Unity中就是light probe)中,然後根據動态物體的位置從點雲插值出陰影遮擋,但是這種方式隻能得到物體整體明暗度的變化,無法計算精确陰影。Unreal 4是推薦mobile上使用後面一種方法的。 需要補充一下的是,Unity解決動态物體接受靜态物體烘焙陰影也是采用Light Probe的。題主說是動态光源,動态物體,最好還是實時陰影計算。如果是采用Shadow Map Cache的方案做優化,可能得看具體場景和需求。預計算烘焙多個Shadow Map的方案可能需要考慮兩個因素,一是光源變化,二是動态物體變化。如果動态物體和光源變化頻率都不高,那麼可以嘗試對它們采樣預計算好Shadow Map。但是這樣帶來的Shadow Map占用空間和記憶體開銷我們也不清楚,可能得嘗試一下才知道。 以上回答由UWA提供。
關于Unreal 4的實作,樓上已經說得很詳細了,可以參考Unreal 4源碼ShadowSetup.cpp/ShadowDepthRendering.cpp,搜尋SDCM_StaticPrimitivesOnly相關的代碼即可,我補充一下其他問題: 1、針對動靜物體怎麼處理 在手機上比較難完美,可以針對靜物渲染一張SM,動态物件用planar shadow解決 2、Shadow Map Cascade 緩存的話,Shadow Map不能随時更新,如果鏡頭頻繁大距離移動,cascade不能跟随鏡頭随時更新,過度可能會不自然,這需要根據項目特性權衡 3、能不能光源動,Shadow Map用同一張 看你怎麼動,如果是模拟日光,輕微轉角,那你隻能放棄精确陰影計算,在判斷某個空間點是否在陰影區時增加偏轉角,相當于把陰影做平行四邊形變形 如果想360度轉,目前我也沒有很好的思路能兼顧cache和平滑轉動時的過度,畢竟物體的四面都長得不一樣,不可能用一張shadow map做平行四邊形變形而不穿幫。 感謝 招文勇提供了回答。

原文出處:侑虎科技

本文作者:admin

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。

繼續閱讀