在主程序运行的同时开启另一段逻辑处理,来协助当前程序的执行。开启协程是开启一个可以与程序并行的逻辑。可以控制运动、序列以及对象的行为。
碰撞器是触发器的载体(包含关系),触发器是碰撞器身上的一个属性。
当Is Trigger=false,碰撞器根据物理引擎进行碰撞,从而产生碰撞的效果,一般用的是OnCollisionEnter/Stay/Exit函数进行触发。
当Is Trigger=true时,碰撞器被物理引擎忽略,没有碰撞效果,就可以调用OnTriggerEnter/Stay/Exit函数。
当如果又想要进行检测,而不想让物体的接触影响到物体移动或要检测一个物体是否会经过某一个空间区域,这时就可以用到触发器。
两个物体都必须带有碰撞器Collider,其中一个还必须带有Rigidbody刚体。
ArrayList存在不安全类型,会把所有插入其中的数据当作Object处理(ArrayList是非线程安全实现,不同步)
装箱与拆箱的操作
List是接口,ArrayList是一个实现该接口的类,可以被实例化
原因是:GC回收堆上的内存(当内存占满一定的空间,就需要进行数据释放,就是GC)
避免:
审查元数据并收集关于它的类型信息的能力。
实验步骤:
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,方法参数);
作用:四元数用于表示旋转
优点:能进行增量旋转,避免万向锁
给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
Awake->OnEnable->Start
OnEnable在同一周期中可以反复地发生
如果修改sharedMaterial将改变所有使用这个材质的外观,并且也改变储存在工程里的材质设置。
不推荐修改shareMaterial返回的材质。想要修改渲染器的材质,使用material代替。
网络接口层:这是协议栈的最低层,对应OSI的物理层和数据链路层,主要完成数据帧的实际发送和接收。
网络层:处理分组在网络中的活动,例如路由器选择和转发等,这一层主要时包括IP协议,ARP,ICMP协议等。
传输层:主要功能是提供应用程序之间的通信,这一层主要是TCP/UDP协议。
应用层:用来处理特定的应用,针对不同的应用提供不同的协议,例如进行文件传输时用到的FTP协议,发送email用到的SMTP等。
四种
平行光:Directional Light
点光源:Point Light
聚光灯:Spot Light
区域光源:Area Light
对象池就存放需要被反复调用资源的一个空间,比如游戏中要长被大量赋值的对象,子弹,敌人,以及任何重复出现的对象。
Rigidbody具有完全真实物理的特性,而CharacterController可以说时受限的Rigidbody,具有一定的物理效果但不是完全真实的。
LateUpdate,是所有的Update结束后才进行调用,比较适合用于命令脚本的执行。要等到Update中的操作都进行完成后才进行摄像机的跟随效果,不然可能会出现视角中未有角色空帧出现。
在游戏运行时实例化,prefab相当于一个模板,对已有的素材,脚本,参数可以进行一个默认的配置,便于以后的修改,同时prefab打包内容简化了导出的操作,用于分享。
类声明时可防止其他类继承此类,在方法中声明则防止派生类重写此方法
Public-对任何类和成员都公开,无限制访问
Private-仅对该类进行公开
Protected-对该类和其他派生类进行公开
Internal-只能在包含该类的程序集中访问该类
Protected internal:protected+internal
顶点处理:GPU读取顶点数据根据顶点数据确定形状的形状和位置关系,建立起3D图形的骨架。硬件实现:Vertex Shader(定点着色器)
光栅化计算:生成图形上的点和线进行算法得到像素点。把矢量图转化成像素点的过程就是光栅化。例:数字表示斜线段变成阶梯式连续像素点
纹理贴图:营造真实,TMU,贴图
像素处理:像素进行光栅化期间像素着色器初期,GPU完成对像素的计算和处理,从而得到每一个像素的最终输写。像素着色器完成
最终输出:ROP(光栅化引擎)完成最终输出,1帧渲染完毕,被送上显存帧缓冲区
总结:GPU的工作通俗的说是完成3D图形的生成,将图形映射到相应的像素点上,对每一个像素点进行计算最终生成颜色并且输出。
是指在显示器上为了显示出图像而经过的一系列必要操作。渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有:
本地坐标-视图坐标-背面裁剪-光照-剪裁-投影-视图变换-光栅化
OnCollisionEnter
OnCollisionStay
OnCollisionExit
Rigidbody.AddForce
Rigidbody.AddForceAtPosition
Hinge Joint,可以模拟两个物体间用一个链条连接在一起的活动,能保持两个物体在一定距离里相互移动不产生作用力,但是达到固定距离后就会产生拉力
Transform.Rotate()
PlayerPrefs.SetInt() PlayerPrefs.GetInt()
Awake-Start-Update-FixedUpdate-LateUpdate-OnGUI-Reset-OnDisable-OnDestroy
FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降
FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关
Update就比较适合做控制
游戏界面可以看到很多摄像机的混合
使用Destroy()方法
主要有关节动画、骨骼动画、单一网络模型动画(关键帧动画)。
关节动画:把角色分成若干独立部分,一个部分对应一个网络模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
骨骼动画:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网络蒙在骨骼之外,决定角色的外观;
单一网格模型动画:由一个完整的网络模型构成,在动画序列的关键帧里记录各个顶点的原位置及其该变量,然后插值运算实现动画效果,角色动画较真实。
一般是组件上绑定的物体对象被删除了
Alpha Blend实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设
diffuse=Kd×colorLight×max(N*L,0);Kd漫反射系数,colorLight光的颜色,N单位法线向量,L由点指向光源的单位向量,其中N与L点乘,如果结果小于等于0,则漫反射为0
LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程序决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
本影和半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
半影:景物表面上那些被某些特定特定直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按照视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
顶点着色器是一段执行在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几个过程。
MipMapping:在三位计算机图形的贴图渲染中常用到的技术,可以加块渲染进度和减少图像锯齿,贴图会被计算器处理成一系列优化和计算过的图片组成的文件,这样的贴图被称为MipMap.
抽象类表示该类中可能已经有一些方法的具体定义,但接口只能定义各个方法的界面,不能具体的实现代码在成员方法中
类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类可以重写该父类的方法
实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个
String a=new string(“abc”);
a=(a.ToUpper()+”123”).Substring(0,2);
回答:在C#中会报错(Java中可用),改为:string b=new string(new char[]{“a,b,c”});
List Is=new List(new int[]{1,2,3,4,5});
Foreach(int item in IS)
{
Console.Write(item*item);
Is.Remove(item);
}
回答:会产生运行时错误,因为foreach就只读的。不能一边遍历一边修改
mono时.net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台编译运行,可以运行于linux,Unix,Mac OS等
Untiy的脚本语言基于Mono的.Net平台运行,可以使用.NET库,为XML,数据库,正则表达式等问题提供了很好的解决方案
Unity的脚本会经过编译,一般使用JavaScript,C#,Boo
仅能从主线程中访问Unity3d的组件,对象和Unity3d系统调用
支持:如果同时要处理多种事情或者与Unity对象互动小可以使用thread,否则使用coroutine
C#中有lock这个关键字可以确保一个线程可以在特定时间内访问特定的对象
Unity的协程和C#线程之间的区别是什么?
多线程程序同时运行多个线程,而任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起
除主线程之外的线程无法访问Unity的对象,组件,方法
Unity没有多线程的概念,但是unity其中也包括了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。StartCoroutime为什么叫协同程序,协同,就是当StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
Transform父类是Component
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累
不美观,OnGUI很耗费时间,使用不方便
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来预设的屏幕分辨率求出一个对比值,然后修改摄像机的size
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个所有字体的字符纹理。当需要支持亚洲语言或者较大字体的时候若使用正常纹理,则字体的纹理将非常大。
穿透(碰撞检测失败)
当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要额外操作。
区别:动态批一切都是自动,不需要多余操作,而且物体是可以移动,但是限制很多。静态批处理:自由度很高,限制少,缺点是会占用更多的内存,而且经过静态批的物体不可以移动。
string是字符串变量;stringBuffer是字符串变量,线程安全;stringBuilder是字符串变量,线程不安全。
Srtring类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里不断改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
stringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善性能。连接操作频繁的时候,用stringBuilder对象
LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。
Unity3d支持C#,javascript等,cocos2d-x支持c++,Html5,Lua等
Cocos2d 开源 并且免费
Unity3d支持iOS,Android,Windows,Mac,Wii等平台的游戏开发,cocos2d-x支持iOS,Android,WP等
C#与C++比较的话,最重要的特性就是C#是一种完全面向对象的语言,而C++不是,另外C#是基于IL中间语言和.NET Framework CLR的,在可移植性,可维护性和强壮性都比C++有很大的改进。C#的设计目标是用来开发快速稳定可扩展的应用程序,当然也可以通过Interop.
表面着色器的抽象层次比较高,它可以轻松地简洁方式实现负责着色,表面着色器可同时在前向渲染及延迟渲染模式下正常工作。
顶点片段着色器可以非常灵活地实现需要效果,但是需要编写更多代码,很难与Unity地渲染管线完美集成。
固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行时,可以通过固定功能管线着色器来绘制出一些基本的内容。
Char*strcpy(char*strDest,const char*strSrc)
{
If((strDest==NULL)||(strSrc==NULL))
{
If(strDest==NULL)||(strSrc==NULL)
{
Throw “Invalid argument(s)”;
Char*strDestCopy==strDest;
While((*strDest++=*strSrc++)!=’\0’);
Return strDestCopy;
}
}
}
错误的做法:
附
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修饰符修改它。
结构体是一种值类型,而类是引用类型(值类型、引用类型是根据数据储存的角度来分的)
就是值类型用于储存数据的值,引用类型用于储存对实际数据的引用,那么结构体就是当成值来使用的,类则通过引用来对实际数据操作
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
}
ref和out参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小。
不同点就是输出参数必须对参数进行初始化
ref参数是引用 out参数为输出参数
委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于一组方法的列表的引用。
用处:使用委托使程序员可以奖方法引用封装到委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时自导将调用哪个方法。与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的返回值控制何时恢复协同程序进行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。
缺点:协同程序并非真线程,可能会发生堵塞。
里氏代换原则(Liskov SubStitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现,作用方便扩展功能。
Mock和Stub有何区别?
Mock与Stub的区别:
Mock:关注行为验证。细粒度的测试,即代码的测试,即代码的逻辑,多数情况下用于单元测试。
Stub:关注状态验证。粗细度的测试,在某个依赖系统不存在或者还没实现或者难以测试的情况下使用,例如访问文件系统,数据库连接,远程协议等。
序列化简单理解成把对象转换为容易传输的格式的过程。比如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务端之间创数该对象。
栈通常保存着我们代码执行的步骤,如在代码段1中AddFive()方法,int pValue变量,int result变量等等。而堆上存放的则多的是对象,数据。(在忽略编译器优化的条件下)我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部去走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶部取走(called a Frame,调用帧),接着下一个。堆则不然,像一个仓库,储存着我们使用的各种对象信息,跟栈不同的是他们被调用完毕不会立即清理掉。
代理就是用来定义指向方法的引用
C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器。
选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序(学)
射线的3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。
socket通常也称作“套接字”实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。
http协议传输的主要有http协议和基于http协议的Soap协议,常见的方式是http的post和get请求,web服务。
裁剪平面。从相机到开始渲染和停止渲染之间的距离。
在Game视图右上角点击Stats.降低Draw Call的技术是Draw Call Batching
Alpha test 中文是透明度测试。简而言之就是在V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的值alpha值与固定值进行比较。Alpha Test语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要不完全透明,要不看不到,完全不透明。
对旋转角度进行计算时用到四元数
仅深度,该模式用于对象是不被剪裁
Void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
设置游戏对象为Static将会剔除(或禁用)网络对象当作部分被静态物体挡住而不可见时。因此,在你的场景中所有不会动的物体都应该标记为Static.
把A组的物体的渲染队列大于B组物体的渲染队列
Sprite作为UI精灵使用,Texture作用模型贴图使用
答:没有区别,因为不管几张贴图只渲染一次。
Unity中,每次引擎准备数据并通知GPU的过程被成为一次DrawCall.DrawCall越高对显卡的消耗也是越大,降低DrawCall的方法:
Dynamic Batching
Static Batching
高级特性Shader降级为统一的低级特性的Shader
可以有cookies-带有alpha通道的立方图纹理。点光源最耗费资源。
作用就是Alpha混合。公式:最终颜色=源颜色源透明度+目标颜色(1-透明度值)
对水面的贴图纹理进行扰动,以产生波光玲玲的效果。用shader可以通过GPU在像素级别扰动,效果细腻,需要的顶点少,速度快
对Grid和Table下的子物体进行排序和定位
只要提供一个half-pixel偏移量,它可以让一个控件的位置在Windows系统上精确的显示出来(只有这个Anchor的子控件会受到影响)
如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘
UIPanel用来收集和管理它下面所有widget的组件。通过widget的geometry创建实际的draw call。没有panel所有东西都不能够被渲染出来,你可以把UIPanel当做Renderer
IEnumerable;GetIEnumerator
个人笔记,如有错漏之处,敬请指正