1 [易]A和B同時(shí)掛了兩個(gè)腳本,生命周期分別由awake,onenable,start,那么這兩個(gè)物體的執(zhí)行順序是:(A的awake,A的onenable,B的awake
(A的awake,A的onenable,B的awake,B的onenable,A的start,B的start) |
點(diǎn)乘是一個(gè)float值,結(jié)果越大,兩個(gè)向量越相似,叉乘是一個(gè)vector,兩個(gè)向量的叉乘分別垂直于這兩個(gè)向量 |
沙河目錄的persistdatapath |
Diffuse = I * dot(L,N) |
通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類(lèi)只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問(wèn),從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。單例模式會(huì)阻止其他對(duì)象實(shí)例化其自己的單例對(duì)象的副本,從而確保所有對(duì)象都訪問(wèn)唯一實(shí)例。
|
Dictionary(字典)是使用 hash表來(lái)實(shí)現(xiàn)key和value之間的映射和存儲(chǔ)的。 Dictionary使用的解決沖突方法是拉鏈法,又稱(chēng)鏈地址法。 字典的時(shí)間復(fù)雜度是O(1) |
a)棧是編譯期間就分配好的內(nèi)存空間,因此你的代碼中必須就棧的大小有明確的定義;堆是程序運(yùn)行期間動(dòng)態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運(yùn)行情況確定要分配的堆內(nèi)存的大小 b)存放在棧中時(shí)要管存儲(chǔ)順序,保持著先進(jìn)后出的原則,他是一片連續(xù)的內(nèi)存域,有系統(tǒng)自動(dòng)分配和維護(hù)。而堆是無(wú)序的,他是一片不連續(xù)的內(nèi)存域,有用戶自己來(lái)控制和釋放,如果用戶自己不釋放的話,當(dāng)內(nèi)存達(dá)到一定的特定值時(shí),通過(guò)垃圾回收器(GC)來(lái)回收。 棧中保存了代碼的執(zhí)行步驟,先進(jìn)先出,每次使用要從棧頂取走,使用后立即回收空間,棧內(nèi)存不需要管理,不收GC管理 堆存放了各種對(duì)象的信息,不會(huì)在使用結(jié)束后被立刻回收,堆內(nèi)存需要GC管理 |
沒(méi)有,根據(jù)上次調(diào)用時(shí)處理的內(nèi)存占用決定 |
占用內(nèi)存 |
精靈打包和圖集,UI布局進(jìn)行動(dòng)靜分離,將動(dòng)態(tài)變化中的UI組件單獨(dú)分配到一個(gè)Canvas中 |
static void Sort(int[] arr) { for (int i = 0; i < arr.Length-1; i++) { for (int j = 0; j < arr.Length-1-i; j++) { if (arr[j]>arr[j+1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } |
static void Sort(int[] arr) { for (int i = 0; i < arr.Length-1; i++) { for (int j = 0; j < arr.Length-1-i; j++) { if (arr[j]>arr[j+1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } |
利用余弦定理 cosA=(b^2+c^2-a^2)/2bc 角A = Math.Acos(cosA)*180/Math.PI cosB=(c^2+a^2-b^2)/2ca 角B = Math.Acos(cosB)*180/Math.PI cosC=(a^2+b^2-c^2)/2ab 角C = Math.Acos(cosC)*180/Math.PI |
//隨機(jī)產(chǎn)生一個(gè)范圍內(nèi)的字符 static char GetChar(char start,char end) { Random random = new Random(); return (char)random.Next(start,end); } /// /// 隨機(jī)插入集合列表中 /// /// /// /// /// static void Insert(List { if (repeat) { list.Insert(index, item); } else { if (!list.Contains( item)) { list.Insert(index, item); } } } /// /// 生成目標(biāo)字符串 /// ///字符串長(zhǎng)度 ///是否包含數(shù)字 ///是否包含大寫(xiě)字母 ///是否包含小寫(xiě)字母 /// /// static string Test01(int len, bool isContainNumber, bool isContainUpperLetter, bool IsContainLowerLetter,bool isRepeat) { List Random random = new Random(); if (isContainNumber) { charList.Add(GetChar('0', '9')); } if (isContainUpperLetter) { Insert(charList, random.Next(0, charList.Count), GetChar('A', 'Z'), isRepeat); } if (IsContainLowerLetter) { Insert(charList, random.Next(0, charList.Count), GetChar('a', 'z'), isRepeat); } while (charList.Count< len) { int index = random.Next(0,charList.Count); char tempChar = (char)random.Next('0', 'z'); if (char.IsNumber(tempChar) == isContainNumber && isContainNumber) { Insert(charList, index, tempChar, isRepeat); } else if (char.IsLower(tempChar) == isContainNumber && isContainNumber) { Insert(charList, index, tempChar, isRepeat); } else if (char.IsUpper(tempChar) == isContainNumber && isContainNumber) { Insert(charList, index, tempChar, isRepeat); } } return new string(charList.ToArray()); } |
a)使用ref型參數(shù)時(shí),傳入的參數(shù)必須先被初始化。對(duì)out而言,必須在方法中對(duì)其完成初始化。 b)使用ref和out時(shí),在方法的參數(shù)和執(zhí)行方法時(shí),都要加Ref或Out關(guān)鍵字。以滿足匹配。 c)out適合用在需要retrun多個(gè)返回值的地方,而ref則用在需要被調(diào)用的方法修改調(diào)用者的引用的時(shí)候。 |
GetA = 11,GetA = 11 |
Awake--OnEnable--Start--FixedUpdate--Update--LateUpdate--OnGUI--OnDisable---OnDestroy--OnApplication |
1.通過(guò)Resources模塊,調(diào)用它的load函數(shù):可以直接load并返回某個(gè)類(lèi)型的Object,前提是要把這個(gè)資源放在Resource命名的文件夾下,Unity不關(guān)有沒(méi)有場(chǎng)景引用,都會(huì)將其全部打入到安裝包中。 2.通過(guò)bundle的形式:即將資源打成 asset bundle 放在服務(wù)器或本地磁盤(pán),然后使用WWW模塊get 下來(lái),然后從這個(gè)bundle中l(wèi)oad某個(gè)object。 3.通過(guò)AssetDatabase.loadasset :這種方式只在editor范圍內(nèi)有效,游戲運(yùn)行時(shí)沒(méi)有這個(gè)函數(shù),它通常是在開(kāi)發(fā)中調(diào)試用的 |
協(xié)同程序(coroutine)與多線程情況下的線程比較類(lèi)似:有自己的堆棧,自己的局部變量,有自己的指令指針(IP,instruction pointer),但與其它協(xié)同程序共享全局變量等很多信息。 協(xié)程(協(xié)同程序): 同一時(shí)間只能執(zhí)行某個(gè)協(xié)程。開(kāi)辟多個(gè)協(xié)程開(kāi)銷(xiāo)不大。協(xié)程適合對(duì)某任務(wù)進(jìn)行分時(shí)處理。 線程: 同一時(shí)間可以同時(shí)執(zhí)行多個(gè)線程。開(kāi)辟多條線程開(kāi)銷(xiāo)很大。線程適合多任務(wù)同時(shí)處理。 1.協(xié)程,即協(xié)作式程序,其思想是,一系列互相依賴(lài)的協(xié)程間依次使用CPU,每次只有一個(gè)協(xié)程工作,而其他協(xié)程處于休眠狀態(tài)。協(xié)程實(shí)際上是在一個(gè)線程中,只不過(guò)每個(gè)協(xié)程對(duì)CUP進(jìn)行分時(shí),協(xié)程可以訪問(wèn)和使用unity的所有方法和component 2.線程,多線程是阻塞式的,每個(gè)IO都必須開(kāi)啟一個(gè)新的線程,但是對(duì)于多CPU的系統(tǒng)應(yīng)該使用thread,尤其是有大量數(shù)據(jù)運(yùn)算的時(shí)刻,但是IO密集型就不適合;而且thread中不能操作unity的很多方法和component 線程和協(xié)同程序的主要不同在于:在多處理器情況下,從概念上來(lái)講多線程程序同時(shí)運(yùn)行多個(gè)線程;而協(xié)同程序是通過(guò)協(xié)作來(lái)完成,在任一指定時(shí)刻只有一個(gè)協(xié)同程序在運(yùn)行,并且這個(gè)正在運(yùn)行的協(xié)同程序只在必要時(shí)才會(huì)被掛起。 在主線程運(yùn)行的同時(shí)開(kāi)啟另一段邏輯處理,來(lái)協(xié)助當(dāng)前程序的執(zhí)行,協(xié)程很像多線程,但是不是多線程,Unity的協(xié)程實(shí)在每幀結(jié)束之后去檢測(cè)yield的條件是否滿足。 |
pairs可以遍歷表中所有的key,并且除了迭代器本身以及遍歷表本身還可以返回nil; ipairs則不能返回nil,只能返回?cái)?shù)字0,如果遇到nil則退出。它只能遍歷到表中出現(xiàn)的第一個(gè)不是整數(shù)的key |
Python交流群
635448130點(diǎn)擊加入群聊UI設(shè)計(jì)交流群
579150876點(diǎn)擊加入群聊Unity交流群
495609038點(diǎn)擊加入群聊HTML5交流群
645591648點(diǎn)擊加入群聊