unity3d自带的四个函数_unity 自带函数执行顺序 - CSDN
  • Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行。其执行顺序如下: 编辑器(Editor) Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对象上,并且在Reset命令被使用时也...

    在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行。其执行顺序如下:

    编辑器(Editor)

    • Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对象上,并且在Reset命令被使用时也会调用。
      编者注:Reset是在用户点击Inspector面板上Reset按钮或者首次添加该组件时被调用。Reset最常用于在见识面板中给定一个默认值。

    第一次场景加载(First Scene Load)
    这些函数会在一个场景开始(场景中每个物体只调用一次)时被调用。

    • Awake:这个函数总是在任何Start()函数之前一个预设被实例化之后被调用,如果一个GameObject是非激活的(inactive),在启动期间Awake函数是不会被调用的直到它是活动的(active)。
    • OnEnable:只有在对象是激活(active)状态下才会被调用,这个函数只有在object被启用(enable)后才会调用。这会发生在一个MonoBehaviour实例被创建,例如当一个关卡被加载或者一个带有脚本组件的GameObject被实例化。

    注意:当一个场景被添加到场景中,所有脚本上的Awake()和OnEable()函数将会被调用在Start()、Update()等它们中任何函数被调用之前。自然的,当一个物体在游戏过程中被实例化时这不能被强制执行。

    第一帧更新之前(Before the first frame update)

    • Start:只要脚本实例被启用了Start()函数将会在Update()函数第一帧之前被调用。

    对于那些被添加到场景中的物体,所有脚本上的Start()函数将会在它们中任何的Update()函数之前被调用,自然的,当一个物体在游戏过程中被实例化时这不能被强制执行。

    在帧之间(In between frames)

    • OnApplicationPause:这个函数将会被调用在暂停被检测有效的在正常的帧更新之间的一帧的结束时。在OnApplicationPause被调用后将会有额外的一帧用来允许游戏显示显示图像表示在暂停状态下。

    更新顺序(Update Order)

    当你在跟踪游戏逻辑和状态,动画,相机位置等的时候,有几个不同的事件函数你可以使用。常见的模式是在Update()函数中执行大多数任务,但是也有其它的函数你可以使用。

    • FixedUpdate:FixedUpdate函数经常会比Update函数更频繁的被调用。它一帧会被调用多次,如果帧率低它可能不会在帧之间被调用,就算帧率是高的。所有的图形计算和更新在FixedUpdate之后会立即执行。当在FixedUpdate里执行移动计算,你并不需要Time.deltaTime乘以你的值,这是因为FixedUpdate是按真实时间,独立于帧率被调用的。
    • Update:Update每一帧都会被调用,对于帧更新它是主要的负荷函数。
    • LateUpdate:LateUpdate会在Update结束之后每一帧被调用,任何计算在Update里执行结束当LateUpdate开始时。LateUpdate常用为第三人称视角相机跟随。

    渲染(Rendering)

    • OnPreCull:在相机剔除场景前被调用。剔除是取决于哪些物体对于摄像机是可见的,OnPreCull仅在剔除起作用之前被调用。
    • OnBecameVisible/OnBecameInvisible:当一个物体对任意摄像机变得可见/不可见时被调用。
    • OnPreRender:在摄像机开始渲染场景之前调用。
    • OnRenderObject:在指定场景渲染完成之后调用,你可以使用GL类或者Graphics.DrawMeshNow 来绘制自定义几何体在这里。
    • OnPostRender:在摄像机完成场景渲染之后调用。
    • OnRenderImage(Pro Only):在场景徐然完成之后允许屏幕图像后期处理调用。
    • OnGUI:为了响应GUI事件,每帧会被调用多次(一般最低两次)。布局Layout和Repaint事件会首先处理,接下来处理的是是通过
      Layout和键盘/鼠标事件对应的每个输入事件。
    • OnDrawGizmos:用于可视化的绘制一些小玩意在场景视图中。

    协同程序(Coroutines)

    正常的协同程序更新是在Update函数返回之后运行。一个协同程序是可以暂停执行(yield)直到给出的依从指令(YieldInstruction )完成,写成的不同运用:

    • yield:在所有的Update函数都已经被调用的下一帧该协程将持续执行。
    • yield WaitForSeconds:一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后。
    • yield WaitForFixedUpdate:所有脚本上的FixedUpdate函数已经执行调用之后持续。
    • yield WWW:在WWW下载完成之后持续。
    • yield StartCoroutine:协同程序链,将会等到MuFunc函数协程执行完成首先。

    销毁(When the Object is Destroyed)

    • OnDestory:这个函数在会在一个对象销毁前一帧调用,会在所有帧更新一个对象存在的最后一帧之后执行,对象也许会响应Object.Destroy 或一个场景关闭时被销毁。

    退出游戏(When Quitting)
    这些函数会在你场景中所有的激活的物体上调用:

    • OnApplicationQuit:这个函数在应用退出之前的所有游戏物体上调用,在编辑器(Editor)模式中会在用户停止PlayMode时调用,在网页播放器(web player)中会在网页视图关闭时调用。
    • OnDisable:当行为变为非启用(disable)或非激活(inactive)时调用。

    脚本的生命周期流程图




    展开全文
  • unity的脚本中,有大量的脚本执行按照预先确定的顺序执行的事件函数,由于篇幅有限,无法一一列举,这里只列举一些常用的自带函数的顺序,并论述他们之间的区别。 在Unity脚本中常用到的函数就是下面这些,他们的...

    转载于Unity开发者俱乐部
    在unity的脚本中,有大量的脚本执行按照预先确定的顺序执行的事件函数,由于篇幅有限,无法一一列举,这里只列举一些常用的自带函数的顺序,并论述他们之间的区别。
    在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的。
    Awake ->OnEable-> Start -> FixedUpdate-> Update -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy
    秉着实践是检验真理的唯一标准,咱们可以写脚本挂在一个物体运行,从打印结果中便可以看到执行顺序

    在这里插入图片描述

    接下来针对每个方法进行详细的说明

    1.Awake

     用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息Awake总是在Start之前被调用。它不能用来执行协同程序。
    

    2.Start

    仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。在所有脚本实例中,Start函数总是在Awake函数之后调用。
    

    3.FixedUpdate

    固定帧更新,在Unity导航菜单栏中,点击“Edit”–>“Project Setting”–>“Time”菜单项后,右侧的Inspector视图将弹出时间管理器,其中“Fixed Timestep”选项用于设置FixedUpdate()的更新频率,更新频率默认为0.02s。

    4.Update

    正常帧更新,用于更新逻辑。每一帧都执行,处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
    
    
    
     Update()与FixedUpdate()的区别
    
     从字面上理解,它们都是在更新时会被调用,并且会循环的调用。但是Update会在每次渲 染新的一帧时,被调用。而FixedUpdate会在每个固定的时间间隔被调用,那么要是Update 和FixedUpdate的时间间隔一样,是不是就一样呢?答案是不一定,因为Update受当前渲染的物体,更确切的说是三角形的数量影响,有时快有时 慢,帧率会变化,update被调用的时间间隔就发生变化。但是FixedUpdate则不受帧率的变化,它是以固定的时间间隔来被调用,那么这个时间间 隔怎么设置呢?Edit->Project Setting->time下面的Fixed timestep。
    

    5.LateUpdate

     在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行,这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。LateUpdate,在每帧Update执行完毕调用,他是在所有update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
    
    Update和LateUpdate的区别
    
    在圣典里LateUpdate被解释成一句话,LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
    
        LateUpdate是晚于所有Update执行的。例如:游戏中有2个脚本,脚本1含有Update和LateUpdate,脚本2含有Update,那么当游戏执行时,每一帧都是把2个脚本中的Update执行完后才执行LateUpdate 。虽然是在同一帧中执行的,但是Update会先执行,LateUpdate会晚执行。
    
        现在假设有2个不同的脚本同时在Update中控制一个物体,那么当其中一个脚本改变物体方位、旋转或者其他参数时,另一个脚步也在改变这些东西,那么这个物体的方位、旋转就会出现一定的反复。如果还有个物体在Update中跟随这个物体移动、旋转的话,那跟随的物体就会出现抖动。 如果是在LateUpdate中跟随的话就会只跟随所有Update执行完后的最后位置、旋转,这样就防止了抖动。
    

    6.OnGUI

    在渲染和处理GUI事件时调用。比如:你画一个button或label时常常用到它。这意味着OnGUI也是每帧执行一次。

    7.Reset

    在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个默认值。

    8.OnDisable

    当物体被销毁时 OnDisable将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。注意: OnDisable不能用于协同程序。

    9.OnDestroy

    当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。注意:OnDestroy也不能用于协同程序。

    展开全文
  • 2.Off Mesh Link:实现区域转移功能(例如,有时不一定只是在地面上进行寻路,可能有些高高的平台,平台与地面是不相连的,使用该组件可以跳到平台上)(需要两对象,一开始一结束,表示连接两地的对象) ...

    1.Nav Mesh Agent:主要挂在寻路物体上

    2.Off Mesh Link:实现区域转移功能(例如,有时不一定只是在地面上进行寻路,可能有些高高的平台,平台与地面是不相连的,使用该组件可以跳到平台上)(需要两个对象,一个开始一个结束,表示连接两个地的对象)

    3.Nav Mesh Obstacle:主要挂在障碍物上

    4、Window/Navigation,弹出Navigation视图,点击右下角的Bake按钮生成导航网格

    5、

    如果希望上升过程丰富一些,比如播放一个爬梯或者飞行的动作,那么完全可以通过脚本来自行控制。

    首先需要放弃勾选行进物体Nav Mesh Agent组件下的Auto Traverse Off Mesh Link选项,然后编写相应脚本来实现移动过程。在脚本中通过访问NavMeshAgent.isOnOffMeshLink成员来判断是否到达起点或终点,如果到达则访问NavMeshAgent.currentOffMeshLinkData成员来取得起点和终点的信息,最后实现自己的移动过程。完成移动后需要调用NavMeshAgent.CompleteOffMeshLink()来结束手动过渡过程

    6、在Navigation视图下的Layers标签页可以设置层,Object标签页可以为物体指定层,Nav Mesh Agent组件的NavMesh Walkable可以指定可行走的层

    7、

    4.动态更改可行进层

    关于walkableMask:

    Built-in Layer 0 对应的 walkableMask 为1

    Built-in Layer 1 对应的 walkableMask 为2


    这几个属性我简单的解释一下:
    Radius:导航代理的半径,我们可以适当的调节一下这个值

    Speed :这个属性代表这个导航网格代理寻路时可以达到的最大速率

    Acceleration :加速度,表示代理的速度从0加速到Speed时的最大的加速度

    Angular Speed :最高的角速度

    Stopping distance : 制动距离,当代理据目的地的距离小于这个值时开始减速

    Auto Traverse OffMesh Link :自动移动并关闭OffMeshLinks,这个选项对于我们利用程序来操纵后面我要介绍的OffMeshLink很关键,

    Auto Repath   自动重新寻路,如果发现现有路径已失效,那么它将获得新的路径,这个选项我们一般将其勾选上

    Height  : 导航代理的高度。

    Base Offset : 基本偏移,我们可以通过调整这个变量来调整代理自身的包围盒

    Obstacle Avoidace Type  : 代理躲避的水平,一般我们选默认的High Quality就行了

    NavMesh Walkable :导航网格代理可以通过的网格层类型
    好了这些属性我们基本上知道了一点,但要真正理解它,我们还有很长的路要走。我们到头来是要用脚本来控制寻路的,也就是说我们必须掌握NavMeshAgent这个类,还是老办法,看文档吧,记住,文档我们必须看,这是我们学习新东西必须做的,那些出视频,出书的没一个不是从看文档开始的。


    我们看NavMeshAgent这个类,Unity菜单:help->Scripting Reference 。我们找到这个类,发现里面的变量和方法还不少呢。这次我不可能将其全部讲解到 , 因为有些我自己都没用过,所以我只讲解我们常用的:
    NavMeshAgent(导航网格代理组件所对应的类)


    假使我们的主角身上添加了一个导航网格组件,我们一般在脚本中这样定义NavMeshAgent类型的成员变量:
    private NavMeshAgent nma ;
    并在Start或Awake函数中实例化它:
    nma = gameObject.GetComponent<NavMeshAgent>();
    重要变量:
    1.destination
    我们可以这样对导航网格代理设置目的地:
    nma.destination = Vector3类型的值。相当于nma.SetDestination( Vector3类型的值 )

    2.stoppingDistance 
    这个与Inspector面板中的Stopping Distance对应,一下再不涉及与Inspector面板中的属性对应的变量

    3.velocity 
    导航网格代理周游时的实时速度,非常重要

    4.nextPosion
    顾名思义,也就是下一个位置,在Update函数中打印这个属性,你会发现打印出的结果与这个导航网格代理周游过的路径一致

    5.steeringTarget(只读)
    这个属性是相当重要的,它指的是导航网格代理在导航网格中周游时所经过的拐点,这对于制作寻路网游同步角色的Transform是相当重要的,因为导航网格的寻路路线是直线,我们只需将其寻路的拐点与旋转角度告诉给服务器端,有服务器端广播出去,然后再写一个执行Transform同步的脚本(是特制的)绑定在非角色玩家身上就可以了。

    6.desiredVelocity(只读)
    这个属性说实话我用的不多,指的是导航网格代理的期望速度,与其当前速度不是等价的。

    7.remainingDistance( 只读 )
    导航网格代理离目的地还剩的距离,如果其值为0,那么代理已经到达了目的地了,所以我们可一个这样判断一个导航网格代理是否到达了目的地:
    if( nma.remainingDistance == 0 ){
    //执行行为

    }

    8.isOnOffMeshLink
    导航网格代理当前的位置是否位于OffMeshLink,因为这个牵扯到了另一个组件,我会在后面说的

    重要方法:
    1.SetDestination( Vector3 v )
    设置目的地,与nma.destination = v一样的,你想怎么用都行,只是这个函数在设置目的地成功后返回***e,否则返回false,就只比调用属性多了一个返回值

    2.ActivateCurrentOffMeshLink( bool activated )
    返回值为空
    与OffMeshLink有关,当activated为***e激活OffMeshLink,后面会讲到的

    3.CompleteOffMeshLink ()
    让导航网格代理完成在OffMeshLink上的周游,后面会讲的

    4.Move( Vector3 v )
    让导航网格代理朝向量v的世界坐标系方向平移v的长度

    5.Stop()
    让导航网格代理停止寻路,但此寻路状态可以靠下面一个函数恢复到寻路状态,并且目的地也与上次一样

    6.Resume()
    恢复寻路状态,此时角色会在上一次执行了Stop函数停下来后恢复当时的状态,目的地为上一次的目的地

    展开全文
  • Unity3D常见面试题

    2017-08-11 20:20:00
    Unity3D常见面试题

    Unity3D常见面试题

    目录

    C#问题 4

    1.在类的构造函数前加上static会报什么错?为什么? 4

    2.C# StringBuilder类型比string类型的优势是什么? 4

    3.C# 函数Func(string a, string b)Lambda表达式怎么写? 4

    4.数列1,1,2,3,5,8,13...n位数是多少?C#递归算法实现 4

    5. 请简述值类型与引用类型的区别 4

    6. 请简述ArrayListList<>的主要区别 5

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

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

    9.下列代码在运行中会产生几个临时对象? 5

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

    11.请简述关键字Sealed用在类声明和函数声明时的作用 6

    12.请简述privatepublicprotectedinternal的区别 6

    13.反射的实现原理? 6

    14.NetMono的关系? 6

    15.请说出4种面向对象的设计原则,并分别简述它们的含义。 7

    16. Hashtable是无序的吗? 7

    Unity问题 7

    UI 7

    1.NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么? 7

    2.请简述NGUIPanelAnchor的作用 7

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

    4.使用原生GUI创建一个可以拖动的窗口命令是什么? 8

    5.使用Unity3d实现2d游戏,有几种方式? 8

    碰撞 8

    6.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法 8

    7.MeshCollider和其他Collider的一个主要不同点? 8

    8.Unity3d中的碰撞器和触发器的区别? 8

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

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

    动画 10

    11.一个简单的游戏,怪物会走动\攻击\死亡,游戏角色会走动,跳跃\攻击\格挡\死亡,还会接受玩家从输入端输入的指令,NPC会走动,他们彼此之间可以互相通信.请画出以上三种角色的UML图示. 10

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

    13.反向旋转动画的方法是什么? 10

    14.写出Animation的五个方法 11

    15.动画层(AnimationState Layers)的作用是什么? 11

    16.Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法? 11

    17.法线贴图 CG动画  11

    线程和协程 11

    18.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么? 11

    19.Unity3D的协程和C#线程之间的区别是什么? 12

    20.什么是协同程序? 12

    四元数 12

    21.四元数是什么?主要作用什么?对欧拉角的优点是什么? 12

    摄像机 12

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

    23.Unity摄像机有几种工作方式,分别是什么? 13

    预制物 13

    24.Prefab的作用?如何在移动环境的设备下恰当地使用它? 13

    unity 当需要频繁创建一个物体对象时,怎样减少内存 13

    Shader 13

    25.出光照计算中的diffuse的计算公式 13

    26.MeshRendermaterialshader的区别? 13

    27.alpha blend工作原理 14

    28.光照贴图 的优势是什么? 14

    29.Vertex Shader是什么,怎么计算? 14

    系统函数 14

    物理更新一般在哪个系统函数里? 14

    30.OnEnableAwakeStart运行时的发生顺序?哪些可能在同一个对象周期中反复的发生? 15

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

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

    33.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中? 15

    34.请简述OnBecameVisibleOnBecameInvisible的发生时机,以及这一对回调函数的意义? 15

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

    36.动态加载资源的方式?区别是什么? 16

    37.以下哪个函数在游戏进入新场景后会被马上调用? 16

    38.如何销毁一个UnityEngine.Object及其子类 16

    39.获取、增加、删除组件的命令分别是什么? 16

    40.Application.loadLevel命令是什么? 16

    41.调试记录到控制台的命令是什么? 16

    42.LayerMask.NameToLayer()这个方法有什么作用? 16

    43.localPositionPosition的使用区别? 17

    44.物体自身旋转使用的函数? 17

    45.物体围绕某点旋转使用的函数? 17

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

    47.写一个计时器工具,从整点开始计时,格式为:00:00:00 17

    物理引擎 18

    48.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法. 18

    49.实现吊机吊物体的功能 18

    50.上机题:用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可) 22

    51.MaterialPhysic Material区别? 24

    52.CharacterControllerRigidbody的区别? 24

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

    54.什么叫做链条关节? 24

    55.什么是导航网格( NavMesh)? 24

    56.Unity3d提供了几种光源类型,分别是哪几种? 25

    Unity引擎问题 25

    57.简述Unity3D支持的作为脚本的语言的名称 25

    58.向量的点乘、叉乘以及归一化的意义? 25

    59.矩阵相乘的意义及注意点? 25

    60.为什么dynamic fontunicode环境下优于static font 25

    61.Render的作用?描述MeshRenderSkinnedMeshRender的关系与不同 26

    62.简述SkinnedMesh的实现原理 26

    63.为什么Unity3D中会发生在组件上出现数据丢失的情况? 26

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

    65.Lod是什么,优缺点是什么? 26

    66.两种阴影判断的方法、工作原理。 26

    67.MipMap是什么,作用? 27

    68.用代码实现第三角色控制器 27

    69.Mecanim系统中,Body Mask的作用是? 27

    70.Unity连接数据库 27

    71.如何优化内存? 27

    72.你用过哪些插件? 27

    在哪个模块下可以修改Render Path? 28

    图形图像 28

    1.什么是渲染管道? 28

    2.什么是矢量图  29

    3.什么是矩阵?矩阵运算? 29

    4.角度和弧度的转换 29

    5.矢量标量 29

     

    C#问题

    1.在类的构造函数前加上static会报什么错?为什么?

    答:在构造函数如果有public修饰的静态构造函数时会报:“静态构造函数中不允许出现访问修饰符”,如果什么修饰符都不加的话不会报错,静态构造函数一般是起初始化作用。

    2.C# StringBuilder类型比string类型的优势是什么?

    答:StringBuilde的优势在于拼接,string的优势在于对字符串做一些处理,在使用过程中看具体的需求。

    3.C# 函数Func(string a, string b)Lambda表达式怎么写?

    答:(a,b)=>{}

    4.数列1,1,2,3,5,8,13...n位数是多少?C#递归算法实现

    答:

    5. 请简述值类型与引用类型的区别

    答:区别:
        1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中  

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

    6. 请简述ArrayListList<>的主要区别

    答:ArrayList是非泛型列表,存储数据时把所有的数据都当成object类型存储,存在装箱问题,取出来使用的时候存在拆箱问题,装箱拆箱会使性能变差,而且存在数据安全问题,但是优点在于可以让值类型和引用类型互相转换。

    List是泛型列表,在使用的时候才去定义数据类型,泛型避免了拆箱装箱的问题,存入读取速度较快,类型也更安全。

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

    答:GC回收堆上的内存
        避免:1)减少new产生对象的次数
              2)使用公用的对象(静态成员)
              3如果字符串拼接多的将String换为StringBuilder

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

    答:语法不同处:1.抽象类中可以有字段,接口没有。

    2.抽象类中可以有实现成员,接口只能包含抽象成员。

    3.抽象类中所有成员修饰符都可以使用,接口中所有的成员都是对外的,所以不需要修饰符修饰。

    用法不同处:1.抽象类是概念的抽象,接口关注于行为。

               2.抽象类的子类与父类的关系是泛化关系,耦合度较高,而实现类和接口之间是实现的关系,耦合度比泛化低。

               3.一个类只能继承一个类,但是可以实现多个接口。

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

    string a = new string("abc");
    a = (a.ToUpper() + "123").Substring(0, 2);   

    答:第一行是会出错的。应该这样初始化:

    string b = new string(new char[]{'a','b','c'});

    3个临时对象

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

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

     foreach (int item in ls)

     {

     Console.WriteLine(item * item);

            ls.Remove(item);

     }   

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

    使用foreach时候不要对内容进行修改,如果要修改可以使用for

    11.请简述关键字Sealed用在类声明和函数声明时的作用

    答:Sealed访问修饰符用于类时,该类是密封类,可防止其他类继承此类。

    在方法中使用时则可防止派生类重写此方法。

    12.请简述privatepublicprotectedinternal的区别

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

    13.反射的实现原理?

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

    14.NetMono的关系?

    答:mono.net的一个开源跨平台工具。.net只能在windows下运行,mono可以实现跨平台,可以运行于linuxUnixMac OS等。

    15.请说出4种面向对象的设计原则,并分别简述它们的含义。 

    答:1 单一职责原则:一个类,最好只做一件事,只有一个引起它的变化

    2 开放-封闭原则:对于扩展是开放的,对于更改是封闭的 

    3) 里氏替换原则:子类必须能够替换其基类 

    4 依赖倒置原则:依赖于抽象 

    5 接口隔离原则 :使用多个小的专门的接口,而不要使用一个大的总接口。

    16. Hashtable是无序的吗?

    答:电脑没有绝对的无序,hashtable是通过哈希码让开发者感觉无序。

     

     

     

     

    Unity问题

    UI

    1.NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么

    答:1.直接监听事件:在按钮上绑定一个带有OnClick脚本,但这种方法不太好用,也不灵活。

        2.ButtonScript:在按钮上添加BoxCollider,在添加ButtonScript脚本,把要调用的方法放到场景中一个物体上,一般放在摄像机上,因为摄像机一直存在,然后把这个方法添加到ButtonScript脚本里写好的委托里面,所以可以添加多个方法,一旦点击就触发事件。

    2.请简述NGUIPanelAnchor的作用 

    答:Panel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化,以减少绘制命令的调用。  

     AnchorNGUI屏幕分辨率的自适应性,来适应不同的分辨率的屏幕显示。

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

    答:1.不美观

    2.OnGUI很耗费时间

    3.使用不方便 

    4. drawcall很高

    4.使用原生GUI创建一个可以拖动的窗口命令是什么? 

    答:GUI.DragWindow()

    5.使用Unity3d实现2d游戏,有几种方式?

    答:1.使用本身的GUI

    2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z

    3.使用2d插件,如:2DToolKit

    碰撞

    6.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法

    答:在两个平面上分别取一个向量,然后看是否相交

    7.MeshCollider和其他Collider的一个主要不同点?

    答:MeshCollider是网格碰撞器,对于复杂网状模型上的碰撞检测,比其他的碰撞检测精确的多,但是相对其他的碰撞检测计算也增多了,所以一般使用网格碰撞也不会在面数比较高的模型上添加,而会做出两个模型,一个超简模能表示物体的形状用于做碰撞检测,一个用于显示。

    8.Unity3d中的碰撞器和触发器的区别?

    答:1.碰撞器物体不能互相进入到对方内部,触发器可以

    2.触发器角色控制器可以使用,碰撞器中不能使用

    3.触发器没有物理属性了,碰撞器可以有力存在

    4.碰撞器调用OnCollisionEnter/Stay/Exit函数,触发器调用OnTriggerEnter/Stay/Exit函数

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

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

     

    CharacterController和Rigidbody的区别?

    CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

    Rigidbody就是刚体,使物体带有刚体的特征。

     

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

    答:穿透(碰撞检测失败)

    避免的方法:把刚体的实时碰撞检测打开Collision Detection修改为Continuous Dynamic

     

    unity3d中物体发生碰撞的整个过程中,有几个阶段,分别列出对应的阶段函数

    主要是三个阶段:1.Collider.OnCollisionEnter 进入碰撞,
    OnCollisionEnter is called when this collider/rigidbody has begun touching 
    another rigidbody/collider.

    collider/rigidbody开始触动另一个rigidbody/colliderOnCollisionEnter被调用。
    2.Collider.OnCollisionStay 逗留碰撞,
    OnCollisionStay is called once per frame for every collider/rigidbody that is 
    touching rigidbody/collider.

    每个collider/rigidbody触动rigidbody/collider,将在每帧调用OnCollisionStay。通俗的说,

    一个碰撞器或刚体触动另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。
    3.Collider.OnCollisionExit 退出碰撞,
    OnCollisionExit is called when this collider/rigidbody has stopped touching 
    another rigidbody/collider.

    当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用。

     

     

    动画

    11.一个简单的游戏,怪物会走动\攻击\死亡,游戏角色会走动,跳跃\攻击\格挡\死亡,还会接受玩家从输入端输入的指令,NPC会走动,他们彼此之间可以互相通信.请画出以上三种角色的UML图示.

    答:

     

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

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

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

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

    3.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观,皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。

    13.反向旋转动画的方法是什么?

    答:  反转动画,将动画的速度调到-1

    14.写出Animation的五个方法  

    答:AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样 CrossFade淡入淡出切换动画、IsPlaying是否正在播放某个动画 

    15.动画层(AnimationState Layers)的作用是什么? 

    答:动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画

    16.Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法? 

    答:ITween是补间动画的一个插件,主要作用就是给出开始、结束的值、时间,此插件实现各种动画,晃动,旋转,移动,褪色,上色,音量控制等等。

     方法:1.MoveTo  物体移动 

    2.ColorTo:随着时间改变对象的颜色组

     3.LookTo:随时间旋转物体让其脸部朝向所提供的Vector3Transform位置  

    17.法线贴图 CG动画 

    答:法线贴图:是一种特殊的纹理,可以应用在3D表面,让低模呈现出更明显的凹凸效果。一般应用在CG动画、美术效果要求较高的单机游戏

    CG动画:游戏中的CG动画其实是用3D模拟引擎制作的游戏短片,一般画面效果比较真实。

    线程和协程

    18.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?

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

    注意:1.虽然支持多线程,但是仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用,所以如果使用的话需要把组件中的数值传到开启的新线程中。
    2.C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

    19.Unity3D的协程和C#线程之间的区别是什么?

    答:多线程程序同时运行多个线程,除主线程之外的线程无法访问Unity3D的对象、组件、方法,而在任一指定时刻只有一个协程在运行。

    20.什么是协同程序?

    答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。

    四元数

    21.四元数是什么?主要作用什么?对欧拉角的优点是什么? 

    答:所谓四元数,就是把4个实数组合起来的东西。4个元素中,一个是实部,其余3个是虚部

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

    四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁

    四元数由4个数组成,旋转矩阵需要9个数

    两个四元数之间更容易插值 

    四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易 

    与旋转矩阵类似,两个四元组相乘可表示两次旋转

    摄像机

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

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

    23.Unity摄像机有几种工作方式,分别是什么?  

    答:正交和透视

    正交无法看到一个物体距离自己有多远,或者远近的变化,物体也不会随着距离而收缩,所以一般做2D游戏或者是UI时会使用正交摄像机。

    透视一般看物体会随着距离有大小的变化,一般3D游戏里经常使用这种摄像机。

    预制物

    24.Prefab的作用?如何在移动环境的设备下恰当地使用它?

    答:Prefab是预制物,一般当游戏中需要频繁创建一个物体时,使用预制物可以节省内存,方便创建,方便对游戏物体进行操作,方便对属性进行修改。

     

    unity 当需要频繁创建一个物体对象时,怎样减少内存

    :动态加载再实例化,如果自己不主动清理内存的话,再次加载不会增加内存的,会自动去取之前已经加载好的assets,如果这一个assets你都嫌多的话,那你只能减资源了,比如,模型面数,纹理尺寸等

    Shader

    25.出光照计算中的diffuse的计算公式 

    答:实际光照强度l=环境光(lambient+漫反射光(Idiffuse+镜面高光(lspecular

        环境光:lambient=环境光强度(Aintensity*环境光颜色(Acolor

        漫反射光:ldiffuse=镜面光照强度(Dintensity*镜面光颜色(Scolor*(光的反射向量(R.观察者向量(V))^镜面光指数(n

    26.MeshRendermaterialshader的区别?

    答:MeshRender是模型渲染的组件,有此组件物体才能显示出来

    Material是材质球,实际就是shader的实例,并进行赋值,贴图、纹理、颜色等。

    Shader是着色器,实际上是一段程序,还可以用来实现一些仅靠贴图不容易实现的效果,如玻璃。

    Shader大致分为:1.表面着色器

    2.顶点和片元着色器

    3.固定功能着色器

    27.alpha blend工作原理 

    答:Alpha Blend 实现透明效果,Color = 原颜色*alpha/255+目标色*255-alpha/255

    28.光照贴图 的优势是什么?

    答:1.使用光照贴图比使用实时光源渲染要快

    2.可以降低游戏内存消耗 

    3.多个物体可以使用同一张光照贴图  

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

    答:顶点着色器:顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的

    transformationlightingVertex Shader主要操作顶点。 

    Vertex Shader对输入顶点完成了从local spacehomogeneous space(齐次空间)的变换过程,homogeneous spaceprojection space的下一个space。在这其间共有world transformation, view transformationprojection transformationlighting几个过程。  

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

     答:4种,Directionl light ,Point Light ,Spot Light,Area Light

     

    Unity系统API

     

    物理更新一般在哪个系统函数里?

     答:FixedUpdate每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。

     

     

    30.OnEnableAwakeStart运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?

    答:Awake –>OnEnable->Start
        OnEnable在同一周期中可以反复地发生

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

    答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy

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

    答:FixedUpdate因为不受到计算机帧频的影响,所以比较适合于做物理方面的更新。

    33.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?

    答:LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

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

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

         renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible renderer(渲染器)在任何相机上可见时调用:OnBecameVisible  

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

    答:PlayerPrefs.SetInt()

    PlayerPrefs.GetInt()

    36.动态加载资源的方式?区别是什么?

    答:1.Resources.Load();

    2.AssetBundle

    区别:

    Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。
    简单说,Resources资源的加载是动态加载内部的,AssetBundle 是动态加载外部的

    37.以下哪个函数在游戏进入新场景后会被马上调用? 

    答:MonoBehaviour.OnLevelWasLoaded  

    38.如何销毁一个UnityEngine.Object及其子类对象

    答:Destory

    39.获取、增加、删除组件的命令分别是什么? 

    答:获取:GetComponent 

    增加:AddComponent 

    没有删除组件只有让组件不生效:enable

    40.Application.loadLevel命令是什么?

    答:加载关卡 

    41.调试记录到控制台的命令是什么?

    答: Debug.Log();  

    42.LayerMask.NameToLayer()这个方法有什么作用? 

    答:层索引

    43.localPositionPosition的使用区别? 

    答:localPosition:自身位置,相对于父级的变换的位置,局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。 

     Position:在世界坐标transform的位置,世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。

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

    答:Transform.Rotate()

    45.物体围绕某点旋转使用的函数?

    答:Transform.RotateAround()

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

    答:Transform 父类是 Component

    47.写一个计时器工具,从整点开始计时,格式为:00:00:00  

    答:

    int scend

    int minte

    int hour

    void Start()

    {

    scend=0

    minte=0

    hour=0

    }

    void Update()

    {

    Ifscend<60

    {

    Scend+=time.deltime;

    }

    Else

    {

    Scend-=60;

    Minte+=1;

    }

    If(minte>=60)

    {

      Minte-=60;

      Hour+=1;

    }

    }

    物理引擎

    48.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.

    答:添加刚体使小鸟模拟受到重力影响。

    49.实现吊机吊物体的功能  

    1. 答:using UnityEngine;  
    2. using System.Collections;  
    3. public class QizhongjiCS : MonoBehaviour {  
    4.     private float dianX = 0;  
    5.     public GameObject hook;  
    6.     private float yuandianX;  
    7.     private Vector3 hookV;  
    8.     private int flag=0;  
    9.     private delegate void HookMove();  
    10.     private  HookMove _hookMove=null;  
    11.     private int speed=3;  
    12.     public HookZhongWu hzw;  
    13.     private int zwFlag=0;  
    14.     private GameObject zhongwu;                 //抓住的重物;  
    15.     public GameObject shengzi;  
    16.     public GameObject heng;  
    17.     // Use this for initialization  
    18.     void Start () {  
    19.         hookV = hook.transform.localPosition;  
    20.         yuandianX = hookV.x;  
    21.     }  
    22.     // Update is called once per frame  
    23.     void Update () {  
    24.         if (flag == 0) {  
    25.             if (Input.GetMouseButtonDown(0))  
    26.             {  
    27.                 dianX = Input.mousePosition.x;  
    28.             }  
    29.             else if (Input.GetMouseButton(0))  
    30.             {  
    31.                 float dx = Input.mousePosition.x - dianX;  
    32.                 if (Mathf.Abs(dx) > 0.1f)  
    33.                 {  
    34.   
    35.                     hookV.x = yuandianX + dx / 32;  
    36.                     if (hookV.x > -6 && hookV.x < 6)  
    37.                     {  
    38.                         hook.transform.localPosition = hookV;  
    39.                     }  
    40.   
    41.                 }  
    42.             }  
    43.             else if (Input.GetMouseButtonUp(0))  
    44.             {  
    45.                 //yuandianX = hookV.x;  
    46.                 flag = 1;  
    47.                 _hookMove = hookDown;  
    48.                 StartCoroutine(downZhua());  
    49.             }   
    50.         }  
    51.     }  
    52.     IEnumerator downZhua() {  
    53.         yield return new WaitForSeconds(0.01f);  
    54.         //1、向下移动, +speed  
    55.         //2、判断移动的位置 如果大于某个位置 ,返回 speed为负  
    56.         if (_hookMove != null)  
    57.         {  
    58.             _hookMove();  
    59.             yield return StartCoroutine(downZhua());  
    60.         }  
    61.         else {  
    62.             yield return null;  
    63.         }  
    64.         //3、判断移动回到原点    整个钩子向原始位置水平运动  
    65.         //4、判断钩子回到原点   停止协程  flag=0  
    66.         yield return StartCoroutine(downZhua());  
    67.     }  
    68.     void hookDown() {  
    69.         hook.transform.Translate(Vector3.down * Time.deltaTime * speed);         changeShengZi();  
    70.         if (hook.transform.localPosition.y < -2) {  
    71.             if (zwFlag == 1) {  
    72.                 zhongwu.transform.parent = null;  
    73.                 zhongwu = null;  
    74.                 zwFlag = 0;  
    75.             }  
    76.             _hookMove = hookUp;  
    77.         }  
    78.     }  
    79.     void hookUp()  
    80.     {  
    81.         hook.transform.Translate(Vector3.up * Time.deltaTime * speed);  
    82.         changeShengZi();  
    83.         if (hook.transform.localPosition.y >3.2)  
    84.         {  
    85.                 _hookMove = HMove;  
    86.         }  
    87.     }  
    88.     void HMove()  
    89.     {  
    90.         hook.transform.Translate(Vector3.left * Time.deltaTime * speed);
    91.         if (hook.transform.localPosition.x <=-4.5)  
    92.         {  
    93.             if (zwFlag == 0)  
    94.             {  
    95.                 flag = 0;  
    96.                 _hookMove = null;  
    97.             }  
    98.             else {  
    99.                 _hookMove = hookDown;  
    100.             }  
    101.         }  
    102.     }  
    103.     public void zhuaZhongWu(GameObject zhongwu) {  
    104.         _hookMove = hookUp;  
    105.         zwFlag = 1;  
    106.         this.zhongwu = zhongwu;  
    107.     }  
    108.     void changeShengZi() {  
    109.         Vector3 hookPosition = hook.transform.position;  
    110.         Vector3 hengliangP = heng.transform.position;  
    111.         float dy = hookPosition.y - hengliangP.y;  
    112.         Vector3 shengziP = shengzi.transform.position;  
    113.         shengziP.y = hengliangP.y + dy / 2;  
    114.         shengzi.transform.position = shengziP;  
    115.         //改变 绳子长度  
    116.         Vector3 shengziSclae = shengzi.transform.localScale;  
    117.         shengziSclae.y = dy/2;  
    118.         shengzi.transform.localScale = shengziSclae;  
    119.     }  
    120. }  

    HookZhongWu.cs用来判断 钩子是否和重物碰撞

    碰上的时候 将重物设置成钩子的子对象  就可以实现带着往上升的效果了

    1. public class HookZhongWu : MonoBehaviour {  
    2.     public QizhongjiCS qzj;  
    3.     void OnTriggerEnter(Collider collision)  
    4.     {//当碰撞时  
    5.         print("OnTriggertEnter+" + collision.gameObject.name);  
    6.         if (collision.gameObject.name == "zhongwu") {  
    7.             collision.gameObject.transform.parent = this.gameObject.transform;  
    8.             Vector3 v = collision.gameObject.transform.localPosition;  
    9.             v.y = -1.2f;  
    10.             collision.gameObject.transform.localPosition = v;  
    11.             qzj.zhuaZhongWu(collision.gameObject);  
    12.         }  
    13.     }  
    14. }  

     

    50.上机题:用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可)  

    答:在场景中添加一个PlanCameraDirectional LightCube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。

    1.鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    void Update () {
        //鼠标滚轮的效果
      //Camera.main.fieldOfView 摄像机的视野
      //Camera.main.orthographicSize 摄像机的正交投影
      //Zoom out
       if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
        if (Camera.main.fieldOfView <= 100) 
        Camera.main.fieldOfView += 2;
       if (Camera.main.orthographicSize <= 20)
          Camera.main.orthographicSize += 0.5F; }
            //Zoom in
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
         {
          if (Camera.main.fieldOfView > 2)
            Camera.main.fieldOfView -= 2;
          if (Camera.main.orthographicSize >= 1)
             Camera.main.orthographicSize -= 0.5F;
            }}

      2.鼠标实现在场景中拖动物体:

      解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理

       主要代码如下:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    // Use this for initialization

        void Start ()

        {

            StartCoroutine(OnMouseDown());

        }

     

        IEnumerator OnMouseDown()

        {

            //将物体由世界坐标系转换为屏幕坐标系

            Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标

            //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系  

            //    //             2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离

            //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离

            Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));

            while (Input.GetMouseButton(0))

            {

                //得到现在鼠标的2维坐标系位置

                Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);

                //将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量

                Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;

                //curPosition就是物体应该的移动向量赋给transform的position属性

                transform.position = curPosition;

                yield return new WaitForFixedUpdate(); //这个很重要,循环执行

            }

        }

     

    51.MaterialPhysic Material区别?

    答:PhysicMaterial 物理材质:主要是控制物体的摩擦,弹力等物理属性。 

    Material材质:主要是控制一个物体的颜色,质感等显示。

    52.CharacterControllerRigidbody的区别?

    答:CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

    Rigidbody就是刚体,使物体带有刚体的特征。

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

    答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。

    54.什么叫做链条关节?

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

    55.什么是导航网格( NavMesh)?  

    答: Unity内一种用于实现自动寻路的网格  

    56.Unity3d提供了几种光源类型,分别是哪几种?

    答:四种。

    平行光:Directional Light

    点光源:Point Light

    聚光灯:Spot Light

    区域光源:Area Light

    Unity引擎问题

    57.简述Unity3D支持的作为脚本的语言的名称

    答:Unity的脚本语言基于Mono.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
    Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
    JavaScript

    C#
    Boo 

    58.向量的点乘、叉乘以及归一化的意义?

    答:1)点乘计算两个向量之间的夹角,还可表示某一方向的投影
    2)叉乘得到的是法向量
    3)标准化向量:用在只关系方向,不关心大小的时候

    59.矩阵相乘的意义及注意点

    答:用于表示线性变换:旋转、缩放、投影、平移、仿射
    注意:矩阵的蠕变:误差的积累

    60.为什么dynamic fontunicode环境下优于static font

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

    61.Render的作用?描述MeshRenderSkinnedMeshRender的关系与不同

    答:render是渲染器,渲染器可以使物体显示在屏幕上。

    MeshRender是网格渲染,SkinnedMeshRender是蒙皮网格渲染器

    62.简述SkinnedMesh的实现原理

    答:骨骼蒙皮动画,模型本身是静态的,是因为通过蒙皮,使模型每个点都有Skin数据,Skin数据包括顶点受到哪些骨骼影响以及这些骨骼影响顶点的权重值,还有动画数据,有了Skin数据的模型就可以根据动画数据进行显示动画了。 

    63.为什么Unity3D中会发生在组件上出现数据丢失的情况?

    答:组件上绑定的对象被删除了

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

    答:1Assets目录和Library目录一起迁移

    2导出包

    3unity自带的assets Server功能

    65.Lod是什么,优缺点是什么? 

    答:LODLevel of detail简称,意为多层次细节,是最常用的游戏优化技术,LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

       优点:可根据距离动态的选择渲染不同细节的模型

    缺点:增加美工工作量,增大了游戏的容量。

    66.两种阴影判断的方法、工作原理。 

    答:自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面

    工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。

    投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域收不到光照照射而形成的阴影。

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

    67.MipMap是什么,作用? 

    答:MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap  

    68.用代码实现第三角色控制器 

    答:  

    69.Mecanim系统中,Body Mask的作用是?

    答:指定身体的某一部分是否参与渲染  

    70.Unity连接数据库 

    答:需要得到Mono.Data.Sqlite.dll 文件与System.Data.dll文件  

    71.如何优化内存?

    答:1.压缩自带类库

    2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy

    3.释放AssetBundle占用的资源

    4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小

    5.使用光照贴图

    6.使用多层次细节(LOD)

    7.使用着色器(Shader)

    8.使用预设(Prefab)

    72.你用过哪些插件?

    答:NGUI/DF/ITeen

    m

     

    在哪个模块下可以修改Render Path?

    a. Camera

    b. Light

    c. Render settings

    d. ProjectSetting=Player=OtherSettings

     

     

    图形图像

    1.什么是渲染管道?

    答:是指在显示器上为了显示出图像而经过的一系列必要操作。

    渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

    主要有三步:应用程序阶段,几何阶段 光栅阶段

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

    2.什么是矢量图 

    答:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。

    3.什么是矩阵?矩阵运算?

    答:矩阵:横轴排列的二维数据表格

    矩阵运算:

    加减 限制条件:行和列必须相同,对应相加相减得到结果

    乘法 限制条件:要求左矩阵的行和右矩阵的列必须同,行数和左矩阵相等,列数和右矩阵相等,结果的第i行第j列,是左矩阵的第i行和右矩阵的第j列逐个相乘并把结果相加,得到结果是结果 的 第i行第j

    4.角度和弧度的转换

    答:角度和弧度

    度和弧度之间的换算  1弧度 = 180度 /pi(约57.3

                           1=pi/180弧度(约0.017

    5.矢量标量

    答:矢量有方向如力速度 标量只有大小没有方向如温度

    矢量取模就是只要大小不要方向

    ^单位向量 有方向  大小为1的向量

     

    矢量的加法:是矢量的几何和,服从平行四边形规则

    矢量满足交换律,满足结合律

     

    在直角坐标系中,矢量等于骑在坐标轴上投影的矢量之和(二维矢量可以看做三维矢量的特例也就是说  三维成立,二维也成立)

     

    矢量减法:

    大小相等 方向相反 称为逆矢量

     

    任意多个矢量首尾相连接组成闭合多边形,其结果必为0

    矢量的乘法:点积(内积、标量积)、叉积(外积)结果是矢量

    点积方法 dot

     

     

     

     

    Unity面试题1.B  2. A  3. B  4. B  5. D  6. D 7.D  8.A  9.B 

     

     

     

     

     

     

     

    1.D  2.C  3.C  4.A  5.D  6.B.D  7.B  8.c  9.D  10.a

     

     

     

     

     

    ;A

     

       这三题都有了! 

     

     

     

     

     

     


    展开全文
  • unity3d 各大插件评测

    2018-01-30 15:00:43
    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具...

    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院


    引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具。为此我写了插件的经验及理论讲解,涉及插件的 学习/辨别/选择/配合。也写了插件的 评测/教程/下载。关于评测,带有一定的主观性,仅供参考。关于教程,热门插件网上已经有很多教程了,本文提供链接,网上资料少的插件本文提供了使用方法的简单介绍。至于下载,主要是学习交流为主,下载速度还是比较快的。
    (PS:本文主要起一个抛砖引玉的作用。欢迎同学们积极留言交流,大牛不吝指教【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院。本文用武侠功夫这个大家比较感兴趣的内容来描述游戏开发,借此描述Unity插件学习的道理,同时激发同学们的学习兴趣,没兴趣的可以跳过相关内容。我的新浪微博 @风宇冲

    本文一共分为三个部分,第一部分是插件的下载,第二部分是插件的评测,第三部分是插件的学习方法。

                                  第一部分 插件的下载

    下载所有插件 (下载时逐个下载比较快)
    注:所有付费插件下载仅用于学习和交流用途,请在下载后24小时内删除,商业用途请购买正版。(你懂的)


                                  第二部分 插件的评测

    Unity插件本文分以下九个类别介绍,后面跟的是风宇冲的推荐插件:
    一 界面制作 推荐:NGUI
    二 2D游戏制作 推荐:2D Toolkit
    三 可视化编程 推荐:PlayMaker
    四 插值插件 推荐:iTween,HOTween
    五 路径搜寻 推荐:Simple Path
    六 美术及动画制作 推荐:RageSpline,Smooth Moves
    七 画面增强    推荐:Bitmap2Material,Strumpy Shader Editor
    八 摄像机管理  推荐:Security Camera
    九 资源包  推荐:Nature Pack
    十 其他类
    一: 界面设计(UI) -  风宇冲推荐NGUI
    综述:所有UI插件可以实现的功能和效果最后都是差不多的,区别是最终游戏的运行效率和内存占用量不一样,开发的速度也不一样。 NGUI和EZGUI是属于一类,核心是将UI元件图合并到一张大图(atlase)上,再根据uv去找对应的小图,最后使用2D camera绘制。 iGUI是另外一种UI插件,它可以说是Unity自带UI的升级版,也就是OnGUI的延伸。了解OnGUI()的同学都知道,它的运行效率是比较低的,没有Drawcall合并,iGUI也一样。中文等字体制作一般是用Glyph Desginer 或者 Bmfont, 这点NGUI和EZGUI是通用的。总体来说, GUI插件的功能还是略微有限, 无论是什么GUI插件想做复杂点的功能就必须得用脚本。学习维护起来还是稍微有点麻烦的,故依然建议一个团队只一个人或几个人专门负责UI。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    【NGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    内存占用   ★
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  

    优点:UI合成图(atlas)管理方便,字体RGB压缩,持续更新,支持Flash,支持语言本地化即多语言,支持图像高低清配置。
    缺点:卷屏界面(ScrollList)的实现稍微麻烦。
    介绍:目前Unity最好用的UI 插件。重点是 NGUI应该会一直更新,跟着Unity的脚步。 NGUI也更方便于管理atlas,至少每个Sprite在atlas中都有名字来管理可以很方便的添加删除共用,并且Sprite的位置大小信息可见也 可适当调整。
    使用注意:
    (1)一个界面,通常也就是一个panel,一定只能有一个atlase, 否则层级极易出现错乱。

    div STYLE="color: rgb(255, 0, 0);" >【FastGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  与NGUI相同
    内存占用   与NGUI相同
    开发速度   
    掌握时间   
    跨越平台  与NGUI相同
    文档教程  
    综合评价  
    NGUI插件的补充,必须先在工程里导入FastGUI。主要用途为对Photoshop的支持,可以利用Photo的分层快速制作NGUI的UI部件,直接在Unity里使用psd即可。

    【EZGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能 
    运行效率 
    内存占用 
    开发速度  
    掌握时间  
    跨越平台  
    文档教程 
    综合评价 
      比较经典的UI插件,目前已经基本不更新了。 
    优点:Unity的元老级UI插件,方便实现快速开发
    缺点:已基本不更新,UI合成图不能单图调整。
    使用中注意的几点:
    1:如果是Prefab中有EZGUI的东西的话,每次修改完最好Apply一下,然后点击Build Atlases
    2:如果贴图合成图(atlase)都默认在Sprite Atlases文件夹下,如果图错乱的话,直接删除贴图重新点击Build Atlases生成贴图合成图即可。
    3:位于scrolllist 下的一切物体必须为 EZGUI的组件 , 否则下拉的时候会不被切图。
    scroll item 显示不完整  : 调整scrollist视口x尺寸
    4:假如 点pixel perfect后 仍不显示尺寸则 点击运行则尺寸恢复正常
    5:Panel只 build atlas 精度不够:  把atlas的分辨率调高 然后删掉 重新build
    6:如果是移动平台开发切记EZ GUI组件选项不能钩 pixel perfect,因为其有auto resize会使在iphone 尺寸错误。
    7:EZ脚本里很多有用函数,其默认为protected,建议将有用函数改成public,方便调用。

    【iGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    内存占用  
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  
    优点:快速开发,可视化
    缺点: 效率低
    iGUI是所有UI制作插件里最牛的可视化工具了。它的口号是 WSYIWYG(What you see is what you get),翻译成中文就是 所见即所得。其UI的实现核心是和Unity自带UI也就是OnGUI()是一样的。所以导致了做到后期一整套UI可能会有几十甚至上百的Drawcall。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    二:2D游戏制作 -  风宇冲推荐2D Toolkit
    综述:核心都是 2d精灵(Spritte)以及帧动画的管理和使用。个人觉得2D Toolkit 比Ex2d好些,更像是制作商业2D游戏的软件。
    【2D Toolkit 】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    内存占用  
    开发速度  
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  
    优点:专业,靠谱
    缺点:精细的碰撞实现较麻烦
    你想做2D游戏?没错,就是它了!笔者也做过一些2D游戏,棋牌的飞行的RPG的都有,2D Toolkit还是很靠谱的。缺点是碰撞检测要么是简单的多边形(三角形四边形神马的)之间碰撞,或者是简单多边形和复杂多边形之间。复杂多边形和复杂多边形之间的碰撞是不支持的。而且复杂多边形的碰撞体需要自己去画。想做出类似像素碰撞检测的效果也是可以的,沿着图形本身的边缘去画,如果你不嫌麻烦的话。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院








    【Ex2d】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    笔者接触了一点,看了其官方提供的示例,感觉比较娱乐。不多评价了。


    三:可视化编程(Visual Scripting) -  风宇冲推荐PlayMaker
    综述:可视化编程在商业游戏开发里可以辅助编程开发而不是替代编程。PlayMaker可以用来做状态管理。uScript可以用来做简单游戏的开发。
    【PlayMaker】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化程度
    细节功能  
    运行效率  
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  

    优点:状态管理
    缺点:实现其宣扬的无编程做游戏不靠谱,多状态功能难管理
    Asset Store上面很火的插件,官方说可实现无编程制作完整的游戏。这个个人感觉,你要做个类似俄罗斯方块或者弹弹球之类的小游戏是可以的,但是完全不编程制作商业级的游戏真心不靠谱。举个例子,游戏要赚钱你要嵌入广告sdk或者是IAP等付费sdk,那么你就得写脚本去实现。 不过PlayMaker也还是有可取的地方,其核心在于 将例如站立行走死亡等等状态通过状态机简称FSM(finite state machine)来管理。简单来说一个物体就是一个FSM,一个状态对应一个state。游戏过程中能在物体上方实时显示该物体的状态。并且有很方便的图表管理。缺点在于:所有功能必须对应状态。有很多共同状态都需要的功能用Playmaker做会极其麻烦,比方说,你有一个人物,有5个状态,还有行走攻击等控制输入,每个状态都要控制输入的话,同样的代码你就要有5份,很麻烦。而正常代码的话只需要简单的一段代码几个状态的与运算就可以了。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院



    【uScript】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化程度
    细节功能  
    运行效率  
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  

    优点:流程清晰
    缺点:功能不够细致
    如其宣传的,uScript模仿了UDK和CE3的开发形式,注重逻辑流程,所见即所得,逻辑性直观紧凑。但是模块还不够全面功能不细致,例如你可以给材质赋贴图,但是要改变材质颜色就找不到对应功能了,类似情况挺多的。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    四:插值插件 (Tween tool)-  风宇冲推荐iTween / HOTween
    综述:iTween和HOTween各有各的优势,核心功能就是对位移,缩放,颜色等数值进行插值。iTween和HOTween并不冲突,可以同时在一个工程里使用。建议做路径的话最好用iTween, 做非位移,缩放,颜色的数值时只能用HOTween。其他情况最好用HOTween,因为管理更具有可操作性。
    【iTween】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性    
    简易度    ★
    综合评价  
    优点:免费,通用,实用
    缺点:不够稳定,不能返回改变目标tweener
    介绍:免费的经典tween插件。Tween,包括位移,缩放,颜色变换等。NGUI,EZGUI,PlayMaker等很多插件都使用它来实现tween部分。缺点是tween的过程中,如果物体被销毁等情况,容易产生不可预制的错误。
    【iTweenPath】
    可视化    ★
    实用性    
    简易度    ★
    综合评价  
    优点:免费,路径清楚,实用
    介绍:iTween的补充插件,主要是可视化的绘制路径,然后在iTween里使用生成的路径。可以用于TD地图怪物的路径移动。
    使用方法:(1)导入插件后 (2)随便任何一个物体,把iTweenPath拖上去 (3)inspector里设置路径点数量 (4)在选中该物体的前提下,在Scene View里拖拽各个点绘制路径 (5)给路径起名例如 'xyz' (6)代码里使用即可,例如iTween.MoveTo(obj, iTween.Hash("path",iTweenPath.GetPath("xyz"),"time",10f));
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院



    【HOTween】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性    
    简易度    ★
    综合评价  
    优点:免费,管理比iTween更方便,使用范围更广
    缺点:可视化补充件HOTween Edtior作用position时不能像
    iTweenPath那样显示路径。
    介绍:类似iTween的 tween插件,功能更为强大。目标类型不再仅仅为position,color等固定类型,任何你在脚本里定义的public, non-static的 numeric 即 color/vector/int/float/double/string 变量都可以作为目标。并且调用函数后会返回tweener,如果储存tweener可以随时 监测/停止本次tween。
    使用方法:(1)导入插件
    (2)使用HOTween的脚本里添加using Holoville.HOTween;
    Start()里添加HOTween.Init();
    (3)   TweenParms tmp = new TweenParms();
            tmp.Prop("position",new Vector3(5,0,0));
            tmp.Ease(EaseType.Linear);
            HOTween.To(obj.transform,1,tmp);
     其中 position如果换成自定义变量,obj.transform就要换成对应的脚本对象即可。

    序列tween使用方法:
    (1)mySequence = new Sequence(new SequenceParms().Loops(3,LoopType.Yoyo));
    (2)
    mySequence.Append(HOTween.To(myGameObject1.transform, 1, new TweenParms().Prop("position", new Vector3(10,20,30)).Prop("rotation", new Vector3(0,720,0)).Prop("localScale", new Vector3(4,4,4)).Ease(EaseType.EaseOutBounce)));
    有Append /
     Prepend / Insert三种方法,Append是加在序列最后,Prepend是最前,Insert是即将到来的目标
    注意:(1)HOTween.To 等方法是低效的,储存返回的结果tweener,然后反复使用例如tweener.Play()更高效
    (2)Tweener及TweenParms相当于一个容器, 下面填的变量才是真正要改变的内容。
    【HOTween Editor】(要求Unity 3.5.6以上)
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化    ★
    实用性    
    简易度    ★
    综合评价  
    优点:高效,快捷
    缺点:插值作用于position时,无路径显示。
    使用方法:
    (1)选中目标物体 (2)Component->HOTween->HOTweenComponent  (3)在Inspector下的界面点击 蓝色的‘+Add Tween’(4)选择tween目标 (5)点击蓝色的‘+’,注意你想要改变的变量点这一步才会出来。(6)选择要插值的变量 (7)填Tween To等值即可
    (8) 关闭'AutoDestroy'和‘Autoplay ’ (9) 脚本加
    using Holoville.HOTween;
    using System.Collections.Generic;
    (10)调用该tween
        HOTweenComponent tweenComponent = myGameObject.GetComponent<HOTweenComponent>();
            if (tweenComponent != null)
            {
                // Do something with the Tweeners
                List<Tweener> tweeners = tweenComponent.generatedTweeners;
               
                if(tweeners[0].id == "tweenerName")
                {
                    tweeners[0].Play();
                }
            }
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院








    五: 路径搜寻(Path Finding)-  风宇冲推荐SimplePath
    综述:路径搜寻主要用于怪物的AI行走,以及人物点击移动。这两个路径算法核心思想都是:先将地图划分成方格区域(像棋盘一样),然后根据方格内是否有障碍物对方格进行赋值,最后生成 单位位置 与 目标位置间的格子路径。想具体学习的童鞋可以百度 A star等算法。
    【SimplePath】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院


    运行效率  
    掌握时间   
    文档教程  
    综合评价  
    官方介绍说支持500+agent,即支持500个单位同时寻路,下方提供的对应插件中带有展示Demo。

    【A* Pathfinding Project】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    运行效率  
    掌握时间   
    文档教程  
    综合评价  
    使用标准的A star算法,下方提供的对应插件中带有展示Demo。



    六:美术及动画制作 -  风宇冲推荐RageSpline,Smooth Moves
    【Smooth Moves】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性    
    简易度    
    掌握时间  
    文档教程  
    综合评价  
    介绍:神马?你们团队没有做动画的人?那么就用它吧!2D骨骼动画制作插件,不支持Flash。骨骼动画文件可以复用。比帧动画省空间占用。
    优点:动画文件复用,省空间
    缺点:
    使用简介:
    一:制作Atlase (1)Project栏下创建Smooth Moves Texture Atlase Data (2)选中atlase 文件,点击open atlase Editor (3)把素材图往里拖。
    二: 制作Animation  (1)Project栏下创建Smooth Moves Texture Atlase Data (2)选中animation文件,点击open animation Editor (3)点击Bone下面的 ‘+’图标,创建骨骼节点(腰,头,腿,足等等,支持中文)(4)点击Animation Clips下的‘+’,创建动画(站立,行走,攻击等)。(5)选中帧序列界面里的 黄色方块 (6)Type选择Image(Transform就是隐藏,所以通常设置为Image)(7)选择图 (8)选择任意同行的黑块,右键选择Duplicate First Key Frame (9)执行 6-7 (10)然后设置pivot,rotation等信息(11)搞定了!点击play看效果吧!
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    【RageSpline】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性   
    简易度   
    综合评价 
    介绍:矢量绘图工具,矢量的好处大家应该都知道,就是不会因为放大而损失质量。 适用于矢量风格的2D游戏以及2D UI的制作。程序会了这个美术就要失业了!
    使用方法: (1)新建一个空的GameObject (2)贴上RageSpline脚本,然后基本形状就出来了 (3)调整形状,具体是 鼠标双击=创建节点 N=圆滑和锋利的边角模式切换 K=削薄边缘 L= 增厚边缘 delete=删除节点 (4)调整边缘颜色outline color 以及填充颜色 Fill Color,大功告成!
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    【Mega-Fiers】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性   
    简易度   
    综合评价 
    介绍:模型变形工具,简单实用,可以用于3D字体的弯曲效果等等。
    使用方法:非常简单, (1)选中要变形的物体,(2)上方菜单Component->Modifiers->Modify Object (3)添加任何预制变形,例如弯曲则是 Component->Modifiers->Bend (4)之后在Inspector里调对应数值即可。

    七:画面增强 -  风宇冲推荐Bitmap2Material,Strumpy Shader Editor
    【Bitmap2Material】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    掌握时间   
    文档教程  
    综合评价  
    优点:方便,实用。
    缺点:尚未发现。价格过高【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    使用方法:将包里的Bitmap2Material.sbsar拖进unity工程,然后直接将你的原图拖到下方例图的'Input'上去,它会自动生成法线贴图灰度图等效果图,效果还是不错的。并且支持将随便的一张图制作成Tile图,可以无缝拼接的哦。之后就自己在Insprector里微调吧!
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院


    【UniSky】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    实用性   
    简易度   
    效果 
        
    兼容性
       
    综合评价 
    优点:云与日月层叠效果逼真,有云起云散
    缺点:缺少下雪等特效,有紫色斑点等BUG。
    介绍:24小时实时 天空盒+天气插件。天气主要是下雨和storm,不过效果一般,建议另外。画面效果不错,不过需要自己去配置, 例如大太阳的天气去下雨肯定不真实,下雨的时候至少要把天空调成阴暗的,有一种乌云密布的感觉。并且天气与地形与单位的互动,需要另外添加,比如溅射到地面的水花等等。月亮放大后在某些显卡下会有紫色斑点。
    使用建议:
    风:Unity的Windzone
    雨:Unity官方Demo《AngryBot》 里面的雨
    使用方法:链接

    【Strumpy Shader Editor】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化   
    实用性   
    简易度   
    综合评价 ★★★★★
    优点:实用,免费
    介绍:渲染器Shader的可视化编辑器,可视化的界面和PlayMaker,uScript用起来差不多。顶点渲染,像素渲染和光照模型渲染三种模式都支持。使用前最好对 三种类型Shader的代码写法有所了解,再使用该工具能起到事半功倍的效果。
    使用方法:(1)插件载入到工程里 (2)菜单Shader Editor->Stumpet Shader Editor。 (3)点击New Graph (4)在图表界面Master右方,右键创建 Tex2D 以及 Sampler2D (4)连线如下 (5)点击Update Graph,之后能看见预览图了 (6)点击Export As,生成Shader文件
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    注意:(1)每次改动完需要点Update Graph更新预览。 (2)删除连线:鼠标移动至线上,点击右键
    (3)UV x或y的单变化使用UV_Pan (4)图表视口的移动为 alt + 鼠标左键
    StrumpyShader详细教程

    八:摄像机管理 - 风宇冲推荐 Security Camera
    【Security Camera】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性   
    简易度   
    综合评价 
    优点:简单,实用
    介绍:摄像机管理插。Unity里管理多相机很麻烦,Camera Preview不实用,来回启用禁用也繁琐。Security Camera能快速查看各个相机的实际效果。
    使用方法:插件载入到工程里后,直接把SecurityCamera.cs脚本拖到各个相机上,然后在Game View里就可以直接分开看单个相机的效果了。
    注意:(1)相机不能重名 (2)只有一个主相机,标签tag为'MainCamera'


    【Ultimate FPS Camera】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    介绍:FPS摄像机的控制插件,没什么好说的。工程里导入插件后直接按里面的文档做就行了。

    九:资源包类(Models & Particles)
    综述:这个就不用多说了,好多有用的资源啊,太省事了!
    【Nature Pack】
    介绍:大自然的树,花,草等模型
    【Ruin city】
    介绍:一个被破坏的城市的模型

    【CartoonSnow】
    介绍:卡通雪效果


    十:其他类
    【uniSWF】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    优点:支持元件经典动画(Classic Tween),无需转换成序列帧
    缺点:不支持图元(Shape)形变,转换成序列帧
    介绍:在unity里使用flash的元件(主要是MovieClip)来制作UI什么的,对有Flash开发经验或者Flash资源的可能比较有用。

    【ORK】(Okashi RPG Kit)
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    介绍:看了看youtube上的教程视频,ORK没什么意思,它整套的UI包括商店,用的是Unity自带的UI,这整套东西你拿来改还不如自己做好,又快又准又能精确调整。就不评分了。这里仅供下载,没事可以看看,如果有兴趣做RPG的新手可以去下个RPG Maker XP看看它的框架是怎样的。做商业级RPG的还是根据需要自己搭框架吧。

    【Tower Defense ToolKit】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    介绍:不评价了,理由前文有提到过, 仅提供下载。


    还有下面一些主流插件没有找到,欢迎补充。
    【Mixamo】无下载
    介绍: 模型动画插件,500美刀,伤不起啊。不过Unity4的动画系统已经改进很多。所以这个插件不用也罢。
    【Audio Toolkit】无下载
    介绍:音频管理插件,可以提高音效质量。32.5美刀
    【FX Maker】
    介绍:粒子系统库。100美刀
    【Easy Water】
    介绍:水面模型。7.5美刀
    【Easy Touch】
    介绍:触屏控制插件。20美刀
    【MakeYourLevel】
    介绍: 环境模型库。 22.5美刀

                                    第三部分 插件的学习方法

    插件的学习: 学插件有如大侠学武功。先练内功根基,再练上乘武功。内功根基是指 线性代数,计算机图形学,编程基础,Unity基本API等等。基础不要求同学们要有多精通,至少基本的原理和使用要懂。上乘武功是指各种插件。如果内功 根基不扎实而强修秘籍的话,也许会像天龙八部里的鸠摩智一样走火入魔。在游戏开发里,通常表现为卡在一个地方,模模糊糊的怎么都过不去,各种纠结。假如你 遇到了类似情况,建议回过头静下心来温习下相关的基础知识,等过后头脑缓过来了再理理思绪,分析分析条理,一般问题在这个时候就解决了。

    插件的辨别:游戏开发如大侠比武,比的是游戏,武功(插件)不同,实力当然也不同。 好的武功能把你的特性发挥的淋漓尽致,PK有如行云流水。差的武功会让你瞬间被秒杀,无缘Grossing榜。好的插件能很好的和你的项目本身配合,达到 提高开发效率的目的。不好的插件你研究它得花费大量时间又还得花时间,又还得花时间修改调试,很有可能反而会降低效率。所以分辨插件的优劣很重要。我总结 了以下几点,能快速分辨插件的好坏:
    好的插件(1)首先,Asset Store上排名高的一般都好用,什么榜都行,当然还是Top Grossing 最有分量,不好的东西谁愿意付钱呢?如果没有排名就看评价数量和内容吧(2)国内相关介绍讨论比较多的一般都好 (3)教程详细的,特别是有语音高清教程的。
    不好的插件 (1)搜索到的相关信息极少的 (2)无排名,评价少 (3)教程粗糙

    插件的选择: 上乘武功需要专精,令狐冲专精剑法,独孤九剑笑傲江湖,郭靖专精掌法,降龙十八掌威震武林。你不可能把天下所有武功集于一身。Unity开发也是,不可能 所有插件你都精通,只能是选取一些对你用处比较大的插件重点学习使用。所以插件的选择就比较重要了、一般来说比较实用的是单个功能块的插件,比如做UI选 NGUI, 插值控制用iTween, 2D游戏用2D Toolkit等等。而综合类插件就不建议实用了。例如做塔防类游戏的 Tower Defense ToolKit, 做RPG游戏的Okashi RPG Kit,这类插件是专门为做一类游戏而生,集成了很多很多功能,但是每个功能又做不到很专业,所以假如你要用,还得自己改,而这类插件一般定制的调整空间 比较小,目前来说还达不到专业的级别。所以如果你做很专业领域的游戏,比如赛车,有个start kit能节省很多时间,毕竟一辆车有几十上百个参数,通常没有必要自己做物理模型。其他一般的游戏比如塔防,闯关什么的就没必要找个类似start kit的东西了。

    插件的配合:上乘武功则需要配合, 例如张无忌的太极拳+九阳真经+梯云纵+乾坤大挪移。招式太极,内功九阳,轻功梯云纵,能量转移则乾坤。配置组合插件道理也一样,使用什么样的组合就要看游戏本身的定位如何了。假如使用了与游戏定位不符合的插件,效果通常只能事与愿违。例如,做个2D游戏,自然用不到 Bitmap2Material,2D游戏也不需要法线贴图灰度图什么的吧。又如做一款商业级别的移动平台游戏用了iGUI制作UI的话,在 Android和iOS各自的低端机上的表现到最后会让你头疼不已。武侠的世界里,武功会有冲突,例如九阳神功九阴真经不能调和,插件同样也是有冲突的,不尽早发现的话后期面对一堆Bug会让你欲哭无泪的。后文中陆续提到了一些兼容或冲突,有些插件在Asset Store上的介绍也会有相关信息,例如某插件会在介绍里写明与NGUI兼容,与PlayMaker兼容。更多的需要同学们事先了解或者实验出来。本段下方举了插件组合的例子供大家参考。

    2D 横屏动作游戏 :2D Toolkit + NGUI
    3D 第一人称射击 :NGUI + Simple Path + Bitmap2Material + PlayMaker + Security Camera + Stumpy Shader Editor
    独立开发2D游戏:(1)Photoshop/Illustrator等外部绘图软件 + Smooth Moves + NGUI
    (2)RageSpline + 2D Toolkit + NGUI
    简易非商业开发:iGUI + iTween
    塔防游戏: iTween/ Simple Path + NGUI  +其他
                
    展开全文
  • 09年还在和其它小伙伴开发引擎的时候,Unity3D就初露头角。 当时就对这种基于组件式的设计结构很不理解。 觉得拆分过于细致,同时影响效率。 而时至今日,UNITY3D已经成为了众多团队的首选3D引擎。 并且,随着...
  • Unity 3D 知识点

    2015-03-06 09:09:30
    分类: Unity3D2014-08-20 16:02 382人阅读 评论(0) 收藏 举报 编辑器: Hierarchy窗口中是场景中的Game Object列表Project窗口中是磁盘上Assets文件夹中的内容,可用来创建Game Object 调试: ...
  • Unity3D+VR的实现

    2019-05-05 00:46:48
    针对CardBoard一类的眼镜用Unity3D开发VR内容。 1、创建VRCamera: 使用Dive插件,从DiveUnityDemo提取摄像机和有关的脚本并export出来。 2、对象选择: 视选模式:从眼睛发射一条射线,选择看到的对象。 手柄模式:...
  • Unity3D】ShaderLab学习笔记 1、什么是Shader: Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(多边形网格,一般使用三角形)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元...
  • 在刚开始学Unity3D时,笔者使用了Unity3D自带的虚拟摇杆,虽然很容易上手,但它的适配性很不好,尤其在不同的机型上,使用起来效果不是很好。后来使用了EasyTouch3.16插件,发现还挺好用的,并且能在电脑上用鼠标...
  • 本课程是 Unity 3D 系列教程,目标是带领读者搭建一商业游戏的网络架构设计,该架构设计是游戏的核心技术,将采用 Unity 2017.2 最新版本作为开发工具。内容分为 UI 架构、技能架构、服务器和网络同步四大部分,共...
  • 下面的这些函数Unity3d程序开发中具有很重要的作用.Update 当MonoBehaviour启用时,其Update在每一帧被调用。LateUpdate当Behaviour启用时,其LateUpdate在每一帧被调用。FixedUpdate 当MonoBehaviour启用时,其...
  • Unity3D常用知识点总结

    2020-06-18 10:29:01
    最近找了U3D实习,把之前的笔记发上来 Unity3D 可以通过将游戏中的物体拖入新键文件夹来重复使用(往往包括该物体用到的模型,动画,贴图,脚本等等) 右上可以调整Debug还是Normal模式 物体 unity3d下 常用物体 ...
  • 在手游中换装成了越来越不可缺的一个功能,毫无疑问各式各样的时装为游戏增添了不同的色彩。对于2D手游,或许是更换对应...所以在游戏中,我们把这四部分单独做四个模型动画,然后动态拼接为一个整体,达到换装的效果。
  • Unity3D面试和笔试题

    2016-09-17 17:34:26
    Unity3D常见面试和笔试题总结问答题
  • 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具...
  • unity3d 各种优化综合

    2014-09-15 14:49:24
    [基础知识]Unity3d优化与检测方式   本帖最后由 诸葛高原 于 2014-5-21 11:34 编辑  检测方式:  一,unity3d 渲染统计窗口  Game视窗的Stats去查看渲染统计的信息: ...
  • 【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载  (2012-12-09 07:27:51) 转载▼ 标签:  unity3d   unity   unity3d教程   unity3d插件   编程 ...
  • Unity3D手游开发实践

    2018-04-29 10:58:53
    虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:架构设计、原生插件/平台交互、版本与补丁、用脚本,还是不用?这是一问题、资源管理、性能优化、异常与Crash、适配与兼容、调试及开发工具...
  • Unity3D面试题

    2018-11-20 14:09:58
    目录 第一部分 1. 请简述值类型与引用类型的区别 2.C#中所有引用类型的基类是什么  3.请简述ArrayList和List的主要区别 4.请简述GC(垃圾回收)产生的原因,并...8.请简述关键字Sealed用在类声明和函数声明...
1 2 3 4 5 ... 20
收藏数 1,225
精华内容 490
关键字:

unity3d自带的四个函数