Unity知识点0008(Yanlz+Framework+Unity+LOD+Mipmap+ref+out+params+delegate+event+)

        《Unity知识点》

##《Unity知识点》发布说明:程序员

++++这是立钻哥哥对Unity知识点的一个梳理和拓展,打造最权威的参考。数据库

++++这里咱们碰到了一个问题,那就是从什么地方入手比较合适,做为这个问题,一般立钻哥哥就顺其天然了,因此,咱们这边就没有特别的顺序和章节归类。编程

++++Unity知识点0001http://www.noobyard.com/article/p-bqmetnys-ep.html设计模式

++++Unity知识点0008http://www.noobyard.com/article/p-etezylqh-gu.html数组

 

 

##Unity知识点目录:安全

#知识点0001:什么是协同程序?网络

#知识点0002:ArrayList和List的区别?app

#知识点0003:MeshRender中material和sharedmaterial的区别?框架

#知识点0004:对象池(Object Pool)技术。异步

#知识点0005:链条关节(Hinge Joint)

#知识点0006:PlayerPrefs

#知识点0007:Unity3d脚本生命周期

#知识点0008:LOD技术

#知识点0009:Mipmap技术

#知识点0010:ref引用参数和out输出参数和params数组参数

#知识点0011:delegate委托

#知识点0012:event事件

 

 

 

 

#知识点0008:LOD技术

#知识点0008:LOD技术

++++LOD(Level of detail):多层次细节,是最经常使用的游戏优化技术。LOD按照模型的位置和重要程度决定物体渲染的资源分配,下降非重要物体的面数和细节度,从而得到高效率的渲染运算。(缺点是增长了内存。)

++++立钻哥哥:LOD(多层次细节)是内存优化的方式之一。(使用LOD,好处就是对那些离得远,看不清的物体的细节能够忽略。)

 

++LOD是什么,优缺点是什么?

++++LODLevel of detail简称,意为多层次细节,是最经常使用的游戏优化技术。

++++LOD技术指根据物体模型的节点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,下降非重要物体的面数和细节度,从而得到高效率的渲染运算。

++++LOD优势:可根据距离动态的选择渲染不一样细节的模型。

++++LOD缺点:增长美工工做量,增大了游戏的容量(要准备不一样细节的同一模型)。

 

++LOD百科

++++LOD技术即Level of Detail的简称,意为多细节层次。(LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,下降非重要物体的面数和细节度,从而得到高效率的渲染运算。)

 

++LOD在游戏里面的运用

++++立钻哥哥:LOD(Level of Detail)

++++LOD模型制做:三个面数不一样的造型:高模、通常、低模。

--高模油桶:三角面Tris:712,顶点数Verts:358;

--低模油桶:三角面Tris:28,顶点数Verts:16;

++++立钻哥哥:在制做LOD以前,将不一样面数的模型放在同一个位置,不然会发生模型位置错乱的状况。

=>1.【空GameObject】

=>2.【添加LOD属性】

=>3.【Component=>Rendering=>LODGroup】

=>4.【在LODGroup的设置LOD的层级(LOD:0:100%、LOD:1:60%、LOD:2:30%、Culled:10%)】

=>5.【Add添加LOD所对应的模型】

=>6.【测试LOD效果:LOD0高模、LOD1通常、LOD3低模、Culled消失】

++++LOD(多层次细节Level of Detail)是根据物体在游戏画面中所占视图的百分比来调用不一样复杂度的模型的。(就是当一个物体距离摄像机比较远的时候使用低模,当物体距离摄像机比较近的时候使用高模。)(这是一种优化游戏渲染效率的使用方法,缺点是占用大量内存。)(使用这种技术,通常是在解决运行时流畅度的问题,采用的是空间换时间的方式。)

++++立钻哥哥:建立LOD模型的步骤:

--步骤1:准备3组模型:高精度模型,中精度模型,低精度模型

--步骤2:定义一个空对象,添加LODGroup组件

--步骤3:分别将3种不一样精度的模型,拖拽到空对象的LODGroup组件的各个级别上

--步骤4:在LOD组件添加模型的过程当中:【Yes, Reparent】:把添加的模型做为LODGroup组件所属对象的子物体

--步骤5:对齐三个子物体,测试LOD效果

 

 

 

 

#知识点0009:Mipmap多级纹理技术

#知识点0009:Mipmap多级纹理技术

#知识点0009:Mipmap多级纹理技术

++++立钻哥哥:Mipmap多级纹理技术有点相似于LOD技术,可是不一样的是,LOD针对的是模型资源,而Mipmap多级纹理针对的纹理贴图资源使用Mipmap多级纹理后,贴图会根据摄像机距离的远近,选择使用不一样精度的贴图。(缺点:会占用内存,由于Mipmap多级纹理会根据摄像机远近不一样而生成对应的8张贴图,因此必然占内存。)(优势:会优化显存带宽,用来减小渲染,由于能够根据实际状况,会选择适合的贴图来渲染,距离摄像机越远,显示的贴图像素越低,反之,像素越高。)

++++使用MipMap多级纹理后图片大小会变大,这是由于使用MipMap多级纹理技术后,会对这个贴图生成八张精度质量不一样的贴图,因此内存占用变大了。(因此关于这个技术是否使用,根据项目而定,什么都是有利有弊的。)

++++MipMapping:在三维计算机图形的贴图渲染中经常使用的技术,为加快渲染进度和减小图像锯齿,贴图被处理成由一系列被预先计算和优化的图片组成的文件,这样的贴图被称为MipMap多级纹理。(MipMap多级纹理是目前应用最为普遍的纹理映射技术之一。)

++++OpenGL实现Mipmap多级纹理的功能:void glTexImage2D(GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels); :定义一个二维纹理映射。(纹理映射时一个至关复杂的过程,OpenGL最基本的执行纹理映射所需的步骤是:

--一、定义纹理glTexImage2D(); 

--二、控制滤波glTexParameterf();

--三、说明映射方式glTexEnvf();

--四、绘制场景,给出顶点的纹理坐标和几何坐标glEnable(GL_TEXTURE_2D)glTexCoord2f()。 纹理映射只能在 RGBA方式下执行,不能运用于颜色表方式。)

++++MipMap多级纹理GPU优化方案:当屏幕变小时,自动选择合适尺寸的图片进行渲染。(但会多使用33%的内存。)

 

 

 

 

#知识点0010:ref参数和out参数

#知识点0010:ref参数和out参数

#知识点0010:ref引用参数和out输出参数和params数组参数

++++立钻哥哥:ref引用参数out参数的效果同样,都是经过关键字找到定义在主函数里面的变量的内存地址,并经过方法体内的语法改变它的大小。(ref引用参数必须初始化,out参数必须在函数里赋值。)(ref引用参数是引用;out参数是输出参数。)

++++【ref引用参数】:值类型参数想要达到引用类型参数的效果,须要用到引用参数。

--ref引用参数以ref修饰符声明;(public void Swap(ref int x, ref int y){ }

--public void Swap(ref int x, ref int y){  int temp = x;  x = y;  y = temp;  }

--int score_1 = 100;  int score_2 = 80;

--myMath.Swap(score_1, score_2);

--ref修饰的变量在传递参数前必定要有初始值

++++【out输出参数】:若是想要一个方法返回多个值,能够用输出参数来处理。

--输出参数由out关键字标识;(public void Cal(int a, int b, out int x, out int y){}

--public void Cal(int a, int b, out int x, out int y){  x = a - b;  y = a + b;  }

--int numOne = 22;  int numTwo = 8;  int resultOne;  int resultTwo;

--myMath.Cal(numOne, numTwo, out resultOne, out resultTwo);

++++【params数组参数】:若是形参表中包含了数组型参数,那么它必须在参数表中位于最后,并且必须是一维数组类型。

--数组参数params不能跟refout一块儿搭配使用;

--数组参数长度可变(长度能够为0);

    --数组参数只能使用一次,并且要放到最后。

--public void Sum(){params int[] arr}{ int result = 0; foreach(int x in arr){ reslut += x; }}

--myMath.Sum(1, 2, 3, 4, 5);

++++协程中IEnumerator类型的方法不能带ref引用或者out输出型的参数,但能够带被传递的引用。

++++Physics类中Raycast()实现射线检测:bool Raycast(Ray ray, out RaycastHit hitInfo);

++++string类中格式化字符串:public static string Format(string format, params object[] args);

++++string类中分割字符串:public string[] Split(params char[] separator);

 

++C#方法中参数ref和out解析

++++立钻哥哥:ref是有进有出,out是只出不进;(ref是传递参数的地址,out是返回值)

++++C#中有4种参数类型:值类型、引用参数、输出参数、数组参数;

++++【值类型】:不附加任何修饰符;使用值参数,经过复制实参的值到形参的方式把数据传递到方法;

++++【ref引用参数】:以ref修饰符声明;使用引用参数时,必须在方法的声明和调用中都使用ref修饰符;实参必须是变量,在用做实参前必须被赋值,若是是引用类型变量,能够赋值为一个引用或者null值;

++++【out输出参数】:以out修饰符声明,可返回一个或多个值给调用者;必须在声明和调用中都使用修饰符。输出参数的修饰符是out不是ref。和引用参数类似,实参必须是变量,而不能是其余类型的表达式(由于方法须要内存位置保存返回值)。

++++【params数组参数】:以params修饰符声明;在一个参数列表中只能有一个参数数组;若是有,它必须是列表中的最后一个;

++++C#中方法参数refout区别:

--一、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化;(ref传进去的参数必须在调用前初始化,out没必要)(ref传进去的参数在函数内部能够直接使用,而out不能够)(ref传进去的参数在函数内部能够不被修改,但out必须在离开函数体前进行赋值)

--二、使用refout时,在方法的参数和执行方法时,都要加refout关键字,以知足匹配;

--三、out适合用在须要return多个返回值的地方,而ref则用在须要被调用的方法修改调用者的引用的时候;

--四、系统对ref的限制时更少一些的。(out虽然不要求在调用前必定要初始化,可是其值在函数内部是不可见的,也就是不能使用经过out传进来的值,而且必定要在函数内赋一个值。或者说函数承担初始化这个变量的责任)

--五、关于重载:有out/ref关键字的方法能够与无outref关键字的方法构成重载;可是想在outref间重载,编译器将提示:不能定义仅在refout的方法上重载;

--六、方法调用前初始值:ref做为参数的函数在调用前,实参必须赋初始值,不然编译器将提示:使用了未赋值的局部变量;(out做为参数的函数在调用前,实参能够不赋初始值)

--七、在函数内,引入的参数初始值问题:在被调用函数内,out引入的参数在返回前至少赋值一次,不然编译器将提示:使用了未赋值的out参数;(在被调用函数内,ref引入的参数在返回前没必要为其赋值)

++++【ref的使用】:使用ref进行参数的传递时,该参数在建立时,必须设置其初始值,且ref侧重于修改;

++++【out的使用】:采用out参数传递时,该参数在建立时,能够不设置初始值,可是在方法中必须初始化,out侧重于输出;(当但愿方法返回多个值时,能够用out,而且一个方法中的参数能够有一个或多个out参数;使用out参数,必须将参数做为out参数显式传递到方法中)

++++补充1:ref的实参必须初始化;out的实参可初始化也可不初始化,反正进去后都会清除;

++++补充2:C#中的refout提供了值类型按引用进行传递的解决方案,固然引用类型也能够用refout修饰,但这样已经失去了意义。(引用数据类型原本就是传递的引用自己而非值的拷贝。)

++++补充3:refout关键字将告诉编译器:如今传递的是参数的地址而不是参数自己,这和引用类型默认的传递方式是同样的。(编译器不容许out和ref之间构成重载:充分说明outref的区别仅是编译器角度的,它们生成的IL代码是同样的)

++++补充4:值类型在托管堆中不会分配内存,为何能够按地址进行传递呢?:值类型也有它本身的地址,即指针:用refout修饰后,传递的就是这个指针,因此能够实现修改后a,b的值真正的交换:这就是refout给咱们带来的好处。

++++补充5(很是重要):使用ref参数,则方法定义和调用方法都必须显式使用ref关键字。(使用out参数,方法定义和调用方法都必须显式使用out关键字

 

 

 

 

#知识点0011:delegate委托

#知识点0011:delegate委托

#知识点0011:delegate委托

++++参考推荐“框架知识点”:http://www.noobyard.com/article/p-pjzrrjmm-u.html

++++立钻哥哥:delegate委托相似于一种安全的指针引用,在使用它时是当作类来看待而不是一个方法,至关于对一组方法的列表的引用。(用处:使用委托让程序员能够将方法引用封装在委托对象内。而后能够将该委托对象传递给可调用该引用方法的代码,而没必要在编译时知道将调用哪一个方法。)(与C++中的函数指针不一样,委托是面向对象的,并且是类型安全的)

++++delegate(委托)是表示将方法做为参数传递给其余方法。(委托相似于函数指针,但与函数指针不一样的是,委托是面向对象的,类型安全的和保险的。)

++++委托在编译的时候会编译成类,在任何能够声明类的地方均可以声明委托。

++++委托是一个类,它定义了方法的类型,使得能够将方法当作另外一个方法的参数来进行传递,这种将方法动态地赋给参数的作法,能够避免在程序中大量使用if_else(switch)等语句,同时使得程序具备更好地可扩展性。

++++委托绑定方法时须要注意(多播委托),注意:第一次用“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。(若是第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。)

++++拓展1:C#中的event事件:其实是一种具备特殊签名的delegate委托。(委托是对函数的封装,能够看成给方法的特征指定一个名称;事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。)

++++拓展2:一个委托能够搭载多个方法,全部方法被一次唤起;委托可使得委托对象所搭载的方法并不须要属于同一个类。(委托对象所搭载的全部方法必须具备相同的原型和形式,也就是拥有相同的参数列表和返回值类型。)

 

++C#中delegate委托

++++立钻哥哥:delegate是C#中的一种类型,它其实是一个可以持有对某个方法的引用的类;与其它的类不一样,delegate类可以拥有一个签名(signature),而且它“只能持有与它的签名匹配的方法的引用”。(它所实现的功能与C++中的函数指针十分类似。)

++++delegate委托C++函数指针的区别:

--函数指针只能指向静态函数;而delegate既能够引用静态函数,也能够引用非静态成员函数。(在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,还保存了调用此函数的类实例的引用)

--delegate是面向对象、类型安全、可靠的受控(managed)对象。(runtime可以保住delegate指向一个有效的方法,无须担忧delegate会指向无效地址或者越界地址)

 

++利用委托功能实现参考:

++++实现一个delegate是很简单的,分3个步骤实现:

    --第一步:声明一个delegate对象,它应当与想要传递的方法具备相同的参数和返回值类型;

--第二步:建立delegate对象,将想要传递的函数做为参数传入;

--第三步:在要实现异步调用的地方,经过上一步建立的对象来调用方法。

//立钻哥哥:委托应用参考

 

//A、内含委托的类

class HelloWorld{

    public delegate void GreetingDelegate(string name);  //第一步

 

    public static void EnglishGreeting(string name){

        Console.WriteLine(立钻哥哥:hello,  + name);

    }

 

    //第一步:想要传递的方法具备与delegate相同的参数和返回值类型

    public static void ChineseGreeting(string name){

        Console.WriteLine(立钻哥哥:你好,  + name);

    }

 

    public void GreetingPeople(string name, GreetingDelegate method){

        method(name);

    }

}    //立钻哥哥:class HelloWorld{}

 

//B、测试运行

class Program{

    static void Main(string[] args){

        HelloWorld hw = new HelloWorld();

        hw.GreetingPeople(立钻哥哥, HelloWorld.ChineseGreeting);

 

        Debug.Log(立钻哥哥:委托应用演示完毕~~);

    }

}    //立钻哥哥:class Program{}

 

//C、委托同string都是类型,能够利用委托声明相似name这样的委托变量。

class Program{

    static void Main(string[] args){

        HelloWorld hw = new HelloWorld();

        HelloWorld.GreetingDelegate delegate1, delegate2;

        delegate1 = HelloWorld.EnglishGreeting;

        delegate2 = HelloWorld.ChineseGreeting;

        hw.GreetingPeople(立钻哥哥, delegate1);

        hw.GreetingPeople(Yanlz, delegate2);

 

        Debug.Log(立钻哥哥:委托声明为变量-演示完毕~~);

    }

}    //立钻哥哥:class Program{}

 

//D、委托不一样于string类型的一个特性:能够将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,但调用这个委托的时候,将依次调用其所绑定的方法。

HelloWorld.GreetingDelegate delegate1;

delegate1 = HelloWorld.EnglishGreeting;

delegate1 += HelloWorld.ChineseGreeting;

hw.GreetingPeople(立钻哥哥, delegate1);

 

//E、能够绕过调用GreetingPeople(),经过委托来直接调用EnglishGreeting和ChineseGreeting

HelloWorld.GreetingDelegate delegate1;

delegate1 = HelloWorld.EnglishGreeting;

delegate1(立钻哥哥);

 

//F、委托属于类,能够利用这一特性直接new出委托实例

//第二步:建立delegate对象(实例)

HelloWorld.GreetingDelegate delegate1 = new HelloWorld.GreetingDelegate(HelloWorld.ChineseGreeting);

delegate1 += HelloWorld.EnglishGreeting;

delegate1(立钻哥哥);    //第三步:调用delegate

 

//H、委托能够绑定一个方法,也能够取消方法的绑定:利用-=。

HelloWorld.GreetingDelegate delegate1 = new HelloWorld.GreetingDelegate(HelloWorld.ChineseGreeting);

delegate1 += HelloWorld.EnglishGreeting;

delegate1(立钻哥哥);

delegate1 -= HelloWorld.ChineseGreeting;

delegate1(立钻哥哥);

 

 

++委托实现一个按钮的点击事件

//立钻哥哥:利用委托实现一个按钮的点击事件

public delegate void ClickDelegate();

 

class Button{

    public static void ClickFinished(){

        Console.WriteLine(立钻哥哥:按钮被点击了~~);

    }

}    //立钻哥哥:class Button{}

 

ClickDelegate dele1;

dele1 = Button.ClickFinished;

dele1();

 

//利用匿名函数实现

ClickDelegate myClick = delegate(){

    Console.WriteLine(立钻哥哥:按钮被点击了~~匿名函数222~~);

};

myClick();

 

//立钻哥哥:匿名方法的出如今初始化时内敛声明的方法,使得委托的语法更加简洁

 

 

++C#中内置了三种委托方式

++++一、Func委托;(有参有返回值)

    --delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);

++++二、Action委托;(有参无返回值)

    --delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);

++++三、Predicate委托;

++++说明1:Func委托和Action委托惟一的区别就是在于代理的方法(函数)有没有返回值。(有返回值选择Func委托;没有返回值选择Action委托

 

++项目应用中委托定义参考

//立钻哥哥:全局委托定义参考

public delegate void StateChangeEvent(Object sender, EnumObjectState newState, EnumobjectState oldState);

public delegate void MessageEvent(Message message);

public delegate void OnTouchEventHandle(GameObject _sender, object _args, params object[] _params);

public delegate void PropertyChangedHandle(BaseActor actor, int id, object oldValue, object newValue);

 

 

 

 

 

 

 

#知识点0012:event事件

#知识点0012:event事件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

++立钻哥哥推荐的拓展学习连接(Link_Url)

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++++Unity知识点0001http://www.noobyard.com/article/p-bqmetnys-ep.html

++++Unity知识点0008http://www.noobyard.com/article/p-etezylqh-gu.html

++++Unity引擎基础http://www.noobyard.com/article/p-ggcuedyq-ka.html

++++Unity面向组件开发http://www.noobyard.com/article/p-eiunlkzw-dt.html

++++Unity物理系统http://www.noobyard.com/article/p-mcqnwufb-kd.html

++++Unity2D平台开发http://www.noobyard.com/article/p-brjbvtac-hs.html

++++UGUI基础http://www.noobyard.com/article/p-nvzrvath-mc.html

++++UGUI进阶http://www.noobyard.com/article/p-tpspjolu-gt.html

++++UGUI综合http://www.noobyard.com/article/p-nfgrebqx-gg.html

++++Unity动画系统基础http://www.noobyard.com/article/p-otjpnbzz-dq.html

++++Unity动画系统进阶http://www.noobyard.com/article/p-hxghrtgb-bp.html

++++Navigation导航系统http://www.noobyard.com/article/p-skpvrobt-t.html

++++Unity特效渲染http://www.noobyard.com/article/p-sudpqrhk-bp.html

++++Unity数据存储http://www.noobyard.com/article/p-ybvcceul-m.html

++++Unity中Sqlite数据库http://www.noobyard.com/article/p-vxpuqxev-ca.html

++++WWW类和协程http://www.noobyard.com/article/p-alggjlwu-cy.html

++++Unity网络http://www.noobyard.com/article/p-bjvfgzwg-dw.html

++++C#事件http://www.noobyard.com/article/p-dietpjzv-gm.html

++++C#委托http://www.noobyard.com/article/p-oiohmxtc-gh.html

++++C#集合http://www.noobyard.com/article/p-vdfpislb-ex.html

++++C#泛型http://www.noobyard.com/article/p-vujvnprk-ee.html

++++C#接口http://www.noobyard.com/article/p-emexlwmu-dm.html

++++C#静态类https://blog.csdn.net/vrunsoftyanlz/article/details/78630979

++++C#中System.String类http://www.noobyard.com/article/p-uchiaxzw-cq.html

++++C#数据类型http://www.noobyard.com/article/p-kqtbvoyq-ba.html

++++Unity3D默认的快捷键http://www.noobyard.com/article/p-gbllyjbs-s.html

++++游戏相关缩写http://www.noobyard.com/article/p-pzpxsztf-gm.html

++++设计模式简单整理http://www.noobyard.com/article/p-scmbzocc-hg.html

++++U3D小项目参考https://blog.csdn.net/vrunsoftyanlz/article/details/80141811

++++UML类图http://www.noobyard.com/article/p-aakurcwi-bm.html

++++U3D_Shader编程(第一篇:快速入门篇)http://www.noobyard.com/article/p-ptwlpwbc-gz.html

++++U3D_Shader编程(第二篇:基础夯实篇)http://www.noobyard.com/article/p-dadqpvvp-hv.html

++++框架知识点http://www.noobyard.com/article/p-pjzrrjmm-u.html

++++游戏框架(UI框架夯实篇)http://www.noobyard.com/article/p-nnroewdy-cu.html

++++游戏框架(初探篇)http://www.noobyard.com/article/p-klkilyrt-hy.html

++++Lua快速入门篇(基础概述)http://www.noobyard.com/article/p-pyzbbriu-u.html

++++Lua快速入门篇(XLua教程):http://www.noobyard.com/article/p-plflyruo-ho.html

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

 

--_--VRunSoft:lovezuanzuan--_--