Unity笔记1

  1. 什么是协同程序?

在主程序运行的同时开启另一段逻辑处理,来协助当前程序的执行。开启协程是开启一个可以与程序并行的逻辑。可以控制运动、序列以及对象的行为。

  1. Unity中的碰撞器和触发器的区别是?

碰撞器是触发器的载体(包含关系),触发器是碰撞器身上的一个属性。

Is Trigger=false,碰撞器根据物理引擎进行碰撞,从而产生碰撞的效果,一般用的是OnCollisionEnter/Stay/Exit函数进行触发。

当Is Trigger=true时,碰撞器被物理引擎忽略,没有碰撞效果,就可以调用OnTriggerEnter/Stay/Exit函数。

当如果又想要进行检测,而不想让物体的接触影响到物体移动或要检测一个物体是否会经过某一个空间区域,这时就可以用到触发器。

  1. 物体发生碰撞的必要条件

两个物体都必须带有碰撞器Collider,其中一个还必须带有Rigidbody刚体。

  1. 简述ArrayList和List主要区别

ArrayList存在不安全类型,会把所有插入其中的数据当作Object处理(ArrayList是非线程安全实现,不同步)

装箱与拆箱的操作

List是接口,ArrayList是一个实现该接口的类,可以被实例化

  1. 请简述GC(垃圾回收)产生的原因,并描述如何避免?

原因是:GC回收堆上的内存(当内存占满一定的空间,就需要进行数据释放,就是GC)

避免:

  1. 减少new产生对象的次数
  2. 尽量使用公用的对象(静态成员)
  3. 将String换为StringBuilder
  1. 反射的实现原理?

审查元数据并收集关于它的类型信息的能力。

实验步骤:

Using System.Reflection;

Assembly.Load(“程序集”);//加载它的程序集,并且返回类型是Assembly

得到程序集中所有的类的名称

Foreach(Type type in assembly.GetTypes())

{

String t=type.Name;

}

Type type=assembly.GetType(“程序集,类名”);//获取当前类的类型

Activator.CreateInstance(type);//创建此类型实例

MethodInfo mInfo=type.GetMethod(“方法名”);//获取当前方法

mInfo.Invoke(null,方法参数);

  1. 简述四元数Quaternion的作用,四元数对欧拉角的优点?

作用:四元数用于表示旋转

优点:能进行增量旋转,避免万向锁

给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

  1. 如何安全的在不同工程间安全地迁移asset数据?三种方法
  1. 将Assets和Library一起迁移
  2. 导出包package
  3. 用unity自带的assets Server功能
  1. OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?

Awake->OnEnable->Start

OnEnable在同一周期中可以反复地发生

  1. MeshRender中material和sharedmaterial的区别?

如果修改sharedMaterial将改变所有使用这个材质的外观,并且也改变储存在工程里的材质设置。

不推荐修改shareMaterial返回的材质。想要修改渲染器的材质,使用material代替。

  1. TCP/IP协议栈各个层次及分别的功能

网络接口层:这是协议栈的最低层,对应OSI的物理层和数据链路层,主要完成数据帧的实际发送和接收

网络层:处理分组在网络中的活动,例如路由器选择和转发等,这一层主要时包括IP协议,ARP,ICMP协议等。

传输层:主要功能是提供应用程序之间的通信,这一层主要是TCP/UDP协议。

应用层:用来处理特定的应用,针对不同的应用提供不同的协议,例如进行文件传输时用到的FTP协议,发送email用到的SMTP等。

  1. Unity提供了几种光源,分别是什么

四种

平行光:Directional Light

点光源:Point Light

聚光灯:Spot Light

区域光源:Area Light

  1. 简述一下对象池,FPS里哪些东西适合使用对象池?

对象池就存放需要被反复调用资源的一个空间,比如游戏中要长被大量赋值的对象,子弹,敌人,以及任何重复出现的对象。

  1. CharacterController和Rigidbody的区别?

Rigidbody具有完全真实物理的特性,而CharacterController可以说时受限的Rigidbody,具有一定的物理效果但不是完全真实的。

  1. 移动相机动作在哪个函数里,为什么在这个函数里?

LateUpdate,是所有的Update结束后才进行调用,比较适合用于命令脚本的执行。要等到Update中的操作都进行完成后才进行摄像机的跟随效果,不然可能会出现视角中未有角色空帧出现。

  1. 简述prefab的用处

在游戏运行时实例化,prefab相当于一个模板,对已有的素材,脚本,参数可以进行一个默认的配置,便于以后的修改,同时prefab打包内容简化了导出的操作,用于分享。

  1. 简述sealed关键字用在类声明时与函数声明时的作用

类声明时可防止其他类继承此类,在方法中声明则防止派生类重写此方法

  1. 简述private,public,protected,internal的区别

Public-对任何类和成员都公开,无限制访问

Private-仅对该类进行公开

Protected-对该类和其他派生类进行公开

Internal-只能在包含该类的程序集中访问该类

Protected internal:protected+internal

  1. GPU的工作原理

顶点处理:GPU读取顶点数据根据顶点数据确定形状的形状和位置关系,建立起3D图形的骨架。硬件实现:Vertex Shader(定点着色器)

光栅化计算:生成图形上的点和线进行算法得到像素点。把矢量图转化成像素点的过程就是光栅化。例:数字表示斜线段变成阶梯式连续像素点

纹理贴图:营造真实,TMU,贴图

像素处理:像素进行光栅化期间像素着色器初期,GPU完成对像素的计算和处理,从而得到每一个像素的最终输写。像素着色器完成

最终输出:ROP(光栅化引擎)完成最终输出,1帧渲染完毕,被送上显存帧缓冲区

总结:GPU的工作通俗的说是完成3D图形的生成,将图形映射到相应的像素点上,对每一个像素点进行计算最终生成颜色并且输出。

  1. 什么是渲染管道?

是指在显示器上为了显示出图像而经过的一系列必要操作。渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

主要步骤有:

本地坐标-视图坐标-背面裁剪-光照-剪裁-投影-视图变换-光栅化

  1. 如何优化内存?
  1. 压缩自带类库
  2. 将暂时不用的以后还需要使用的物体隐藏起来而不用直接Destroy掉
  3. 释放AssetBundle占用资源
  4. 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小
  5. 使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)
  1. 动态加载资源的方式?
  1. Resources.Load();
  2. AssetBundle
  1. 使用Unity3d实现2d游戏,有几种方式?
  1. 使用本身GUI、UGUI
  2. 把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴
  3. 使用2d插件,如2DToolKit、NGUI
  1. 在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数 三个阶段

OnCollisionEnter

OnCollisionStay

OnCollisionExit

  1. Unity3D的物理引擎中,有几种施加力的方式,分别描述出来

Rigidbody.AddForce

Rigidbody.AddForceAtPosition

  1. 什么叫做链条关节

Hinge Joint,可以模拟两个物体间用一个链条连接在一起的活动,能保持两个物体在一定距离里相互移动不产生作用力,但是达到固定距离后就会产生拉力

  1. 物体自身旋转使用的函数

Transform.Rotate()

  1. Unity3D提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数

PlayerPrefs.SetInt() PlayerPrefs.GetInt()

  1. Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法

Awake-Start-Update-FixedUpdate-LateUpdate-OnGUI-Reset-OnDisable-OnDestroy

  1. 物理更新一般放在哪个系统函数里

FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降

FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关

Update就比较适合做控制

  1. 在场景中放置多个Camera并同时处于活动状态会发生什么?

游戏界面可以看到很多摄像机的混合

  1. 如何销毁一个UnityEngine.Object以及子类

使用Destroy()方法

  1. 请描述游戏动画有哪几种,以及其原理

主要有关节动画、骨骼动画、单一网络模型动画(关键帧动画)。

关节动画:把角色分成若干独立部分,一个部分对应一个网络模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;

骨骼动画:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网络蒙在骨骼之外,决定角色的外观;

单一网格模型动画:由一个完整的网络模型构成,在动画序列的关键帧里记录各个顶点的原位置及其该变量,然后插值运算实现动画效果,角色动画较真实。

  1. 请描述为什么Unity3d中会发生在组件上出现数据丢失的情况

一般是组件上绑定的物体对象被删除了

  1. Alpha blend工作原理

Alpha Blend实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设

  1. 写出光照计算中的diffuse的计算公式

diffuse=Kd×colorLight×max(N*L,0);Kd漫反射系数,colorLight光的颜色,N单位法线向量,L由点指向光源的单位向量,其中N与L点乘,如果结果小于等于0,则漫反射为0

  1. LOD是什么,优缺点是什么

LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程序决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

  1. 两种阴影判断的方法,工作原理

本影和半影

本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)

半影:景物表面上那些被某些特定特定直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)

工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按照视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)

  1. Vertex Shader是什么,怎么计算?

顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline和transformation和lighting,Vertex Shader主要操作顶点。

Vertex Shader对输入顶点完成了从local space和homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space.在这其间共有world transformation,view transformation和projection transformation以及lighting几个过程。

  1. MipMap是什么,作用?

MipMapping:在三位计算机图形的贴图渲染中常用到的技术,可以加块渲染进度和减少图像锯齿,贴图会被计算器处理成一系列优化和计算过的图片组成的文件,这样的贴图被称为MipMap.

  1. 请描述Interface与抽象类之间的不同

抽象类表示该类中可能已经有一些方法的具体定义,但接口只能定义各个方法的界面,不能具体的实现代码在成员方法中

类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类可以重写该父类的方法

实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个

  1. 下面代码在运行中会产生几个临时对象?

String a=new string(“abc”);

 a=(a.ToUpper()+”123”).Substring(0,2);

回答:在C#中会报错(Java中可用),改为:string b=new string(new char[]{“a,b,c”});

  1. 下列代码在运行中会发生什么问题,如何避免?

List Is=new List(new int[]{1,2,3,4,5});

Foreach(int item in IS)

{

Console.Write(item*item);

Is.Remove(item);

}

回答:会产生运行时错误,因为foreach就只读的。不能一边遍历一边修改

  1. .Net和Mono的关系?

mono时.net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台编译运行,可以运行于linux,Unix,Mac OS等

  1. 简述Unity支持的作为脚本的语言的名称

Untiy的脚本语言基于Mono的.Net平台运行,可以使用.NET库,为XML,数据库,正则表达式等问题提供了很好的解决方案

Unity的脚本会经过编译,一般使用JavaScript,C#,Boo

  1. Unity是否支持写成多线程程序,如果支持的话需要注意什么

仅能从主线程中访问Unity3d的组件,对象和Unity3d系统调用

支持:如果同时要处理多种事情或者与Unity对象互动小可以使用thread,否则使用coroutine

C#中有lock这个关键字可以确保一个线程可以在特定时间内访问特定的对象

Unity的协程和C#线程之间的区别是什么?

多线程程序同时运行多个线程,而任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起

除主线程之外的线程无法访问Unity的对象,组件,方法

Unity没有多线程的概念,但是unity其中也包括了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。StartCoroutime为什么叫协同程序,协同,就是当StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。

  1. U3D中用于记录节点空间几何信息的组件名称,及其父类名称

Transform父类是Component

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

用于表示线性变换:旋转、缩放、投影、平移、仿射

注意矩阵的蠕变:误差的积累

  1. 为何大家都在移动设备上寻求U3D原生GUI的替代方案

不美观,OnGUI很耗费时间,使用不方便

  1. 请简述如何在不同分辨率下保持UI的一致性

NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来预设的屏幕分辨率求出一个对比值,然后修改摄像机的size

  1. 为什么dynamic font在unicode环境下优于static font

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。

使用动态字体时,Unity将不会预先生成一个所有字体的字符纹理。当需要支持亚洲语言或者较大字体的时候若使用正常纹理,则字体的纹理将非常大。

  1. 当一个细小的高速物体撞向零一个较大的物体时,会出现什么情况,如何避免

穿透(碰撞检测失败)

  1. 请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?

当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算

  1. 什么叫动态合批?跟静态合批有什么区别?

如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要额外操作。

区别:动态批一切都是自动,不需要多余操作,而且物体是可以移动,但是限制很多。静态批处理:自由度很高,限制少,缺点是会占用更多的内存,而且经过静态批的物体不可以移动。

  1. 简述StringBuilder和String的区别?

string是字符串变量;stringBuffer是字符串变量,线程安全;stringBuilder是字符串变量,线程不安全。

Srtring类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里不断改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。

stringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善性能。连接操作频繁的时候,用stringBuilder对象

  1. 什么是LightMap?

LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。

  1. Unity和cocos2d的区别?

Unity3d支持C#,javascript等,cocos2d-x支持c++,Html5,Lua等

Cocos2d 开源 并且免费

Unity3d支持iOS,Android,Windows,Mac,Wii等平台的游戏开发,cocos2d-x支持iOS,Android,WP等

  1. C#和C++的区别?

C#与C++比较的话,最重要的特性就是C#是一种完全面向对象的语言,而C++不是,另外C#是基于IL中间语言和.NET Framework CLR的,在可移植性,可维护性和强壮性都比C++有很大的改进。C#的设计目标是用来开发快速稳定可扩展的应用程序,当然也可以通过Interop.

  1. Unity3D Shader分哪几种,有什么区别?

表面着色器的抽象层次比较高,它可以轻松地简洁方式实现负责着色,表面着色器可同时在前向渲染及延迟渲染模式下正常工作。

顶点片段着色器可以非常灵活地实现需要效果,但是需要编写更多代码,很难与Unity地渲染管线完美集成。

固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行时,可以通过固定功能管线着色器来绘制出一些基本的内容。

  1. 已知strcpy函数的原型是:

Char*strcpy(char*strDest,const char*strSrc)

{

  1. 不调用库函数,实现strcpy函数
  2. 解释为什么要返回char*

If((strDest==NULL)||(strSrc==NULL))

{

If(strDest==NULL)||(strSrc==NULL)

{

Throw “Invalid argument(s)”;

Char*strDestCopy==strDest;

While((*strDest++=*strSrc++)!=’\0’);

Return strDestCopy;

}

}

}

错误的做法:

  1. C#中四种访问修饰符是哪些?各有什么区别?
  1. 属性修饰符2.存取修饰符3.类修饰符4.成员修饰符

1.属性修饰符:

Serializable:按值将对象封送到远程服务器

STATread:是单线程套间的意思,是一种线程模型

MATAThread:是多线程套间的意思,也是一种线程模型

2.存取修饰符:

Public 存取不受限制

Private 只有包含该成员的类可以存取

Internal 只有当前命名空间可以存取

Protected 只有包含该成员的类以及派生类可以存取

3.类修饰符:

Abstract:抽象类。指示一个类只能作为其他类的基类

Sealed:密封类。知识一个类不能被继承。密封类必能同时又是抽象类。因为抽象类是希望类继承的。

4.成员修饰符:

Abstract:指示该方法或属性没有实现

Sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每一个成员都可以被作为密封的方法密封,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。

Delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate+event的。

Const:指定该成员的值只读不允许被修改。

Event:声明一个事件

Extern:指示方法在外部实现

Override:重写。对由基类继承成员的新实现

Readonly:指示一个域只能在声明时以及同时类的内部被赋值

Static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用

Virtual:指示一个方法或存取器的实现可以在继承类中被覆盖

New:在派生类中隐藏指定的基类成员,从而实现重写的功能若要隐藏继承类的成员,请使用相同的名称在派生类中声明该成员,并用new修饰符修改它。

  1. Heap与Stack有何区别?
  1. heap是堆,stack是栈。
  2. stack栈的空间由操作系统自动分配和释放,heap堆的空间是手动申请和释放的,heap常用new关键字来分配。
  3. stack栈空间有限,heap堆的空间是很大的自由区。
  1. 值类型和引用类型有何区别?
  1. 值类型的数据储存在内存的栈中,引用类型的数据储存在内存的堆中,而内存单元中只存放堆中对象的地址。
  2. 值类型存取速度快,引用类型存取速度慢
  3. 值类型表示实际数据,引用类型表示指向储存在内存堆中的数据的指针或引用
  4. 值类型继承自System.ValueType,引用类型继承自System.Object
  5. 栈的内存分配是自动释放;而堆在.NET中会有GC来释放
  6. 值类型的变量直接存放实际的数据,而引用类型的变量存放的是数据的地址,即对象的引用
  7. 值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中。
  1. 结构体和类有何区别?

结构体是一种值类型,而类是引用类型(值类型、引用类型是根据数据储存的角度来分的)

就是值类型用于储存数据的值,引用类型用于储存对实际数据的引用,那么结构体就是当成值来使用的,类则通过引用来对实际数据操作

  1. 请写出斐波那契数列任意一位值得算法

Static int Fn(int n)

{

If(n<=0)

{

Throw new ArgumentOutRangeException();

}

If(n==1||n==2)

{

Return 1;

}

Return cheched(Fn(n-1)+Fn(n-2));//where n>46 memory will overflow

}

  1. ref参数和out参数是什么?有什么区别?

ref和out参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小。

不同点就是输出参数必须对参数进行初始化

ref参数是引用 out参数为输出参数

  1. C#的委托是什么?有何用处?

委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于一组方法的列表的引用。

用处:使用委托使程序员可以奖方法引用封装到委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时自导将调用哪个方法。与C或C++的函数指针不停,委托时面向对象,而且是类型安全的。

协同程序的执行代码是什么?有何用处?有何缺点?

Function Start(){

//-After 0 seconds,prints”Starting 0.0” -0秒后,打印“开始0.0

//-After 0 seconds,prints “Before WaitAndPrint Finishes 0.0”0秒后,在等待和打印完成0.0之前打印

// - After 2 seconds, prints "WaitAndPrint 2.0"//-2秒后,打印“WaitAndPrint 2.0”

// 先打印"Starting 0.0"和"Before WaitAndPrint Finishes 0.0"两句,2秒后打印"WaitAndPrint 2.0"

print ("Starting " + Time.time );

//启动函数WaitAndPrint作为协同程序。并在运行时继续执行

//这与WaintAndPrint(2.0)相同,因为编译器会自动为您执行此操作

// 协同程序WaitAndPrint在Start函数内执行,可以视同于它与Start函数同步执行.

StartCoroutine(WaitAndPrint(2.0));

Print(“Before WaitAndPrint Finishes”+Time.time);

}

Function WaitAndPrint(waitTime;float)

{

// 暂停执行waitTime秒

yield WaitForSeconds (waitTime);

print ("WaitAndPrint "+ Time.time );

}

作用:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序进行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。

缺点:协同程序并非真线程,可能会发生堵塞。

  1. 什么是里氏代换原则?

里氏代换原则(Liskov SubStitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现,作用方便扩展功能。

Mock和Stub有何区别?

Mock与Stub的区别:

Mock:关注行为验证。细粒度的测试,即代码的测试,即代码的逻辑,多数情况下用于单元测试。

Stub:关注状态验证。粗细度的测试,在某个依赖系统不存在或者还没实现或者难以测试的情况下使用,例如访问文件系统,数据库连接,远程协议等。

  1. 概述序列化:

序列化简单理解成把对象转换为容易传输的格式的过程。比如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务端之间创数该对象。

  1. 堆和栈的区别

栈通常保存着我们代码执行的步骤,如在代码段1中AddFive()方法,int pValue变量,int result变量等等。而堆上存放的则多的是对象,数据。(在忽略编译器优化的条件下)我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部去走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶部取走(called a Frame,调用帧),接着下一个。堆则不然,像一个仓库,储存着我们使用的各种对象信息,跟栈不同的是他们被调用完毕不会立即清理掉。

  1. 概述C#中代理和事件

代理就是用来定义指向方法的引用

C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器。

  1. C#中的排序方法有哪些

选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序(学)

  1. 射线检测碰撞物的原理是?

射线的3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。

  1. 客户端与服务端交互方式有几种?

socket通常也称作“套接字”实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。

http协议传输的主要有http协议和基于http协议的Soap协议,常见的方式是http的post和get请求,web服务。

  1. Unity中,照相机的Clipping Planes的作用是什么?调整Near、Fare两个值时,应该注意什么?

裁剪平面。从相机到开始渲染和停止渲染之间的距离。

  1. 如何在Unity3D中查看场景的面试,顶点数和Draw Call数?如何降低Draw Call数?

在Game视图右上角点击Stats.降低Draw Call的技术是Draw Call Batching

  1. 请问alpha test 在何时使用?能达到什么效果?

Alpha test 中文是透明度测试。简而言之就是在V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的值alpha值与固定值进行比较。Alpha Test语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要不完全透明,要不看不到,完全不透明。

  1. UNITY3D在移动设备上的一些优化资源的方法
  1. 使用assetbundle,实现资源分类和分享,将内存控制到200m之内,同时也可以实现资源的在线更新
  2. 顶点数对渲染无论cpu还是gpu都是最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右
  3. 只需要一盏动态光,不是用阴影,不使用光照探头,粒子系统时cpu上的大头
  4. 剪裁粒子系统
  5. 合并同时出现的粒子系统
  6. 自己实现轻量级的粒子系统,animator也是一个效率奇差的地方
  7. 把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下
  8. animator出现事业不更新
  9. 删除无意义的animator
  10. animator的初始化很耗时(粒子上尽量不要使用)
  11. 除主角外部都不要跟骨骼运动apply root motion
  12. 绝对禁止掉那些不带刚体带包围盒的物体(static collider)运动
  13. NGUI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下
  14. 每帧递归的计算finalalpha改为只有初始化和变动时计算
  15. 去掉法线计算,不要每帧计算viewsizeg和windowsize
  16. filldrawccall时构建顶点缓存使用array.copy
  17. 代码剪裁:使用strip level,使用.Net2.0 subset
  18. 尽量减少smooth group
  19. 给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具
  1. 四元数有什么用处?

对旋转角度进行计算时用到四元数

  1. 将Camera组件的ClearFlags选项选成Depth only是什么意思。有什么作用

仅深度,该模式用于对象是不被剪裁

  1. 如何让已经存在的GameObject在LoadLevel后不被卸载掉

Void Awake()

{

DontDestroyOnLoad(transform.gameObject);

}

  1. 在编辑场景时将GameObject设置为Static 有何作用?

设置游戏对象为Static将会剔除(或禁用)网络对象当作部分被静态物体挡住而不可见时。因此,在你的场景中所有不会动的物体都应该标记为Static.

  1. 有A和B两物体,什么办法可以保证A永远比B先渲染?

把A组的物体的渲染队列大于B组物体的渲染队列

  1. 将图片的TextureType选项分别选为Texture和Sprite有什么区别

Sprite作为UI精灵使用,Texture作用模型贴图使用

  1. 问一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别?为什么?

答:没有区别,因为不管几张贴图只渲染一次。

  1. 什么是DrawCall?DrawCall高了又什么影响?如何降低DrawCall?

Unity中,每次引擎准备数据并通知GPU的过程被成为一次DrawCall.DrawCall越高对显卡的消耗也是越大,降低DrawCall的方法:

Dynamic Batching

Static Batching

高级特性Shader降级为统一的低级特性的Shader

  1. 实时点光源的优缺点是什么?

可以有cookies-带有alpha通道的立方图纹理。点光源最耗费资源。

  1. Unity的Shader中,Blend SrcAlpha OneMinusSrcAlpha这句话是什么意思?

作用就是Alpha混合。公式:最终颜色=源颜色源透明度+目标颜色(1-透明度值)

  1. 简述水面倒影的渲染原理

对水面的贴图纹理进行扰动,以产生波光玲玲的效果。用shader可以通过GPU在像素级别扰动,效果细腻,需要的顶点少,速度快

  1. 简述NGUI中Grid和Table的作用?

对Grid和Table下的子物体进行排序和定位

  1. 请简述NGUI中Panel和Anchor的作用

只要提供一个half-pixel偏移量,它可以让一个控件的位置在Windows系统上精确的显示出来(只有这个Anchor的子控件会受到影响)

如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘

UIPanel用来收集和管理它下面所有widget的组件。通过widget的geometry创建实际的draw call。没有panel所有东西都不能够被渲染出来,你可以把UIPanel当做Renderer

  1. 能用foreach遍历访问的对象需要实现__接口或声明_方法的类型

IEnumerable;GetIEnumerator

个人笔记,如有错漏之处,敬请指正

你可能感兴趣的:(unity,游戏引擎)