值类型和引用类型区别
值类型:包含了所有简单类型(整数、浮点、bool、char)、struct、enum。
继承自System.ValueTyoe
引用类型包含了string,object,class,interface,delegate,array
继承自System.Object
异步加载场景
添加进度条展示异步加载的步骤
参考异步加载场景资源
拷贝策略:值类型是拷贝数据,引用类型是拷贝引用地址
如果值类型为传值参数,传值参数会在栈上新开辟一个副本,原先的值类型数据不会改变
如果引用类型是传值参数,传值参数会创建一个新的引用地址,两个引用地址会指向同一个对象实例的数据,实例数据会随着改变进行改变。(这种行为被称为副作用,一般实际项目不会这么操作,要么return返回参数,要么使用ref或者out修饰符)
深拷贝和浅拷贝的区别
浅拷贝 —只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
深拷贝 —在计算机中开辟了一块新的内存地址用于存放复制的对象。不受到拷贝前对象的影响
深拷贝通俗易懂的理解就是:b通过a分享的链接买了一件和a一样的衣服,但是a和b的衣服确是两件长得一样的衣服,不管a的衣服是脏了还是破了都不会影像b的衣服
delegate
delegate(委托)是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If … Else(Switch)语句,同时使得程序具有更好的可扩展性。
可以将某种方法作为参数传入,例如
attack(String target_id,chooseGan());
attack(String target_id,chooseWeapon());
chooseWeapon(){用weapon攻击的代码};
chooseWeapon(){用gan攻击的代码};
请描述游戏动画有哪几种,以及其原理?
主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
Unity3D是否支持写成多线程程序?
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
Unity3D的协程和C#线程之间的区别是什么?
多线程:程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
协程过程:StartCoroutine(“test”) ->IEnumerator test()-> stopCoroutine(“test”)
作用:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。
缺点:协同程序并非真线程,可能会发生堵塞。
当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?
穿透(碰撞检测失败)
简述StringBuilder和String的区别?
String是字符串常量。
StringBuffer是字符串变量 ,线程安全。
StringBuilder是字符串变量,线程不安全。
String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。
堆和栈的区别?
- 堆的申请速度较慢,容易产生内存碎片,但是用起来比较方便。
- 而栈的申请速度较快,但却不受程序员的控制。
- 栈申请的容量较小1-2M,堆申请大小虽受限于系统中有效的虚拟内存,但较大
- ·栈负责保存我们代码执行或调用的路径,而堆则负责保存对象或者说数据的路径。
在堆栈里各自存放了什么内容
值类型:数据存储在栈上,超出作用域就自动清理
引用类型:数据存储在托管堆上,引用地址在线程栈上,地址指向数据存放的堆上
托管堆会由GC来自动释放 ,线程栈数据在作用域结束后会被清理。
在编辑场景时将GameObject设置为Static有何作用?
设置游戏对象为Static时,这些部分被静态物体挡住而不可见时,将会剔除(或禁用)网格对象。因此,在你的场景中的所有不会动的物体都应该标记为Static。
有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染?
把A组物体的渲染对列大于B物体的渲染队列,通过shader里面的渲染队列来渲染
将图片的TextureType选项分别选为“Texture”和“Sprite”有什么区别
Texture:是一张图片,但主要是用来改变物件的外观。有点像包装纸的概念,将物品用不同款式的包装纸(Texture)包装,让他看起来不一样。因为Texture本身不是物件,因此不能移动它。
Sprite:是一张图片,同时也是一个物件,意思是他拥有座标(x, y),你能移动/创建/删除他。
基本上将Texture + Rect Entity就是Sprite了。
问一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别?为什么?
没有区别,因为不管几张贴图只渲染一次。
重载和重写区别
静态重载:返回值无关,与参数个数,类型相关。编译阶段。便于扩展和维护。也就是相同方法名,传入参数不一样
重写:动态重写override(运行时,改写了方法表的新地址)。继承的时候子类对父类的方法进行重写
抽象方法的父类必须是抽象类,子类是抽象类可以不重写,抽象类不可以被实例化。