這是第123篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。
UWA 問答社區:answer.uwa4d.com
UWA (僅限技術交流)
渲染
Q:當"RenderType" = "Transparent"的時候貌似是沒有辦法接受陰影的。我們需要在場景中做一層半透的地表, 來掩蓋模型和地表之間的接縫,所以需要顯示陰影, 請教各位大佬有什麼好的方法嗎?另外我想了解下為什么半透明物件默認不能接受陰影呢?
A:拋開Unity引擎,從本質上說,半透物體肯定是可以接受陰影的。之前就實現過地表有一塊玻璃材質,會在玻璃上以及下面的物體上都有投射的陰影效果。所以如果自己編寫的Shader,想要接受陰影,只需要採樣Shadowmap,走一下陰影計算的過程就可以了。
對於Unity引擎,我試了一下的確選擇Transparent的RenderType也就沒有了陰影,這個我不是非常清楚是否可以自己在Shader中去強制走一下Shadowmap的處理過程來解決,題主可以試下。
但是題主要注意,半透物體接受陰影的情況下,尤其是題主要解決的這種覆蓋接縫的情況,會導致這部分最後產生的陰影變得比較重的效果,因為半透下面的物體肯定還會有陰影產生,半透的陰影雖然可以受Alpha的影響變淡,但是疊加在一起就會出現變得更暗的問題。當然Transparent的部分不接受陰影,意味著陰影效果經過Alpha Blend之後會變得淡。
感謝賈偉昊@UWA問答社區提供了回答。
UWA:這個問題恰好之前做了些嘗試,正如@賈偉昊所說,內置的Transparent是不接受陰影的,但可以嘗試在自定義shader中強制走Shadowmap的。
參考代碼如下:
但直接用這個Shader也還是沒有效果…因為文檔裡有句話,重點是粗體:
Only opaque objects cast and receive shadows so objects using the built-in Transparent or Particle shaders will neither cast nor receive. Generally, you can use the Transparent Cutout shaders instead for objects with 「gaps」 such as fences, vegetation, etc. Custom Shaders must be pixel-lit and use the Geometry render queue.
所以需要把Render Queue調整到2500:
然後效果就出來了:
該問題來自UWA問答社區,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5b67b9851e88b37d34e651da
Lightmap
Q:我使用ShadowMask模式烘焙好了場景,生成了正確的Lightmap,其中包含Lightcolor和ShadowMask。之後將場景的物體和光照圖等信息用自己的格式存儲,啟動遊戲時再重建整個場景。
但是Lightmap正確設置之後,SHADOWS_SHADOWMSK宏沒有被打開,Shader中只找到了Light Color 的Sampler,並沒有找到ShadowMask的Sampler。
1)如何設置才能開啟SHADOWS_SHADOWMSK的keyword,並正確地將貼圖傳入Shader(不能手動在材質上打開keyword,傳入的貼圖是默認的白色)?
2)另外之前因為場景物體設置成了靜態,烘焙了光照圖後不產生和接受陰影,但是自己從Prefab中創建出來的物體就會產生和接受陰影,是只能加載後將Renderer上的這兩個選項關閉麼?還是有什麼統一設置?
A:第一個問題,從題主的描述上來看,你們重建整個場景,是否連同當時烘焙混合光照的那盞燈光也是重建出來的?如果是,確實會導致ShadowMask無法使用,我這邊的做法是保留場景中用來烘焙混合光的那盞光源,這樣ShadowMask才會起作用,兩者有某種關係。場景中的物件可以保存為Prefab,加載後手動恢復以下Lightmap Index即可,烘焙光源留在場景中別刪。
第二個問題,題主從Prefab直接拖進場景中的物件,需要手動恢復LightmapIndex和UV數據,否則得到的是實時光照和陰影。
感謝Lujian@UWA問答社區提供回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5b63ec54339d267d357c6cb8
製作
Q:我們遊戲類似偶像大師,但是穿模比較嚴重,有什麼成熟的方案嗎?嘗試了SpringBone,但是效果不理想。
A:之前做過換裝遊戲,研究過防穿幫做的比較好的競品,說下他們的做法供參考。
1)模型設計上,首先要規劃好每個服飾部位的範圍,這樣玩家自由搭配的時候,服飾本身穿幫的概率就降低了;
2)同一件服飾做多套模型,根據搭配服飾的size進行替換。以長褲為例:搭配運動鞋、涼鞋等短鞋時,使用正常模型;搭配長筒靴時,褲腿縮短,並且底部一定長度內的半徑縮小,產生長靴包在褲子外面的效果。
上面是針對靜止時穿幫的解決方法,效果是非常棒的,不過由於在美術設計上做了限制,服飾的豐富度會受到影響。對於一般性的動作,我們是使用了DynamicBone,參數仔細調的話效果也不錯。
音舞項目很多大幅度的動作,DynamicBone能起到多大效果就不清楚了。
感謝Walker@UWA問答社區提供回答,歡迎大家轉至社區進一步交流:
https://answer.uwa4d.com/question/5b614dc81e88b37d34e651c3
編輯器
Q:如何在自定義Inspector中同時修改多個物體的位置屬性?當我選定多個物體時,如何在Inspector中同時修改這些物體的位置屬性,例如x分量:
我嘗試自定義Editor腳本來實現,腳本如下:
該腳本會調用以下腳本:
將這個腳本掛在多個物體上,當同時選中這些物體,並點擊Inspector中的改變位置時,期望所有物體的x都會發生變化,但實際只有一個物體的x發生了變化,所以這裡會有什麼問題嗎?
UWA:代碼裡使用了target,而對於選定的多個物體,應當使用 targets ,該數組保存了選定的多個物體,如果只選擇一個物體時,則應當使用target。
該回答由UWA提供,歡迎大家轉至社區進一步交流:
https://answer.uwa4d.com/question/5b614dc81e88b37d34e651c3
編輯器
Q:Asset Serialization Mode中不同的序列化方式在運行時會有區別嗎?「Binary」和「Force Text」是只會在Ediotr中有所不同,還是會影響到構建後的APP?或者說,選擇不同的方式是否對APP的大小以及運行時的速度造成影響呢?
UWA:「Force Text」將Prefabs、scenes、meta files以及其他Asset文件用YAML的文本格式存儲,這樣雖然會在Editor中運行造成一定性能的損失,但其有一個最大的好處是,能夠處理Git這類版本管理中的衝突。而在生成APP時,Unity會將這些資源都進行二進位化。分別使用「binary」和「force text」對項目進行構建會發現,生成的APP的大小是一樣的,也就是說,構建過程中」force text」的文件也會轉為二進位。
該回答由UWA提供,歡迎大家轉至社區進一步交流:
https://answer.uwa4d.com/question/5b614dc81e88b37d34e651c3
今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。
官方技術博客:blog.uwa4d.com官方問答社區:answer.uwa4d.com官方技術(僅限技術交流)
封面圖片來自網絡
UWA GOT (Online) 內測中
構建高質量的管理流水線,讓每一次測試更有意義!
近期精彩回顧基於屏幕空間渲染的液體模擬 【虛幻引擎學習之路】基於Unreal引擎的大地形加載研究【萬象更新】看完性能簡報,想不優化好都難!UWA問答:用心解決「你」的每一個問題!