Unity面试8

http://blog.csdn.net/husheng0/article/details/47689005

1、请简述值类型与引用类型的区别?

答:区别:
1. 值类型存储在内存栈中 引用类型数据存储在内存堆 中,而内存单元中存放的是堆中存放的地址。
2.值类型存取快,引用类型存取慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。
4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。
5.值类型继承自System.ValueType,引用类型继承自System.Object。

可参考http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html

2、C#中所有引用类型的基类是什么?
答:引用类型的基类是System.Object 值类型的基类是System.ValueType
同时,值类型也隐式继承自System.Object

3、请简述ArrayList和List<Int>的主要区别?
答:ArrayList存在不安全类型‘(ArrayList会把所有插入其中的数据都当做Object来处理)
装箱拆箱的操作(费时)
List是接口,ArrayList是一个实现了该接口的类,可以被实例化。

4、请简述GC(垃圾回收)产生的原因,并描述如何避免?
答:GC回收堆上的内存
如何避免:

1)减少new产生对象的次数
2)使用公用的对象(静态成员)
3)将String换为StringBuilder


5、请描述Interface与抽象类之间的不同?
答:抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公共只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。
类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。
实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。


//string StringBuilder   string里面的内容是不可变的,

 //StringBuilder里面的内容是可变动的

// 当字符串里面的字符是频繁变动的时候,我们最好用StringBuilder 


8、请简述关键字Sealed用在类声明和函数声明时的作用?
答:类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。

9、请简述private,public,protected,internal的区别
答:
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
protected internal:protected + internal

10、反射的实现原理?
答:审查元数据并收集关于它的类型信息的能力。
参考http://blog.163.com/xuanmingzhiyou@yeah/blog/static/1424776762011612115124188/
反射个人认为,就是得到程序集中的属性和方法。
实现步骤:
1.导入using System.Reflection;
2.Assembly.Load("程序集")加载程序集,返回类型是一个Assembly
3.foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
得到程序集中所有类的名称
4.Type type = assembly.GetType("程序集.类名");获取当前类的类型
5.Activator.CreateInstance(type); 创建此类型实例
6.MethodInfo mInfo = type.GetMethod("方法名");获取当前方法
7.mInfo.Invoke(null,方法参数);

11、.Net与Mono的关系?
答:Mono官网主页
Mono is a software platform designed to allow developers to easily create 
cross platform applications. Sponsored by Xamarin, Mono is an open source 
implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
mono是.net的一个开源跨平台工具,就类似Java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,
可以运行于linux,Unix,Mac OS等。

12、简述Unity3D支持的作为脚本的语言的名称?
答:Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
JavaScript:和网页中常用的JavaScript不一样,它编译后的运行速度很快,语法方面也会有不少区别。
C#
Boo:可以看做是Python语言的变种,又糅合了Ruby和C#的特性,它是静态类型语言

13、Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
答:参考http://www.unitymanual.com/3821.html
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

14、Unity3D的协程和C#线程之间的区别是什么?
答:http://blog.csdn.net/kongbu0622/article/details/8775037
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。

16、简述四元数的作用,四元数对欧拉角的优点?
答:四元数用于表示旋转
相对欧拉角的优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

17、向量的点乘、叉乘以及归一化的意义?
1)点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
2)叉乘得到的向量垂直于原来的两个向量
3)标准化向量:用在只关系方向,不关心大小的时候。

18、矩阵相乘的意义及注意点?
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累


19、为何大家都在移动设备上寻求U3D原生GUI的替代方案?
不美观,OnGUI很耗费时间,使用不方便 ,DrawCall


20、请简述如何在不同分辨率下保持UI的一致性?
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。
原生GUI http://unity3d.9ria.com/?p=2587
NGUI http://blog.csdn.net/mfc11/article/details/17681429

21、为什么dynamic font在unicode环境下优于static font?

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。

22、Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同?
A renderer is what makes an object appear on the screen。
Mesh就是指模型的网格(同名组件是用于调整网格属性的),MeshFilter一般是用于获得模型网格的组件,而MeshRender是用于把网格渲染出来的组件

24、在场景中放置多个Camera并同时处于活动状态会发生什么?
答:游戏界面可以看到很多摄像机的混合

25、Prefab的作用?如何在移动环境的设备下恰当地使用它?
答:Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改
http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html

26、如何销毁一个UnityEngine.Object及其子类?
答:Destory

27、为什么Unity3D中会发生在组件上出现数据丢失的情况?
答:组件上绑定的对象被删除了

28、如何安全的在不同工程间安全地迁移asset数据?三种方法?

答:
将Assets目录和Library目录一起迁移
导出包
用unity自带的assets Server功能


29、MeshCollider和其他Collider的一个主要不同点?
答:Meshcollider再快也是基于V3顶点~~ 建议还是用boxcollider,boxcollider本身是基于算法,没有面的概念。

30、当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
穿透(碰撞检测失败)
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
(碰撞体变大,FixedUpdate, 代码限制)

31、OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
答:Awake -》OnEnable-》Start
OnEnable在同一周期中可以反复地发生
http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html

32、请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。

33、Unity3D如何获知场景中需要加载的数据?
答:题目是获取的意思?
Resource.Load
AssetBundle

34、MeshRender中material和sharedmaterial的区别?

修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。
不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。


1、请描述游戏动画有哪几种,以及其原理?
主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。
单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)

2、alpha blend 工作原理?
实际显示颜色 = 前景颜色*Alpha/255 + 背景颜色*(255-Alpha)/255
3、写光照计算中的diffuse的计算公式?
实际光照强度 I= 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);
环境光:Iambient= Aintensity* Acolor; (Aintensity表示环境光强度,Acolor表示环境光颜色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;
(Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)
镜面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;
(Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量,n称为镜面光指数)

4、lod是什么,优缺点是什么?
LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态地选择渲染不同细节的模型
缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。

5、两种阴影判断的方法工作原理?
阴影由两部分组成:本影与半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
求阴影区域的方法:做两次消隐过程
一次对每个光源进行消隐,求出对于光源而言不可见的区域L;
一次对视点的位置进行消隐,求出对于视点而言可见的面S;
shadow area= L ∩ S
阴影分为两种:自身阴影和投射阴影
自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
若是动态光源此方法就无效了。























  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值