zoukankan      html  css  js  c++  java
  • unity之初级工程师

    一.值类型与引用类型

    值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。值类型的实例通常是在线程栈上分配的(静态分配)

    引用类型声明时并没有为其分配堆上的内存空间。引用类型的对象总是在进程堆中分配(动态分配)。

    值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct

    引用类型:string 和 class

    二.继承,封装,多态

    继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。

    封装:一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。

    多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

    三.代码风格

    重构:就是在不改变软件系统外部行为的前提下,改善它的内部结构。

    在实际写代码时,组合方式一般会这样写:
    A类的构造方法里创建B类的对象,也就是说,当A类的一个对象产生时,B类的对象随之产生,当A类的这个对象消亡时,它所包含的B类的对象也随之消亡

    聚合方式则是这样:
    A类的对象在创建时不会立即创建B类的对象,而是等待一个外界的对象传给它
    传给它的这个对象不是A类创建的。

    四.设计模式

    六大原则:

    1、开闭原则(Open Close Principle)

    开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

    2、里氏代换原则(Liskov Substitution Principle)

    里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

    3、依赖倒转原则(Dependence Inversion Principle)

    这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

    4、接口隔离原则(Interface Segregation Principle)

    这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合

    5、迪米特法则,又称最少知道原则(Demeter Principle)

    最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

    6、合成复用原则(Composite Reuse Principle)

    合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

    单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    实例链接:http://www.cnblogs.com/shirln/p/8464617.html

    观察者模式:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)

    参考:https://www.cnblogs.com/promise-7/archive/2012/05/14/2500759.html

    推荐两本学习C#的书:C# Gang-of-Four Patterns

              Head First设计模式

    1.数据结构

    https://www.cnblogs.com/shirln/

    2.基础算法

    待续

    一。脚本开发

    Unity脚本生命周期:

    Unity中脚本按照一定的生命周期执行

    1.Awake

    最早执行,在GameObejct对象的数据和状态的初始化后执行,只会触发一次。

    tips:GameObject实例化到场景中后在激活的状态下才会初始化,如果GameObject从来未激活,它的脚本上的Awake永远不会被调用。

    即时触发,GameObject第一次active的时候调用。

    2.Start

    在脚本第一次调用Update之前调用,只会触发一次。

    3.OnEnable

    在脚本状态由disabled变为enabled状态是触发一次,Unity内部可能将脚本初始置为diabled,所以如果我们实例化一个激活的GameObject,并且在挂上一个enabled了的脚本后把它加入场景会调用一次OnEnable,并且早于Start。

    4.OnDisable

    在脚本由enabled状态变为disabled状态的时候会调用。

    tips:OnEnable和OnDisable事件的触发是即时的,并且这两个事件是综合考虑GameObject的active状态和脚本的enabled状态的。所以不要在OnEnable里面把脚本设置为disabled同时在OnDisable中把脚本设置为enabled,会导致死循环!!!

    5.Update

    在每一帧调用,用于实现各种行为逻辑

    6.LateUpdate

    在每一帧调用,但是是在Update之后触发。常用的一种情况是相机跟随移动角色:角色移动逻辑在Update里面实现,相机跟随逻辑在LateUpdate里面实现。

    7.OnDestroy

    在组件被销毁时调用,只有GameObject被激活过才会触发。

    8.协程(Coroutine)和线程(Threads)是两个完全不同的概念。 线程是完全异步的,在多核CPU上可以做到真正的并行。Coroutines都在MainThread中执行,且每个时刻只有一个Coroutine在执行。

    9。推荐使用Destroy代替DestroyImmediate

    原因是DestroyImmediate是立即销毁,立即释放资源,做这个操作的时候,会消耗很多时间的,影响主线程运行
    Destroy是异步销毁,一般在下一帧就销毁了,不会影响主线程的运行。

    二。2D

    图集

    UGUI的Atlas和NGUI的Atlas的区别:NGUI是必须先打出图集然后才能开始做界面。而UGUI做界面的时候只用小图,而在最终打包的时候unity才会把小图合并在一张大的图集里面。

    五。Unity3D支持的图形文件格式有 PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT。

    一般来说3D游戏我们压缩贴图的时候会把贴图分为UI贴图和场景模型贴图来考虑,主要是因为有多重采样的缘故。3D游戏一般来说都是受摄像机远近大小改变而采取不同的采样大小,假设不设置多重纹理采样的话,在远处会有非常多的白色噪点。

    2D游戏的话,所有都不需要勾选多重采样,具有3D性质的贴图,我们都需要勾选上GENERATE MIP MAPS,这样会使贴图大小增加25%这样。

     三。物理

    四。插件使用

     

    经典面试题1

    经典面试题2

    经典面试题3

    经典面试题4

  • 相关阅读:
    多重背包POJ1276不要求恰好装满 poj1014多重背包恰好装满
    哈理工1053完全背包
    求最小公倍数与最大公约数的函数
    Bus Pass ZOJ 2913 BFS 最大中取最小的
    POJ 3624 charm bracelet 01背包 不要求装满
    HavelHakimi定理(判断一个序列是否可图)
    z0j1008Gnome Tetravex
    ZOJ 1136 Multiple BFS 取模 POJ 1465
    01背包 擎天柱 恰好装满 zjut(浙江工业大学OJ) 1355
    zoj 2412 水田灌溉,求连通分支个数
  • 原文地址:https://www.cnblogs.com/shirln/p/8743583.html
Copyright © 2011-2022 走看看