广东快乐十分

集团旗下网站: | |
全国咨询热线:400-807-8991
您现在所在的位置:广东快乐十分 >学习资源 > 面试题库 > Unity3D题库

Unity3D题库

来源:奇酷学院 发表于:

1 [易]A和B同时挂了两个脚本,生命周期分别由awake,onenable,start,那么这两个物体的执行顺序是:(A的awake,A的onenable,B的awake

 
1.   [易]A和B同时挂了两个脚本,生命周期分别由awake,onenable,start,那么这两个物体的执行顺序是:

(A的awake,A的onenable,B的awake,B的onenable,A的start,B的start)
 
2.   [易]点乘和叉乘在数学上的表现

点乘是一个float值,结果越大,两个向量越相似,叉乘是一个vector,两个向量的叉乘分别垂直于这两个向量
 
3.   [易]AssetBundle下载到哪一个文件夹了

沙河目录的persistdatapath
 
4.   [易]光照模型Lambert的内部计算

Diffuse = I  * dot(L,N)
 
5.   [易]使用单例的好处

通过可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
 
6.   [易]C#中的字典怎么实现,里边的哈希表是怎么碰撞的,字典的时间复杂度

Dictionary(字典)是使用 hash表来实现key和value之间的映射和存储的。
Dictionary使用的解决冲突方法是拉链法,又称链地址法。
字典的时间复杂度是O(1)
 
7.   [易]堆和栈介绍一下

a)栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
b)存放在栈中时要管存储顺序,保持着先进后出的原则,他是一片连续的内存域,有系统自动分配和维护。而堆是无序的,他是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
栈中保存了代码的执行步骤,先进先出,每次使用要从栈顶取走,使用后立即回收空间,栈内存不需要管理,不收GC管理
堆存放了各种对象的信息,不会在使用结束后被立刻回收,堆内存需要GC管理
 
8.   [易]有手动写过gc吗,说一下gc是怎么调用的

没有,根据上次调用时处理的内存占用决定
 
9.   [易]使用对象池的坏处

占用内存
 
10.  [易]说一下项目中的UI优化,批处理有哪两种,动态和静态分别怎么实现

精灵打包和图集,UI布局进行动静分离,将动态变化中的UI组件单独分配到一个Canvas中
 
 
11.  [易]手写冒泡

        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;
                    }
                }
            }
        }
 
 
12.  [易]使用熟悉的一种排序算法,编写代码实现方法,Sort(int[])对一个一维数组进行排序

        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;
                    }
                }
            }
        }
 
 
13.  [易]编写一个函数,当已知一个三角形三边长a,b,c,求其对应的三个夹角

利用余弦定理
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
 
 
14.  [易]编写一个函数,输入指定长度,输出包含数字,大写字母,小写字母的随机字符串(字符串包含的内容可选,即可以选择是否包含数字,大写字母,小写字母,且可以选择内容是否可以重复)

        //随机产生一个范围内的字符
        static char GetChar(char start,char end)
        {
            Random random = new Random();
            return (char)random.Next(start,end);
        }
        ///
        /// 随机插入集合列表中
        ///

        ///
        ///
        ///
        ///
        static void Insert(List list,int index,char item,bool repeat)
        {
            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 charList = new 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());
        }
 
15.  [易]ref和out的区别

a)使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
b)使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
c)out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
 
16.  [易]阅读以下程序,程序输出的是什么?
public class A{
private int m_a;
public A(int _a){m_a = _a;}
public virtual int GetA(){
    return m_a;
}
public int GetAA(){
    return m_a;
}
}
public class B:A{
private int m_a;
public B(int _a) : base(_a){m_a = _a – 1;}
public override int GetA(){
    return m_a;
}
}
var b = new B(12);var a = b as A;
Console.WriteLine(*GetA = {0},GetA = {1}*,b.GetA(),a,GetA());
 

GetA = 11,GetA = 11
 
17.  [难]游戏背景:有一个英雄,生活在布满农田,洞穴的世界中,他为了生存不断地采摘,打猎
世界元素:三种点:家(唯一),农田(若干),洞穴(若干),数据由pointList定义,一个角色(初始位置在家)
 


 
18.  [易]写出MonoBehaviour生命周期,系统函数执行顺序

Awake--OnEnable--Start--FixedUpdate--Update--LateUpdate--OnGUI--OnDisable---OnDestroy--OnApplication
 
 
19.  [易]Unity3d动态加载资源的方式有哪些,有什么区别

 1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。
3.通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的
 
20.  [易]Unity协程的用途以及线程的区别

协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。
 
协程(协同程序): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。
线程: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。
 
1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component
2.线程,多线程是阻塞式的,每个IO都必须开启一个新的线程,但是对于多CPU的系统应该使用thread,尤其是有大量数据运算的时刻,但是IO密集型就不适合;而且thread中不能操作unity的很多方法和component
 
线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。
 
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。
 
21.  [易]写出Lua中ipairs,pairs的区别

pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;
ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key
 

博客来棋牌下载 广东11选5 广东快乐十分 广东快乐十分 广东快乐十分 广东快乐十分网 大有彩票APP 广东快乐十分 广东11选5走势图 广东快乐十分登录