下面是本人以前面试中真实被问到 的问
1.类和结构体的区别
(1)结构体是值类型,类是引用类型
(2)结构体成员不能从继承自其他类或结构体,也不能被其他类或结构体继承(但可以实现接口),然而类可以(注意,所有的值类型都默认从ValueType类继承,ValueType类再从Object类继承。所以结构体对象仍然拥有超类Object的成员)。
(3)结构体成员不能在声明时赋值初始值,类可以(实际上,C#类成员初始化代码会被编译器放到构造函数中的最前边部分执行,而C++中根本没有这种方式,只能声明成员)
(4)不能为结构体提供无参构造函数(类中如果提供了自定义构造函数,就不会再提供默认无参构造函数。)
(5)结构体可以像类一样通过new 构造函数()来创建实例,也可以声明实例之后再赋值(例如:Person xiaoming; xiaoming.name = “xiaoming”;)
(6)结构体在自定义构造函数中必须为所有成员赋值。
(7)结构不允许声明析构函数(Destructor),类则无此限制
(8)结构体之间的比较,可以使用Equals而不能使用==操作符。且当结构体有成员是引用类型时,成员的比较是用 Object.ReferenceEquals 实现,即该引用类型的成员是否指向相同的引用(可能会让人误解,因为使用者可能只是想比较数值相同)
2.接口和抽象类之间的区别
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。
3.Widget/Panel容器
panel:有裁切功能,widget没有
Panel:会产生DrawCall widget不会
panel:相同图集的Sprite在同一Panel下,不会叠加DrawCall,但是在不同的panel下,会根据panel进行累加计算
操作:在panel下创建同一图集的两张图片DrawCall为2 然后在另一个panel下创建那个图集的图片 DrawCall就+了
Widget:的属性Depth没有实际意义,根据父物体深度进行展示,panel的有
Widget/Panel使用选择
1.界面要裁切-》Panel
2.panel-》功能模块 widget-》界面模块
3.一般以Panel开始(整个功能模块) ——》panel会包含多个widget(具体界面) ——》widget显示当前界面的具体内容
4.NGUI中经常问sprite和texture的区别
在同一图集下 DrawCall大小一样 性能优化
Txture:每使用一个Texture都会使DrawCall + 1;
Sprite:每个图集的DrawCall为1,
注意:
1.图集和图集之间的Sprite深度不能穿插,两图片深度之间 不能穿插其他图集 不然DrawCall会变大
2.Texture如果图片内容相同DrawCall不累加,如果图片内容不相同DrawCall累加
5.Unity中有几种光源
1. 方向光:Directional Light
用于模拟太阳,模拟自然光,方向光任何地方都能照射到,就和太阳一样,但是要注意照射方向。
2. 点光源:Point Light
用于模拟电灯泡的照射效果。
3. 聚光灯:Spot Light
用于模拟聚光灯照射效果。
4. 区域光:Area Light
区域光在“实时光照”模式下是无效的,仅在“烘焙光照”模式下有用。
6.lua中表怎么排序
table.sort()
7.lua的中元表?
元表与元方法概念
Lua中每个值都可具有元表。元表是普通的Lua表,定义了原始值在某些特定操作下
的行为。例如,当table作为加法的操作数时,Lua检查其元表中的"__add"字段是否有
个函数。如果有,Lua调用它执行加法。我们称元表中的键为事件(event),称值为
元方法(metamethod)。前述例子中的事件是"add",元方法是执行加法的函数。
Lua创建新的table的同时不会创建元表
t={}
print(getmetatable(t)) -->nil
可以使用setmetatable(t,t1)给t设置元表为t1。在Lua中,只能设置table的元表。
若要设置其他类型的元表,则必须通过C代码来完成。
8.动态加载资源的方式?
1.Resources.Load();
2.AssetBundle
9.对象池的概念,你的游戏中用了对象池吗 技能的释放回收是怎么通过对象池实现的
对象池就存放需要被反复调用资源的一个空间,当一个对象大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果 在F游戏中要常被大量复制的对象包括子弹,敌人,粒子等
10.你在酷跑游戏中人物跑上去 掉下来 吃到物品播放不同的声音 他们是怎么实现不卡顿
帧事件(具体肯定要代码来播放,自己去尝试哦)
11.LitJson解析(很重要 ,很多公司有上机题目,都有LitJson解析)
这里我提供一个(LitJosn下载地址) 使用的时候像下面的脚本一样引入LitJson
https://dl.pconline.com.cn/download/1017689-1.html
using UnityEngine;
using System.Collections;
using LitJson;
using System.Collections.Generic;
public class JsonTest2 : MonoBehaviour {
List he = new List ();
public TextAsset heroinfo;
void Start () {
TestToJson ();
JsonToTest ();
}
public void JsonToTest()
{
string str = heroinfo.text;//获取文本
JsonData jd = JsonMapper.ToObject (str);//将文本转换为Json形式的
JsonData jsonda = jd ["Name"];
Debug.Log (jsonda);
JsonData herolist = jd ["HeroList"];//得到的是值 有很多个
//Debug.Log (herolist);
//不能直接打印 要先遍历 因为获取的是值
for (int i = 0; i < herolist.Count; i++) {
JsonData data = herolist [i];
string heroname = data ["HeroName"].ToString ();
string hp = data ["HP"].ToString ();
string hk = data ["HK"].ToString ();
Hero h1 = new Hero ();
h1.Name = heroname;
h1.HP = int.Parse (hp);
h1.HK = int.Parse (hk);
he.Add (h1);
Debug.Log (h1.HK);
}
}
public void TestToJson()
{
Hero he1 = new Hero ();
he1.Name = "Liang";
he1.HP = 100;
he1.HK = 12;
Hero he2 = new Hero ();
he2.Name = "Wang";
he2.HP = 100;
he2.HK = 23;
JsonData jds1 = new JsonData ();
jds1 ["Name"] = he1.Name;
jds1 ["HP"] = he1.HP;
jds1 ["HK"] = he1.HK;
JsonData jds2 = new JsonData ();
jds2 ["Name"] = he2.Name;
jds2 ["HP"] = he2.HP;
jds2 ["HK"] = he2.HK;
JsonData jdd = new JsonData ();
jdd.Add (jds1);
jdd.Add (jds2);
JsonData j1 = new JsonData ();
j1 ["HeroList"] = jdd;
string s2 = j1.ToJson ();
Debug.Log (s2);
}
public class Hero
{
public string Name{ get; set; }
public int HP{ get; set; }
public int HK{ get; set; }
}
}
Unity中也有自带的解析
![13c566427d16ad942c84050267145670.png](https://i-blog.csdnimg.cn/blog_migrate/acf9c8a7e36b91855dec6e7cb4bfcdaa.jpeg)
![d1ff86bc21810257c224bf7f50d67b0f.png](https://i-blog.csdnimg.cn/blog_migrate/de78ecedbc5634c26f122ba996774442.jpeg)
12.在上机题目中动画这一部分也是经常会考到的
像我当初面试的时候笔试做完之后面试官让我上机给了我8张图片让我播放一下帧动画
(当时我就偷了一下懒 用了NGUI中的一组件UISpriteAnimation)
我把图片打为了一个图集 然后给一张图片添加了这个组件 然后写了一个脚本控制他什么时候播放
最后面试官看到了结果我被当场录取了
这就是编程这一行 人家只要结果 不管你过程是怎样 当你工作的时候 主程是不会去管你有多努力的在做这个项目,就算你做到12点 1点 最后结果不是那样 只能说明你的能力不行,你依然会被炒掉,当然你只花了半天就做完了,人家当然会认可你的能力,现实就是这样
所以如果你还刚踏入这一行业 那么就好好的学吧(我也是自学一步一步走来的)
好了 这篇文章就到这了 有时间我会再发员外的面试题目。