1.简述prefab的用处
预设体是事先创建一个物体对象及其自身的各种属性方法,在需要使用时在特定时间特定位置创建出大量可以重复使用的资源,预设体在实例化时,可以将其拖动到层级视图也可以直接拖到Scence。
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
2.请简述ArrayList和List的主要区别?
ArrsyList是非泛型集合,不是强类型,可以存放各种类型的数据,引用空间为system.collection;List是泛型集合,是强类型只能存放同一种类型的数据,引用空间为system.collection.generic;ArrarList和List都不能进行运算操作。
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理,装箱拆箱的操作费时)List是接口,ArrayList是一个实现了该接口的类,可以被实例化。
3.物体发生碰撞的必要条件?
a.发生碰撞的两个物体都必须带有collider;
b.发生碰撞的两个物体必须有一个带有刚体;
c.两个物体之间必须有相对运动;
4.OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生
运行顺序为Awake、OnEnable、Start,
OnEnable在同一周期中可以反复地发生
5.请简述值类型与引用类型的区别
值类型存储空间为栈,不需要手动开辟空间,系统自动开辟空间;引用类型存储空间为堆,需要用new手动开辟空间。
1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4.值类型继承自System.ValueType,引用类型继承自System.Object
6.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
6.C#中所有引用类型的基类是什么
System.Object
7.请描述Interface与抽象类之间的不同
Interface是声明接口时的关键词,在接口中只能有属性和方法,不能有字段,接口中不能有构造函数、析构函数、静态成员和const常量接口中的方法必须不能有实现,接口不能直接实例化,接口中的属性和方法系统默认public,不能再添加访问修饰符,如果某个类实现了某个接口,就必须实现接口中的所有属性和方法;抽象类声明的关键词是abstract,抽象类中可以包含有字段、属性和方法,可以包含私有成员,抽象类中可以包含非抽象成员,抽象类中不能包含私有成员,抽象类的方法在父类中必须不能实现,在子类中必须全部实现,用override,如果子类也是抽象类那么子类中可以实现也可以不实现父类中的方法。
抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公共只能定义各个方法的界面,不能具体的实现代码在成员方法中。类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。
8.关键字Sealed用在类声明和函数声明时的作用
Sealed密封的,如果在声明类时用了sealed,那么该类就不能被继承,声明方法时用sealed,该方法不能被重写。
9.向量的点乘、叉乘以及归一化的意义?
1.点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
10.u3d中,几种施加力的方式,描述出来。
AddForce给物体施加一个力
AddForce(方向*力的大小);
AddExplosionForce给物体施加一个爆炸力
AddExplosionForce(力的大小,位置,爆炸半径)
AddRelativeForce给物体施加一对相对力
AddRelativeForce(方向*大小)
AddForceAtPosition在某个位置给物体施加一个力
AddForceAtPosition(力的大小方向,力的位置)
ball_2rig.AddForceAtPosition(Vector3.right*300,newVector3(transform.position.x-0.5f,transform.position.y,transform.position.z));
rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。
11.物体自旋转使用的函数叫什么
transform.Rotate(newvector(x,y,z)*Time.deltaTime*speed)
12.物体绕某点旋转使用函数叫什么
transform.RotataAround(transform.position,newVector(x,y,z),angleSpeed*TimedeltaTime);
13.物理更新一般在哪个系统函数里?
voidFixedUpdate(){}
FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
14.在类的构造函数前加上static会报什么错?为什么?
报错:staticconstructorcannothaveanaccessmodifier
静态构造方法不能有参数和访问修饰符
15.C# String类型比stringBuilder类型的优势是什么?
String字符串常量
stringBuilder字符串变量
String是字符串常量。
StringBuilder是字符串变量,线程不安全。
String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。
16.C#函数Func(string
a, string b)用Lambda表达式怎么写?
17.localPosition与Position的使用区别?
localPosition是自身坐标系
Position是世界坐标系
18.C#中的排序方式有哪些?
冒泡排序、选择排序、二分查找排序
选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序
19.C#的委托是什么?有何用处?
委托是存有对某个方法的引用的一种引用类型变量,引用可在运行时被改变
用处:特别用于实现时间和回调方法,可用于引用带有一个字符串作为输入方法,并不返回任何东西。
委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。用处:使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。
20.什么是里氏转换原则?
原则上子类对象可以赋给父类对象的,也可以说子类可以替换父类,并且可以出现在父类能够出现的任何地方;反过来,父类对象是不能替换子类的,这种特性称为里氏转换原则。
里氏替换原则(Liskov SubstitutionPrinciple LSP)面向对象设计的基本原则之一。通俗点:就是子类对象可以赋值给基类对象,基类对象不能赋值给子类对象
面向对象设计的五大基本原则
单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP