Unity3D的一些坑
轉(zhuǎn)載地址:http://blog.csdn.net/yupu56/article/details/53189208
坑1:Unity版本升級(jí),手賤跟著升級(jí),然后項(xiàng)目各種錯(cuò)
解決方案:
新版本先觀望一段時(shí)間,新版本都有坑的。
坑2:Git做版本更新是,有些Prefab的數(shù)據(jù)死活不能同步
解決方案:
1.Edit->Project Settings->Editor 設(shè)置種打開(kāi) meta files 讓meta文件和原始文件一起同步
2.Edit/ProjectSetting/Editor設(shè)置中AssetSerialization改為ForceText就行,但是我們的項(xiàng)目并沒(méi)有解決問(wèn)題,就那兩個(gè)Prefab至今無(wú)解。
坑3:Mac系統(tǒng)上無(wú)法雙開(kāi)Unity
解決方案:
笨的辦法呢,裝兩個(gè)不同版本,或者裝完,拷貝一份。好一點(diǎn)的辦法用命令行再打開(kāi)一個(gè)。在好一點(diǎn)的,寫(xiě)一個(gè)shell腳本,調(diào)用命令行的打開(kāi)Unity命令,已完美解決,在我另一篇文章中。
坑4:Unity打包到Android和IOS端后的StreamingAsset路徑問(wèn)題
string StreamingAssetPath ?
{
get
{
string filePath = ??
#if UNITY_ANDROID && !UNITY_EDITOR ?
? ? ? ? “jar:file://” + Application.dataPath + “!/assets/” + flodername + “/”; ?
#elif UNITY_IPHONE && !UNITY_EDITOR ?
? ? ? ? Application.dataPath + “/Raw/”; ?
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR ?
?“file://” + Application.dataPath + “/StreamingAssets” + “/” + flodername + “/”; ?
#else ?
? ? ? ? string.Empty; ?
#endif ?
return filePath;
}
}
坑5:做UI的時(shí)候,背景圖片太多,大圖太多。
解決方案:切記做UI的時(shí)候美術(shù)給你什么圖就用什么圖,需要裁剪的,復(fù)用的,9空格的,作為技術(shù)支撐,要告訴美術(shù)新手,圖該怎么做。不能怎么做。
坑6:對(duì)Unity操作不當(dāng),或者導(dǎo)入資源過(guò)大時(shí),導(dǎo)致Unity崩潰
解決方案:當(dāng)電腦內(nèi)存不夠是,Unity容易出現(xiàn)問(wèn)題,甚至Crash。建議換個(gè)電腦
坑7:后期優(yōu)化項(xiàng)目完后,沒(méi)有效果,適得其反
解決方案:優(yōu)化是需要把握一個(gè)度的,比如優(yōu)化分為CPU,GPU和內(nèi)存,我們可以犧牲內(nèi)存減少CPU的調(diào)用,也可以增加GPU的消耗,減少內(nèi)存。也可以將DrawCall減少到極致。但是凡事有個(gè)度,在優(yōu)化的之間需要平衡各項(xiàng)。比如當(dāng)CPU優(yōu)化過(guò)度后,必定增加了GPU和內(nèi)存的消耗,可能有戲不會(huì)流暢反而更卡。尤其批處理功能,不能濫用。因此:
1.內(nèi)存可以犧牲,但不能太大,為了保證大多數(shù)機(jī)型的正常運(yùn)行
2.CPU優(yōu)化中DrawCall可以減少,但不能太多,適量減少,要不然必定增加內(nèi)存。
坑8:遮擋剔除開(kāi)了沒(méi)用
解決方案:需要根據(jù)不同的場(chǎng)景,不同的游戲,修改遮擋的參數(shù)設(shè)置,默認(rèn)的不適用于任何場(chǎng)景。
坑9:Animation占用內(nèi)存較大
解決方案:合理使用,等待Unity的官方優(yōu)化。
坑10:材質(zhì)屬性修改,導(dǎo)致內(nèi)存增加
解決方案:當(dāng)修改材質(zhì)的某個(gè)參數(shù)時(shí),Unity會(huì)為我們從新New一個(gè),所以當(dāng)需要不同參數(shù)的材質(zhì)時(shí),最好先創(chuàng)建好,避免在update中更新材質(zhì)的某參數(shù)。
坑11:Material深拷貝問(wèn)題
解決方案:Material a=b;會(huì)深度拷貝,需要注意釋放的問(wèn)題。或者使用SharedMatetial
坑12:圖片格式選擇TrueColor和16Bit,非常占內(nèi)存
解決方案:
1.盡量避免使用TrueColor,比較占內(nèi)存。
2.16bit雖然會(huì)吧像素壓縮一般,但是導(dǎo)致像素不清,親測(cè)還不如Compress
3.盡量選擇Compress,Unity會(huì)對(duì)其進(jìn)行壓縮并且清晰度可以。親測(cè)。
4.以上選項(xiàng)沒(méi)能滿(mǎn)足你,可以選擇圖片的FilterMode試試看。詳細(xì)自己去查吧。
坑13:DestroyImmediately的使用
解決方案:
1.DestroyImmediately會(huì)立刻釋放,占用系統(tǒng)資源,可以改為Destroy等系統(tǒng)空閑時(shí)統(tǒng)一釋放。
2.Destroy也要盡量少用,因?yàn)閯?chuàng)建和銷(xiāo)毀都會(huì)占用系統(tǒng)資源。鼓勵(lì)使用對(duì)象池。
3.Destroy操作很保守。例如,銷(xiāo)毀mesh時(shí),并不會(huì)銷(xiāo)毀material、texture,更不會(huì)清理腳本資源。解決方案,合理做法是依賴(lài)很卡的UnloadUnusedAssets、LoadScene清理無(wú)引用資源(另注意前者是異步的),或者Bundle.Unload(true),這些方案各有限制。
坑14:System.GC的使用
解決方案:
1.Unity的堆和.net的堆不是同一個(gè)。GC釋放的是.net的堆內(nèi)存,所以有時(shí)候并不能達(dá)到我們的目的。而且GC調(diào)用多了也會(huì)增加CPU的消耗。
2.Unity的釋放使用Resources.UnloadUnusedAsset.
坑15:歐拉角的使用。
解決方案:
1.首先歐拉角的表示較容易理解,但是弊端是效率低和萬(wàn)向鎖。
2.可以使用四元數(shù)來(lái)代替,雖然不容易理解,但可以從歐拉角轉(zhuǎn)換過(guò)來(lái)。
坑16:xxx.dll明明導(dǎo)入了,系統(tǒng)卻提示沒(méi)有
解決方案:
1.確認(rèn)導(dǎo)入的是32位還是64位是否跟機(jī)型匹配。是否導(dǎo)入重復(fù)。
2.檢查BuildSetting中API Compatibility Level選擇的是.Net2.0還是.Net2.0 Subset,改為前者試試。如果是WebPlayer平臺(tái),無(wú)法選擇.Net2.0
坑17:粒子系統(tǒng)的濫用
解決方案:粒子系統(tǒng)做出來(lái)的東西很炫,但是好東西不能多用。用多了系統(tǒng)受不了的。
坑18:Unity突然崩潰,場(chǎng)景沒(méi)保存,Prefab沒(méi)保存
解決方案:寫(xiě)一個(gè)編輯器腳本,在Unity意外退出時(shí)自動(dòng)保存。詳見(jiàn)我的另一篇文章
坑19:AssetBundle的使用
解決方案:
1.打包AssetBundle的資源依賴(lài),以及解壓時(shí)的資源依賴(lài)。需要自己捋清楚,否則坑死你。
2.升級(jí)到Unity5.0后,雖然自帶了打包系統(tǒng),但是依然需要你自己捋清依賴(lài)關(guān)系。
3.解壓和使用完Asset后,記得解壓的文件還在內(nèi)存中,需要你去釋放。
4.有些文件避免重復(fù)下載,可以使用LoadFromCache方法,但是它也有坑,用的時(shí)候小心點(diǎn)。
坑20:打包到移動(dòng)端的項(xiàng)目打不開(kāi),不知道什么錯(cuò)
解決方案:
1.蘋(píng)果端,可以在Xcode運(yùn)行程序,然后看錯(cuò)誤在那一行報(bào)錯(cuò)
2.安卓端,可以到處Android項(xiàng)目在AndroidStudio或Eclipse運(yùn)行,看日志,也可以使用SDK自帶的adb logcat -s Unity 功能來(lái)輸出日志查詢(xún)。
坑21:場(chǎng)景好好的,但是Scene視圖卻什么都看不到了
解決方案:一個(gè)同事發(fā)現(xiàn)這個(gè)現(xiàn)象,剛開(kāi)始我也熟手無(wú)策,場(chǎng)景中物體明明在,但就是看不見(jiàn)。檢查下Unity右上角的Layers選項(xiàng),是否點(diǎn)擊了某個(gè)層的關(guān)閉
坑22:UGUI中按鈕無(wú)響應(yīng)
解決方案:
1.檢查按鈕上方是否有圖片或Panel等遮擋,屏蔽了按鈕事件。
2.檢查EventSystem是否不小心刪掉了。
坑23:UGUI上加粒子特效的層級(jí)問(wèn)題
解決方案:可以設(shè)置粒子的畫(huà)布深度。或者新建畫(huà)布。
坑24:Unity下使用中文名和路徑
解決方案:
1.資源導(dǎo)入時(shí),有中文必定出錯(cuò)。資源導(dǎo)出時(shí)中文路徑不出錯(cuò)。
2.圖片和Prefab可以使用中文,但有出錯(cuò)的可能性。
坑25:Unity自帶腳本編輯器MonoBehavior的亂碼問(wèn)題
解決方案:在MonoBehavior和VS之間切換時(shí)容易出現(xiàn)亂碼,暫無(wú)好的解決方案。最好選一個(gè)使用別亂換。
坑26:模型師的做動(dòng)作導(dǎo)出到Unity就報(bào)錯(cuò)。
解決方案:讓模型師檢查骨骼的名字是否重復(fù)或?qū)戝e(cuò)。讓其按照一定的規(guī)則命名。
坑27:項(xiàng)目越寫(xiě)越凌亂
解決方案:
1.重構(gòu)是每時(shí)每刻進(jìn)行的,不是到了最后階段花幾個(gè)月的時(shí)間進(jìn)行重構(gòu)。如果感覺(jué)代碼已經(jīng)有了壞味道,就立刻去重構(gòu),否則以后就更懶得去重構(gòu)了。導(dǎo)致代碼越來(lái)越爛。(推薦《重構(gòu)》)
2.嚴(yán)格遵循MVC模式,組合復(fù)用等設(shè)計(jì)原則進(jìn)行框架的設(shè)計(jì)。(《設(shè)計(jì)模式》)
3.單例模式不能濫用,代碼之間的耦合度會(huì)增加。
4.代碼的命名要有規(guī)則,養(yǎng)成習(xí)慣。推薦谷歌命名法和駝峰命名法。
5.多看別人的代碼結(jié)構(gòu),學(xué)以致用。
總結(jié)
以上是生活随笔為你收集整理的Unity3D的一些坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php通过ajax下载文件,通过Ajax
- 下一篇: Unity3D重要知识点