U3D笔记11:47 2016/11/30-15:15 2016/12/19
U3D筆記11:47 2016/11/30-15:15 2016/12/19
技術BLOG:http://www.unity.5helpyou.com/2373.html#comment-43108
--------------------------------------------------------------------------
11:47 2016/11/30
Before you can load a level you have to add it to the list of levels used in the game. Use File->Build Settings... in
Unity and add the levels you need to the level list there. MonoBehaviour.OnLevelWasLoaded is called on all active game
objects after the level has been loaded
在加載任何場景之前,必須將場景添加到build settings列表
Assets/code/Engine/Common/Config.cs(51,49): error CS0117: `System.IO.File' does not contain a definition for
`ReadAllText',平臺切換的問題,默認是webplayer,應該切換到windows
14:53 2016/12/3
這個問題是由于U3D editor設置platform為 web player
15:35 2016/12/3
17:49 2016/11/30
loadScene(index or name)可用路徑或場景名,如果用場景名有重名是只加載第一個
11:31 2016/12/9
U3D里直接實現IPointerUpHandler接口后發現OnPointerUp沒有調用,必須IPointerDownHandler, IPointerUpHandler一起實現,然后
OnPointerDown,OnPointerUp就都能收到消息了
15:38 2016/12/9
調用順序:awake, onlevelwasloaded, start
注意,onlevelwasloaded 在 start之前。
awake是一個物體實例化完成之后立即調用,場景中所有物體都實例化完成,所有資源都加載完后,調用onlevelwasloaded,然后緊接著
調用各個物體的start()
18:15 2016/12/11
Expanding invalid MinMaxAABB 這個詭異的錯誤原因是:對某物體的父接點設置了setactive(false),然后又去企圖設置它的屬性。
public void Init ()
{
cellsDict = new Dictionary<int, GameObject> ();
cellPrefab = Resources.Load ("blockCell") as GameObject;
lineAux = new GameObject ("lineAux");
lineAux.SetActive (true);//這里如果不設置,則lineAux可能是隱藏的,下面對材質的設置將會觸發以上錯誤。
LineRenderer lrder = lineAux.AddComponent<LineRenderer> ();
lrder.SetColors (Color.green, Color.green);
lrder.SetWidth (0.1f, 0.1f);
lrder.SetVertexCount (5);
lrder.material = new Material (Shader.Find ("Qx/Unity/Legacy/Legacy-Diffuse"));
lrder.material.color = Color.green;
}
10:56 2016/12/12
=============================上面問題原因是:SetVertexCount(5),設置了五個頂點,又沒有去給頂點賦值,默認值又比較大導致
了計算數據出現無窮大的現象================
從上面也可看出,linerender居然和GUI有關
12:12 2016/12/12
U3D打可執行包時,shader除了在edit-projectsettings-graphic中設置的,其它都不會打進EXE中,也不會assetbundle,除非設置了打
包標識 assetbundle的tag
13:20 2016/12/12
GameObject[] auxLines = new GameObject[4]; 這時只是聲明了一個數組,數組的每個成員還沒賦值,還不能使用。
這時auxLines [0] auxLines [1],auxLines [2],auxLines [3]全為null
還不能使用。要想使用,必須:
for(int i=0; i<4; ++i)
auxLines [i] = new GameObject()
14:05 2016/12/12
對于每幀getcomponent的東西,消耗有點大,最好做預處理。
14:24 2016/12/12
放在Editor下的腳本掛到游戲場景的物體上是無效的,提示:沒有繼承自Monobehavivor
11:38 2016/12/15
將一張帶有透明像素的texture轉換為sprite時,U3D會根據透明像素的范圍自動將圖片切分為許多的三角形,增加了許多頂點。這樣做
是為了盡可能少的繪制透明像素。
以減少ALPHA測試與ALPHA混合。以增加三角形為代價換取透明像素的繪制。
10:14 2016/12/16
UI Prefab不同于模型prefab,例如制作了一個UIprefab A,上面有一個Image, button。A 的大小為8K, 再制作一個類似A的 prefab
B, 二者總大小將為 A+B = 16K,
也就是說UI的prefab是實際容量的增加,而不是對UI元素的引用。比如A和B都有BUTTON,實際是增加BUTTON的大小而不是對它的引用。
11:41 2016/12/16
BuildPipeline.BuildPlayer (scenes, target_dir, build_target, build_options);是打包可執行程序。
BuildPipeline.BuildAssetBundles 是打包資源
18:21 2016/12/16
當發現SVN無法cleanup時,將清理選項全部勾選,再清理就可以了。
8:47 2016/12/19
原來TAG也可以在打包版本中使用。之前應該是其它問題導致的。
11:19 2016/12/19
GameObject.Destroy(obj.transform:GetChild(i))會發生什么? 提示:不能被銷毀,XX組件還在依賴它。
這是因為obj.transform:GetChild(i)獲取的是一個transform,而不是一個Gameobject,單純銷毀GO的Transform組件是不允許的,因為
此GO的其它組件還在。
正確寫法:GameObject.Destroy(obj.transform:GetChild(i).gameobject)
、
14:41 2016/12/19
The GC Alloc column shows how much memory has been allocated in the current frame, which will be collected later by the
garbage collector. By designing your code to keep this value at zero, you can avoid the Garbage Collector from causing
hiccups in your framerate.
15:15 2016/12/19
IPointerDownHandler, IPointerUpHandler, IDragHandler這些接口實現了后,如果是UI,比如BUTTON,當用戶點擊了此按鈕,此按鈕
的OnPointerDown等就會被調用。
如果是場景中的3D物體實現了以上接口,比如一個CUBE,點擊CUBE,此時CUBE的OnPointerDown并不會被調用。還必須給主相機增加一個
physics raycaster并且指定CUBE所在的LAYER在EVENTMASK列表中。
--------------
但如果不給相機增加physics raycaster,也可以通過 Physics.RayCast(ray, dist, out hitInfo, layermask)接口來判斷有沒有物體
被點中,且返回點中的坐標等信息。
layermask傳遞希望進行測試的LAYER。
15:37 2016/12/19
相機的culling mask,在其列表中打勾的都是被此相機繪制的,不打勾的則不會繪制。這與setactive有什么區別?
這里僅是繪制與否,并不是隱藏與顯示。當物體被隱藏了就無法點擊它,無法與它交互。而不繪制的物體還可以被點擊。還會被UPDATE
等。而一個物體被setactive(false)后就不能被點擊 了。
10:39 2016/12/20
addcomponent后就會調用 awake, start等函數。
12:04 2016/12/22
U3D不支持DDS格式,支持的格式:PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT
18:03 2016/12/26
組件是一個對象,而不是一個類。
18:45 2016/12/28
When you set the Characters drop-down in the Import Settings to Dynamic, Unity will not pre-generate a texture with all
font characters. Instead, it will use the FreeType font rendering engine to create the texture on the fly. This has the
advantage that it can save in download size and texture memory, especially when you are using a font which is commonly
included in user systems, so you don’t have to include the font data, or when you need to support asian languages or
large font sizes (which would make the font textures very large using normal font textures).
動態字體,選擇了動態字體,UNITY編輯器不會產生一張包括所有字符的字體貼圖。而是在使用時利用freetype字體引擎產生部分需要的
貼圖。
如果不選擇動態字體,則打包時就多了一張包含全部字符的字體貼圖,可能很大。如果用戶機器上有對應字體時。。。
11:53 2016/12/29
Parent of RectTransform is being set with parent property. Consider using the SetParent method instead,
with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world
orientation and scale,
which can prevent common UI scaling issues.
10:00 2016/12/30
自己制作的按鈕,點了之后沒有表現效果,但事件響應了。這是由于按鈕的 target graphic選錯了,如果造成其它按鈕正在使用的圖片
,則會效果會表現在其它按鈕上。
正確的做法是選擇自己按鈕的一張圖片,才能看到正確的表現效果。
11:12 2017/1/5
C# 字符串處理幾個好用函數, substring, startwith, endwith, replace(str, str1, str2)
9:57 2017/1/6
Upgrade Guides 能看到各版本的改動
Upgrading to Unity 5.3 [Released 08dec15]
Upgrading to Unity 5.2 [Released 08sep15]
Upgrading to Unity 5.0 [Released 03mar15] (There are several sub-pages to this.)
Upgrading to Unity 4.0 [Released 13nov12]
Upgrading to Unity 3.5 [Released 14feb12]
11:54 2017/1/6
U3D的壓縮算法有LZMA,LZ4,其中LZMA是7Z使用的壓縮算法,壓縮率:7z > rar > zip。LZ4壓縮率要低一些,但速度極快,不用全部解壓
就可以使用其中文件。
因此在游戲中最適合使用LZ4,也就是 chunk-based的壓縮。
對以上三種,經過測試,壓縮算法的通用規則:圖片視頻幾乎沒什么壓縮率,其它資源壓縮較大,游戲模型原始資源很大但壓縮率可達
80-90%,因此,對于游戲資源,壓縮后圖片最占資源了。
特別是2D地圖的游戲。其中JPG還稍微能壓縮一些,PNG就幾乎完全壓縮不了,有時甚至壓縮后變大。
然而,使用UNITY打包時,就算是PNG圖片,也能達到50%的壓縮率!這是為什么?有損壓縮?原來是在圖片資源的屬性面板頁上有設置的
,默認情況是 format : compressed
看文檔說明,這種壓縮是Compressed RGB texture. This is the most common format for diffuse textures. 4 bits per pixel (32
KB for a 256x256 texture).每個像素
只有4位了,當然壓縮的有點過了。還可以選擇16位的壓縮,32位真彩色等。最高的一種是crunched,這種是有損壓縮,壓縮率非常高。
16:15 2017/1/6
m_SystemData.empty() 打包時報這個錯,重啟UNITY就好了。
18:01 2017/1/6
對于PNG圖片,沒有透明像素的圖要比有透明像素的小。這說明PNG在存儲不透明像素時沒有浪費像素位。
15:12 2017/1/8
packing tag,在對地圖的所有圖片賦予了一個值后,對地圖圖片打包AB后,大小為原來10倍!不知原因是什么
15:22 2017/1/10
QueryPerformanceCounter這個WIN32 API 在安卓上不能使用,大概只能用于PC吧,手機和PC的CPU架構不一樣吧。其它WIN32 API,如
ZeroMemory是可以使用的。
15:38 2017/1/10
Application.dataPath是絕對路徑!!!!!
17:10 2017/1/16
SceneManager.sceneCount + "," + SceneManager.sceneCountInBuildSettings
前者是指當前加載的場景,后者是指在BuildSettings中存在的場景。
一般情況下,當前加載的場景只有一個,除非使用了additive加載。
相應的SceneManager.GetSceneAt(0)傳0即可獲取當前場景
下拉列表表項的獲取:dropdown.options[idx]
16:55 2017/1/17
sprite的問題:在默認情況下,在場景中創建一個sprite,然后賦予一個圖片。這張sprite將保持原來圖片的原始尺寸(不透明像素部
分)
這張圖與我們的2D地圖上占
9:10 2017/1/18
PNG圖片的透明像素是不會增加圖片大小的
9:15 2017/1/18
TAG在打包時注意:TAG是保存在工程設置中的,當工程設置刪除了后(只剩下Assets文件夾)再啟動工程后會生成新的工程設置,這時
原來的TAG就丟失了,但
TAG下拉菜單中還是存在的,不過打包時就會出現找不到TAG的問題。
17:52 2017/1/19
U3D可以通過設置渲染隊列來控制物體渲染的先后順序。
通過fragment shader返回的顏色值的alpha來控制渲染的透明度,前提是設置了混合方式,混合默認是不開的,設置了混合方式時自動
打開混合了。
ztest zwrite默認是打開的,ztest默認是lessequal。ztest是指渲染當前物體時,拿當前物體的Z與Z緩存中的Z比較,如果滿足ztest設
置,則將當前像素渲染
否則不渲染。zwrite則是指是否將當前像素的Z寫入Z緩存,這個決定只會影響后面渲染的像素,并不影響當前像素。
--------------------------
Z緩存中每個像素點的Z值只有一個,后來寫入的覆蓋原來的。
ALPHA混合的條件是透明物體更靠近相機。注意Z緩存的Z值是相對于相機的,并不是世界空間的Z值。
17:33 2017/1/22
有時候對UI圖片應用 sliced選項時,會提示:this assets does not have a border。
這個屬性是在meta文件中存儲的,但不知道是如何做的?
15:47 2017/1/23
U3D中,自己創建的資源還是要手動釋放的,比如釋放內存中加載的資源,銷毀自己NEW出的GO。
17:49 2017/2/3
Debug.Log有時候會出現代本應輸出卻沒輸出的問題。使用插件Debugger.Log可以正確輸出,原因不明。
已知Debug.Log會有不立即輸出的問題,即輸出時刻與代碼執行位置不同,可能晚于代碼所在的時刻而輸出。比如在某行代碼A之前寫上
一句Debug.Log("xxxx"),這個輸出可能會在代碼A執行之后輸出。
10:21 2017/2/6
探索UNITY SHADER 可以找到UNITY內置SHADER的下載地址:https://unity3d.com/cn/get-unity/download/archive
11:23 2017/2/7
UI畫面的分辨率問題??????
12:04 2017/2/10
跨平臺問題,C#可以跨平臺嗎?不能,要借助.NET,就是說相應機器上必須裝了.NET才行。C#程序是中間語言IL,在安裝了.NET的機器上
運行時,.NET將啟動運行時來解釋執行C#編譯成的中間程序,這就實現了跨平臺運行。
U3D程序可以跨平臺嗎?可以,U3D跨平臺的基礎是MONO,MONO自己實現了類似.NET的大部
分類庫的功能,且直接打包進了U3D的發布程序中,這就是為什么U3D空程序也有10M的原因。MONO把.NET的功能實現到程序中以便在程序
運行時扮演運行時的角色來對程序解釋執行。這樣機器不用安裝MONO或.NET也能直接運行U3D程序。
11:07 2017/2/23
U3D 宏定義的問題:注意,在UNITY編輯器中,不管切換到什么平臺,UNITY_EDITOR總是存在的,因此有如下現象:
#if UNITY_EDITOR --處于編輯器模式下,這個總是輸出的,不管切換到什么平臺
Debug.Log("editor==========================");
#endif
?
#if UNITY_ANDROID
--如果切換到安卓平臺,則同時輸出 editor, android兩行
Debug.Log("android========================");
#endif
?
#if UNITY_IOS
Debug.Log("plat_ios-------------==");
#endif
?
#if PLAT_AND
Debug.Log("plat_and====================");
#endif
#if PLAT_PC
Debug.Log("plat_pc====================");
#endif
14:52 2017/2/23
StackTraceUtility這個類可用于輸出調用棧,這在調試LUA腳本時特別有用,然而這個類在手冊中卻查不到!!
17:40 2017/2/23
UNITY 用高版本打開低版本的項目時,API會自動升級,但反過來卻可能不行,比如 5.35F1升級到5.51F1后再清空項目設置,然后
使用5.35F1打開,報錯:UnityEngine.AI.NavMeshAgent,這是5.51F1中的寫法,而5.35F1中應該是UnityEngine.NavMeshAgent
9:42 2017/2/27
[OnOpenAssetAttribute(0)]
public static bool OnOpenAsset(int instanceID, int line){}//自定義函數
這樣是定義了一個UNITY編輯器的回調函數,當在UNITY內打開資源時就會調用它
10:40 2017/2/27
streamingassets是只讀的,注意,以前沒注意過這個問題。
這就是為什么熱更新資源時不放到這個文件夾的原因,它不能被寫!
所以,就只能放到持久化目錄下了。
Resources文件夾也是只讀的!且此文件夾下的所有資源都會被無條件打包,不管它有沒有被引用到。比如下面有兩張貼圖并有在游下用
但放在了此文件夾下,照樣會被打進包里。
15:28 2017/2/27
在UNITY中 宏定義的作用范圍最大只是文件域的。
如 #undef UNITY_EDITOR就只在當前文件有作用,另外文件中并沒有影響!!!!
16:12 2017/2/27
注意:C#文件系統的相關函數在安卓和IOS上是可以用的,但要注意路徑和PC上不一樣,如下:
if (File.Exists(fullPath))
posted on 2016-12-19 15:26 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的U3D笔记11:47 2016/11/30-15:15 2016/12/19的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D 预设打包的注意事项
- 下一篇: LUA 利用#遍历表的问题