• Unity3D 基础知识大全(一)


    初阶内容
    Part1:Unity 编辑器相关类
    1、Unity 界面视图窗口,主要包括工具栏、状态栏、Project窗口、Hierarchy窗口、Scene窗口、Game窗口、Inspector 窗口。
    官方链接:https://docs.unity3d.com/cn/current/Manual/UsingTheEditor.html
    2、Unity 特殊的专属文件夹
    Editor:编辑器相关的资源可以放入此文件中,包含图片、脚本等文件。
    Editor Default Resources:配和Editor使用,不会打包到包中增大包体大小。
    Plugins:存放第三方SDK、插件等资源。
    StreamingAssets:Assets下根目录,不会压缩资源,属于只读。常见的代码调用:

    #if UNITY_EDITOR 
    string filepath = Application.dataPath +"/StreamingAssets"+"/filename";
    #elif UNITY_IPHONE
     string filepath = Application.dataPath +"/Raw"+"/filename";
    #elif UNITY_ANDROID
     string filepath = "jar:file://" + Application.dataPath + "!/assets/"+"/filename;
    #endif
    

    应用安装后才会创建可读可写的目录:可读可写,代码访问:Application.persistentDataPath。
    官方链接:https://docs.unity3d.com/cn/current/Manual/SpecialFolders.html
    3、 如何安全的在不同工程间安全地迁移asset数据?
    a. 将Assets和Library一起迁移
    b. 导出包Package
    c. 用Unity自带的Assets Server功能
    4、 MeshRender中Material和Sharedmaterial的区别?
    修改SharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。不推荐修改由SharedMaterial返回的材质。如果你想修改渲染器的材质,使用Material替代。
    5、Unity提供了几种光源,分别是什么?
    四种:平行光:Directional Light、点光源:Point Light、聚光灯:Spot Light、区域光源:Area Light
    6、 简述Prefab的用处?
    在游戏运行时实例化,Prefab相当于一个模板,属于对素材、脚本、参数做一个默认的配置,以便于以后的修改。
    7、 在物体发生碰撞的整个过程中,有几个阶段?
    三个阶段:OnCollisionEnter、OnCollisionStay、OnCollisionExit
    8、 将Camera组件的ClearFlags选项选成Depth only是什么意思?有何用处?
    仅深度,该模式用于对象不被裁剪。
    9、 在编辑场景时将GameObject设置为Static有何作用?
    答:设置游戏对象为Static将会剔除(或禁用)网格对象当这些部分被静态物体挡住而不可见时。因此,在你的场景中的所有不会动的物体都应该标记为Static。
    10、 将图片的TextureType选项分别选为Texture和Sprite有什么区别?
    答:Sprite作为UI精灵使用,Texture作用模型贴图使用。
    11、 简述NGUI中Grid和Table的作用?
    答:对Grid和Table下的子物体进行排序和定位。
    12、 请简述NGUI中Panel和Anchor的作用?
    a. 只要提供一个half-pixel偏移量,它可以让一个控件的位置在Windows系统上精确的显示出来,只有这个Anchor的子控件会受到影响。
    b. 如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘。
    c. UIPanel用来收集和管理它下面所有Widget的组件。通过Widget的Geometry创建实际的Draw Call。没有Panel所有东西都不能够被渲染出来,你可以把UIPanel当做Renderer。
    13、获取、增加、删除组件的命令分别是什么?
    获取:GetComponent、增加:AddComponent、删除:Destroy
    14、3D名词基础概念: a. 3D 三维(three dimension):客观世界中静止的物体都是三维的,在计算机图形学中常在一定的坐标系中用(x,y,z)坐标系列表示物体。
    b. 3D modeling 3D建模:用三维坐标来描述物体的形状。在各种计算机图形应用领域中有不同的三维建模方法,用不同的算法来描述这些领域中的物体和对象。
    c. 3D transformation 3D变换:在三维空间中把物体的三维坐标从一个位置变换至另一位置,或者从一个坐标系变换至另一坐标系。这是一种对物体的三维坐标(x,y,z)进行数据操作的一种形式。
    15、Unity中用于记录节点空间几何信息的组件名称,及其父类名称?
    答:Transform 父类是 Component
    16、简述SkinnedMesh的实现原理?
    SkinnedMesh中文一般称作骨骼蒙皮动画,正如其名,这种动画中包含骨骼(Bone)和蒙皮(Skinned Mesh)两个部分,Bone的层次结构和关节动画类似,Mesh则和关节动画不同:关节动画中是使用多个分散的Mesh,而Skinned Mesh中Mesh是一个整体,也就是说只有一个Mesh,实际上如果没有骨骼让Mesh运动变形,Mesh就和静态模型一样了。Skinned Mesh技术的精华在于蒙皮,所谓的皮并不是模型的贴图,而是Mesh本身,蒙皮是指将Mesh中的顶点附着(绑定)在骨骼之上,而且每个顶点可以被多个骨骼所控制,这样在关节处的顶点由于同时受到父子骨骼的拉扯而改变位置就消除了裂缝。所以Skinned Mesh这个词从字面上理解似乎是有皮的模型。
    参考文档:http://blog.csdn.net/n5/article/details/3105872
    17、 使用Unity3d实现2d游戏,有几种方式?
    a. 使用本身的GUI、UGUI
    b. 把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴
    c. 使用2d插件,如:2DToolKit、NGUI
    18、Unity3d的物理引擎中,有几种施加力的方式,分别描述出来。
    两种:rigidbody.AddForce、rigidbody.AddForceAtPosition
    19、物体自身旋转使用的函数?
    transform.Rotate()
    20、物体绕某点旋转使用函数叫什么?
    transform.RotateAround
    21、Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数
    PlayerPrefs.SetInt()、PlayerPrefs.GetInt()
    官方文档:https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
    22、Unity 脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
    Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
    23、物理更新一般放在哪个系统函数里?
    FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。
    a. FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。
    b. Update就比较适合做控制。
    24、在场景中放置多个Camera并同时处于活动状态会发生什么?
    游戏界面可以看到很多摄像机的混合。
    25、如何销毁一个UnityEngine.Object及其子类?
    使用Destroy()方法。
    26、请描述为什么Unity中会发生在组件上出现数据丢失的情况?
    一般是组件上绑定的物体对象被删除了。
    27、Unity中的碰撞器和触发器的区别?
    碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
    当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数。
    当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
    如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
    28、物体发生碰撞的必要条件。
    两个物体都必须带有碰撞器Collider,其中一个物体还必须带有Rigidbody刚体。
    29、简述四元数Quaternion的作用,四元数对欧拉角的优点?
    四元数用于表示旋转,相对欧拉角的优点:
    a. 能进行增量旋转
    b. 避免万向锁
    c. 给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
    30、OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
    Awake–>OnEnable->Start ,OnEnable在同一周期中可以反复地发生
    31、CharacterController和Rigidbody的区别?
    Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的。
    32、移动相机动作在哪个函数里,为什么在这个函数里?
    LateUpdate,是在所有的Update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
    33、动态加载资源的方式?
    a. Resources.Load();
    b. AssetBundle
    Unity5.x版本后可以选择使用Git: https://github.com/applexiaohao/LOAssetFramework.git
    34、什么叫做链条关节?
    Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
    35、请描述游戏动画有哪几种,以及其原理?
    主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
    a. 关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
    b. 骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
    c. 单一网格模型动画,由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
    36、什么是协同程序?
    在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。
    update 函数返回后将运行正常协程更新。协程是一个可暂停执行 (yield) 直到给定的 YieldInstruction 达到完成状态的函数。
    协程的不同用法:
    yield 在下一帧上调用所有 Update 函数后,协程将继续。
    yield WaitForSeconds 在为帧调用所有 Update 函数后,在指定的时间延迟后继续协程
    yield WaitForFixedUpdate 在所有脚本上调用所有 FixedUpdate 后继续协程
    yield WWW 在 WWW 下载完成后继续。
    yield StartCoroutine 将协程链接起来,并会等待 MyFunc 协程先完成。
    37、Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
    仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用,支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象。
    38、Unity3D的协程和C#线程之间的区别是什么?
    多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity的对象、组件、方法。Unity3d没有多线程的概念,不过Unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine称为协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用Yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
    39、向量的点乘、叉乘以及归一化的意义?
    a. 点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影。
    b. 叉乘得到的向量垂直于原来的两个向量。
    c. 标准化向量:用在只关系方向,不关心大小的时候。
    40、矩阵相乘的意义及注意点。
    用于表示线性变换:旋转、缩放、投影、平移、仿射。注意矩阵的蠕变:误差的积累。
    41、为何大家都在移动设备上寻求U3D原生GUI的替代方案?
    不美观,OnGUI很耗费时间,并且使用不方便。
    42、请简述如何在不同分辨率下保持UI的一致性?
    NGUI可以在不同分辨率下保持UI的一致性,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。
    43、为什么Dynamic Font在Unicode环境下优于Static Font?
    Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
    44、当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
    穿透(碰撞检测失败)
    45、射线检测碰撞物的原理是?
    射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
    46、Unity3D和Cocos2D的区别?
    a. Unity3D 支持C#、javascript等,cocos2d-x 支持C++、Html5、Lua等。
    b. Cocos2D 开源 并且免费。
    c. Unity3D支持iOS、Android、Flash、Windows、Mac、Wii等平台的游戏开发,cocos2d-x支持iOS、Android、WP等。
    47、Unity中,照相机的Clipping Planes的作用是什么?调整Near、Fare两个值时,应该注意什么?
    照相机的Clipping Planes的作用是剪裁平面 。注意从相机到开始渲染和停止渲染之间的距离。
    48、四元数有什么作用?
    对旋转角度进行计算时用到四元数
    49、如何让已经存在的GameObject在LoadLevel后不被卸载掉?

    void Awake()
    {
        DontDestroyOnLoad(transform.gameObject);
    }
    

    50、在编辑场景时将GameObject设置为Static有何作用?
    设置游戏对象为Static将会剔除(或禁用)网格对象当这些部分被静态物体挡住而不可见时。因此,在你的场景中的所有不会动的物体都应该标记为Static。
    51、将图片的TextureType选项分别选为Texture和Sprite有什么区别?
    Sprite作为UI精灵使用,Texture作用模型贴图使用。
    52、Editor编辑器模式下。
    Reset:使用Reset命令初始化脚本属性。
    53、更新函数
    第一帧更新前(初始化),Start:当脚本启用实例后,才会在第一帧更新前调用Start。更新顺序,游戏逻辑、交互、动画、摄像机位置,使用不同事件函数,绝大多数逻辑在Update。
    a. FixedUpdate(物理Physics):固定更新频率,用作于物理渲染。调用此函数之后会执行物理计算和更新,Fixedupdate里计算运动,无需乘以Time.deltaTime,因为已有独立可靠计时器。调用FixedUpdate频率高于Update。
    b. Update:每一帧调用一次Update,帧更新主要函数,执行绝大多数逻辑。
    c. LateUpdate:每一帧在Update调用完毕后,调用LateUpdate。LateUpdate常用用途是跟随第三人称摄像机,保证角色在Update中的移动和旋转,在LateUpdate中执行所有摄像机的移动和旋转计算。确保角色在摄像机跟踪器位置之前已完全移动。
    54、Unity中销毁GameObject的方式,简述Destroy和DestroyImmediate的区别。
    Destroy销毁场景中的物体,但是内存中它还是存在的,只有当内存不够时,机制才会将它销毁并释放内存。而DestroyImmediate会立即将对象销毁,并且将内存释放。
    55、退出时
    在场景中的所有活动对象上调用以下函数: OnApplicationQuit:在退出应用程序之前在所有游戏对象上调用此函数。在编辑器中,用户停止播放模式时,调用函数。 OnDisable:行为被禁用或处于非活动状态时,调用此函数。
    56、实现吊机吊物体的功能。
    吊机吊物体需要节点挂接和坐标系转换
    57、Animation.CrossFade 命令作用是动画的淡入。
    58、调试记录到控制台的命令是什么?
    Debug.Log();
    59、使用原生 GUI 创建一个可以拖动的窗口命令是什么?
    GUI.DragWindow();
    60、LocalPosition 与 Position 的使用区别?
    LocalPosition:自身位置,相对于父级的变换的位置。 Position:在世界坐标 transform的位置
    61、写出 Animation 的五个方法 。
    AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样
    62、如何使子控件居中,如果使用UGUI怎么实现?
    设置子控件锚点为中心
    63、Unity中如何派发事件(消息)?
    在脚本里的Update函数里调用EventDispatcher.Instance().OnTick();
    64、ScriptObject的作用和使用方式?
    ScriptObject类型经常使用于存储一些Unity本身不可以打包的一些object,比如字符串,一些类对象,用这个类型的子类型可以用BuildPipeline打包成assetbundle包共后续使用,非常方便。
    65、如何检测物体是否被其他对象遮挡。
    使用射线进行检测
    66、Unity 连接数据库。
    需要得到 Mono.Data.Sqlite.dll 文件与 System.Data.dll 文件
    67、如何与服务器交互?
    做游戏,基本上都避免不了与服务器端交互,与服务器端交互的方式也有几种,总结起来就是长连接模式(Socket)与短链接模式(Http)。
    68、如何处理网络异常下的可玩性
    a. 为游戏增加单机模式:比如故事模块,网络异常时可以阅读游戏的故事;丰富的技能或卡牌,网络异常时可以了解技能和卡牌;提供单机玩法,玩家可以与AI进行游戏等。
    b. 为游戏提供教程模块,网络异常时可以学习游戏技巧。
    69、怎样反外挂? 对外挂的看法?
    游戏外挂的原理:外挂分为多种,比如模拟键盘的,鼠标的;修改数据包的;修改本地内存的。
    a. 对于模拟用户的鼠标键盘输入的外挂,我们可以用网页上常用的验证码的方式来对付。模拟键盘鼠标的外挂对游戏的影响比加速、修改封包、修改内存、脱机等要小得多,因此被一些人称为绿色外挂。
    b. 让服务器不把在正常情况下玩家看不到的东西的数据传送给客户端。
    c. 把玩家操作记录发到服务器进行模拟,如果和客户端的计算结果偏差较大可以认为作弊。
    70、Unity的应用。
    可以做VR、手游、工艺仿真、端游、页游、实时渲染动画跨平台的游戏引擎。
    71、怎样实现植物的弯曲
    a. max做骨骼动画
    b. 修改Tree组件的Growth Angle的值
    72、什么是状态机,什么是行为树?
    (1) 有限状态机系统:是指在不同阶段会呈现出不同的运行状态的系统,这些状态是有限的、不重叠的。这样的系统在某一时刻一定会处于其所有状态中的一个状态,此时它接收一部分允许的输入,产生一部分可能的响应,并且迁移到一部分可能的状态。
    a. 基本节点是状态:他包含了一系列运行在该状态的行为以及离开这个状态的条件。
    b. 状态可以任意跳转,实现简单,但是对于大的状态机很难维护.状态逻辑的重用性低。
    c. 每一个状态的逻辑会随着一些新状态的增加而越来越复杂。维持状态的数量和状态逻辑复杂性是一个很大的难点。需要合理的分割以及重用状态。
    d. 状态机状态的复用性很差,一旦一些因素变化导致这个环境发生变化。你只能新增一个状态,并且给这个新状态添加连接他以及其他状态的跳转逻辑。
    e. 状态机的跳转条件一旦不满足,就会一直卡在某一个状态。
    (2) 行为树:一个流行的AI技术,涵盖了层次状态机,事件调度,事件计划,行为等一系列技术。
    a. 高度模块化状态,去掉状态中的跳转逻辑,使得状态变成一个“行为”。
    b. “行为”和”行为”之间的跳转是通过父节点的类型来决定的。比如并行处理两个行为,在状态机里面无法同时处理两个状态。
    c. 通过增加控制节点的类型,可以达到复用行为的目的。
    d. 可视化编辑。

  • 相关阅读:
    Android application context/activity context与内存泄露(转)
    Android Slide Menu相关
    android 实现自定义卫星菜单
    关于引用Theme.AppCompat theme的报错问题
    java中volatile关键字的含义
    自定义控件其实很简单1/3
    Android 修改应用程序字体
    Android字体工作原理
    颜色渐变的算法
    Android系统下载管理DownloadManager功能介绍及使用示例
  • 原文地址:https://www.cnblogs.com/AranNice/p/16338365.html
Copyright © 2020-2023  润新知