1 [易]A和B同时挂了两个脚本,生命周期分别由awake,onenable,start,那么这两个物体的执行顺序是:(A的awake,A的onenable,B的awake
(A的awake,A的onenable,B的awake,B的onenable,A的start,B的start) |
点乘是一个float值,结果越大,两个向量越相似,叉乘是一个vector,两个向量的叉乘分别垂直于这两个向量 |
沙河目录的persistdatapath |
Diffuse = I * dot(L,N) |
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
|
Dictionary(字典)是使用 hash表来实现key和value之间的映射和存储的。 Dictionary使用的解决冲突方法是拉链法,又称链地址法。 字典的时间复杂度是O(1) |
a)栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小 b)存放在栈中时要管存储顺序,保持着先进后出的原则,他是一片连续的内存域,有系统自动分配和维护。而堆是无序的,他是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。 栈中保存了代码的执行步骤,先进先出,每次使用要从栈顶取走,使用后立即回收空间,栈内存不需要管理,不收GC管理 堆存放了各种对象的信息,不会在使用结束后被立刻回收,堆内存需要GC管理 |
没有,根据上次调用时处理的内存占用决定 |
占用内存 |
精灵打包和图集,UI布局进行动静分离,将动态变化中的UI组件单独分配到一个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 |
//随机产生一个范围内的字符 static char GetChar(char start,char end) { Random random = new Random(); return (char)random.Next(start,end); } /// /// 随机插入集合列表中 /// /// /// /// /// static void Insert(List { if (repeat) { list.Insert(index, item); } else { if (!list.Contains( item)) { list.Insert(index, item); } } } /// /// 生成目标字符串 /// ///字符串长度 ///是否包含数字 ///是否包含大写字母 ///是否包含小写字母 /// /// 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型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。 b)使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。 c)out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。 |
GetA = 11,GetA = 11 |
Awake--OnEnable--Start--FixedUpdate--Update--LateUpdate--OnGUI--OnDisable---OnDestroy--OnApplication |
1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。 2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。 3.通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的 |
协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。 协程(协同程序): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。 线程: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。 1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component 2.线程,多线程是阻塞式的,每个IO都必须开启一个新的线程,但是对于多CPU的系统应该使用thread,尤其是有大量数据运算的时刻,但是IO密集型就不适合;而且thread中不能操作unity的很多方法和component 线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。 |
pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil; ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key |