1)Unity如何直接獲取深度緩沖
2)Unity Editor下SpriteAtlas加載的問題
3)無法將GameObject從Project窗口拖拽到SceneView窗口
4)UGUI的事件響應問題
5)iOS設置Texture2D的mipMapBias無效
這是第247篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鍾,認真讀完必有收獲。
UWA 問答社區:answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)
Rendering
Q:查閱了一些資料,發現Unity獲取深度紋理好像都要對每個物體再渲染一次,有什么辦法能直接獲取到深度緩沖省去這一輪渲染嗎?或者直接復制深度緩沖。
A:可以,主要步驟如下:
1.將相機的顏色和深度Buffer通過Camera.SetTargetBuffers重新指向新的RT上(ColorBufferRT、DepthBufferRT);2.通過CommandBuffer加一個AfterForwardOpaque的事件,將ColorBufferRT、DepthBufferRT Blit渲染到兩張新的RT上(后面渲染可以直接使用);
3.通過CommandBuffer加一個AfterEverything的事件,BlitColorBufferRT到CameraTarget上(保證屏幕正確)。
具體細節可參考:https://blog.csdn.net/linjf520/article/details/104964803
感謝范世青@UWA問答社區提供了回答
Texture
Q:使用的版本是Unity 2018.3.6f1下,Unity Editor模式下編輯Prefab,圖片會加載到內存中。導致一開始運行游戲的時候會觸發相關圖集SpriteAtlasManager.atlasRequested的提前調用,導致圖集加載錯誤。

上圖是過早的圖集加載,失敗時檢測到內存中加載的圖片。有沒有辦法在運行游戲的時候清除編輯預制體時內存中的圖片圖集?或者類似的辦法?
補充:在不運行游戲的情況下調用內存查看的接口,發現內存中仍然有很多圖片被加載:

A:這個問題本質是,當引用到Atlas的Sprite加載時,如果內存中沒有Atlas,就會觸發加載圖集的“請求”(atlasRequested)。Editor下編輯Prefab,會生成這個請求,在游戲運行的第一幀,這個請求函數會被調用,而這個請求是由Native層發出的([RequiredByNativeCode]),所以我們沒有辦法控制,跟卸載內存中的資源是沒有關系的。
![]()
這個請求也只會在運行時的第一幀進行調用,所以,不要在第一幀注冊atlasRequested事件,在第一幀之后,或者在需要加載相應Prefab時注冊該函數,就可以避免在啟動游戲時調用該函數。
![]()
感謝Prin@UWA問答社區提供了回答
Editor
Q:最近發現Unity在打開公司的項目中,無法實現Project窗口拖拽GameObject到SceneView窗口,但是新建一個干凈的工程是可以拖拽過去的。猜測是不是因為某個工具或者插件引起的,但是插件和工具太多,逐個排查會比較浪費時間,想問問大佬們有沒有遇見過類似的問題?使用的Unity版本是2019.4。
正常的項目從Project窗口拖拽GameObject到SceneView窗口,圖標是這樣的:

出問題的是這樣的:

目前已經注釋掉外部工具或者插件的SceneView.duringSceneGui 、DragAndDrop相關代碼,問題依然存在。
A:出現問題的原因是:我們重寫了GameObject的Editor,沒有實現OnSceneDrag函數,不實現這個函數就會導致無法將物體從ProjectWindow拖拽到SceneView。
感謝題主馬三小伙兒@UWA問答社區提供了回答
UGUI
Q:UGUI RayCast的無繪制點擊在PC上沒有問題,但是到安卓手機上就穿透了,沒有點擊響應的問題。之前用透明通道為0的Image就都沒問題。
腳本如下:

A:可以把Image的半透明度設置為0,勾選Canvas Renderer上的Cull Transparent Mesh,這樣就可以不進行繪制也能響應點擊事件的。(另外,測試了了題主的代碼,在小米9上沒有出現問題。)
![]()
感謝Xuan@UWA問答社區提供了回答
Texture
Q:使用TextureMipmapStreaming,在iOS真機上,設置Texture2D的mipMapBias無效,這個Texture是從Material中拿到的mainTexture,在Editor下反而生效(圖片會變模糊和清晰)。
版本是Unity2018.4.13,有人遇到同樣的問題嗎?相關設置見下圖:



A:這個要開啟Texture.streamingTextureDiscardUnusedMips = true,不然在內存預算足夠的情況下,是不會丟棄高精度的貼圖的。
感謝梅辰@UWA問答社區提供了回答
封面圖來源:Multipass Translucency
https://lab.uwa4d.com/lab/5b560e9ed7f10a201fd7f44f
今天的分享就到這里。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上准備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ群:793972859(原群已滿員)