医学类的网站做Google,优化网站怎么做,成都建站提供商,舟山外贸建站公司Unity基础知识
1. Image和RawImage的区别
Image比RawImage更耗性能。Image只能使用sprite属性的图片。而RawImage什么都可以使用
2. Unity3D中的碰撞器Collider和触发器Trigger的区别
碰撞器是触发器的载体#xff0c;而触发器是碰撞器上的一个属性。
如果IsTrigger为fal…Unity基础知识
1. Image和RawImage的区别
Image比RawImage更耗性能。Image只能使用sprite属性的图片。而RawImage什么都可以使用
2. Unity3D中的碰撞器Collider和触发器Trigger的区别
碰撞器是触发器的载体而触发器是碰撞器上的一个属性。
如果IsTrigger为false碰撞器根据物理引擎引发碰撞产生碰撞的效果
如果IsTrigger为true碰撞器被物理引擎忽略没有碰撞的效果
碰撞器汽车被撞飞
触发器检测一个物体是否经过空间中某个区域比如人站在靠近门的位置门自动打开
3. 物体发生碰撞的必要条件
两个物体都需要带碰撞器Collider并且其中一个物体必须带有Rigidbody刚体。
4. 触发器事件执行的条件
两个物体都带有碰撞器Collider并且至少带有一个刚体且至少有一个物体打开了触发器。
5. 四元素Quaternion的作用相比欧拉角的优点
四元素可以用来表示旋转。
而欧拉角会出现万向锁问题所以四元素可以避免万向锁。但比欧拉角理解上更复杂。
6. 如何安全的在不同工程间安全地迁移asset数据
将Assets和Library一起迁移导出包package使用unity自带的asset Server功能
7. Unity的事件函数、生命周期 Awake Awake为场景加载时会调用的函数。其始终会在任何Start函数之前并在实例化Prefab之后调用Awake函数。如果游戏对象在启动期间处于非活动状态则在激活之后才会调用 Awake。可以用于初始化任何变量和游戏状态。 注意 在生命周期中只会调用一次在任何Start之前调用。Objects之间Awake函数的调用没有先后顺序规定。 OnEnable 这个函数在启用激活对象后会立即调用这和Awake的区别在于Awake只会调用一次但是OnEnable会在Object从inactive状态转变为active状态时重新调用。 Start 在启用脚本实例后在第一次帧Update之前调用Start函数。对于添加到场景中的对象在为任何脚本调用 Update 等函数之前将在所有脚本上调用 Start 函数。 Update 每一帧调用一次Update用于帧更新的主要函数。 FixedUpdate 调用 FixedUpdate 的频度常常超过 Update。如果帧率很低可以每帧调用该函数多次如果帧率很高可能在帧之间完全不调用该函数。 OnGUI 系统调用 OnGUI 来渲染和处理 GUI 事件。 OnDisable 和OnEnable为一对当inactive时调用。 OnDestroy 当MonoBehaviour将被销毁时被调用。
事件函数执行顺序为Awake() - OnEnable() - Start() - Update() 假如我们在运行过程中手动inative object然后再active这个object会发现它会重新调用OnEnable()。
8. MeshRender中material和shaderdMaterial的区别
修改sharedMaterial将改变所有物体使用这个材质的外观同时也改变存储在工程里的材质设置。
而如果只想修改某个材质使用material不推荐使用shaderdMaterial
9. Unity提供了几种光源
平行光源 Directional Light点光源 Point Light聚光灯 Spot Light区域光源 Area Light
10. 对象池是什么
对象池就是存放需要被反复创建销毁的一个Pool比如游戏中大量重复的敌人、子弹等等。
11. CharacterController和Rigidbody的区别
Rigidbody具有完全真实物理的特性而CharacterController可以说是受限的Rigidbody具有一定的物理效果但不完全真实。
12. LateUpdate函数是什么
它是在所有Update函数执行完毕后被调用的通常用于处理相机的跟随逻辑。由于相机的跟随操作需要在游戏物体的移动之后进行所以将相机的跟随逻辑放在LateUpdate函数中可以确保相机始终能够跟随游戏物体。
13. Prefab的作用
预制件允许创建、配置和存储游戏对象及其所有组件、属性值和子游戏对象作为可重用资源。Prefab相当于一个模板在此模板的基础之上可以在场景中创建新的预制件实例。但是不代表所有预制件实例都是完全相同的可以有预制件的变体。
14. 优化移动性能的做法
优化移动游戏性能来自Unity顶级工程师的性能分析、内存与代码架构小贴士 - 技术专栏 - Unity官方开发者社区
性能分析 Unity Profile 使用Unity Profiler来准确找到卡顿的问题来源。 Profiler Analyzer 该工具可以汇总多帧Profiler数据由用户来挑选出那些问题较大的帧 为每一帧设定一个时间预算 理想情况下一个以30 fps运行的应用每帧应占有约33.33毫秒1000毫秒/30帧。同样地60 fps每帧约为16.66毫秒。 设备温度优化 对于移动设备而言长时间占用最大时间预算可能会导致设备过热操作系统可能会启动CPU与GPU降频保护。建议每帧仅占用约65%的时间预算保留一定的散热时间。常见的帧预算为30 fps为每帧22毫秒60 fps为每帧11毫秒。在进行性能分析前后预留10-15分钟用于设备散热 分清GPU与CPU依赖程度
内存分析 Memory Profiler Memory Profiler可以截取托管数据堆内存的状态帮助识别出数据碎片化和内存泄漏等问题 减少GC优化代码来减少GC 定时处理GC 可以使用System.GC.Collect来启动垃圾数据收集使用增量式垃圾回收Incremental GC分散垃圾回收。
编程与代码架构 深入理解Unity PlayerLoop和生命周期 降低每帧的代码量 避免在Start/Awake中加入繁重的逻辑 避免加入空事件 删除Debug Log语句 使用哈希值、避免字符串 选择正确的数据结构 避免在运行时添加组件 缓存GameObjects和组件 调用GameObject.Find、GameObject.GetComponent和Camera.main2020.2以下的版本会产生较大的运行负担因此这些方法不适合在Update中调用而应在Start中调用并缓存。 使用对象池
15. 动态加载资源的方法
Resources只能加载Resources目录中的资源AssetBundle只能加载AB资源当前设备允许访问的路径都可以WWW可以加载任意处资源包括项目外资源如远程服务器AssetDatabase只能加载Assets目录下的资源但只能用于EditorUnityWebRequest可以加载任意处资源是WWW的升级版本
16. 使用Unity3d实现2d有几种方式
使用本身UGUI.把摄像机的投影改为正交投影,不考虑Z轴.使用Untiy自身的2D模式.使用2D TooKit插件.
17. 在物体发生碰撞的整个过程中有几个阶段
OnCollisionEnterOnCollisionStayOnCollisionExit
18. Unity3d中有几种施加力的方式 Rigidbody.AddForce(Vector3ForceMode)给刚体添加一个力让刚体按世界坐标系进行运动 Rigidbody.AddRelativeForce(Vector3ForceMode)给刚体添加一个力让刚体按自身坐标系进行运动
19. 物体自身旋转用什么函数
transform.Rotate()
20. 物理更新一般放在什么事件函数内
物理引擎也采用与帧渲染类似的方式以离散时间步骤进行更新。在每次物理更新之前都会调用一个称为 FixedUpdate 的单独事件函数。由于物理更新和帧更新不会以相同频率进行所以如果将物理代码放在 FixedUpdate 函数而不是 Update 中此代码将产生更准确的结果。
21. 在场景中放置多个Camera并同时处于活动状态会发生什么
在一个场景中往往虽然有一个Camera有时就够了但有些场景下可能需要多个Camera。
首先第一个场景就是很多人最熟悉的吃鸡游戏它就存在第一人称和第三人称两个视角的切换那么我觉得实现原理其实是很简单的通过两个摄像机挂载到不同位置比如第一人称就把CameraA挂载到大概人的胸前的位置第三人称的话就把CameraB挂载到人头顶斜上的一个位置上这样如果通过某个按键切换人称就将CameraA和CameraB的enabled状态都切换一下成它的逆状态就可以了。
那么如果有多个摄像机同时enable呢那同一时刻其实只能看到一个摄像机的画面通过Camera的depth属性谁最高来判断显示哪个画面。
不过还有一个场景也是很常见的——画中画比如赛车游戏中会有一个第一人称前向的视角而画面上还会有一个后视镜的视角那么可以使用摄像机的 Viewport Rect 属性来设置摄像机在屏幕上的矩形的大小。并且需要调整较小视图Camera的depth要大于较大视图Camera的depth规则是具有较高 depth 值的摄像机的渲染画面会覆盖在较低值摄像机的渲染画面之上这样就像一本小书叠放在一本大书上面一样。
22. 动画有哪几种及其原理
序列帧动画通过快速播放一系列图片产生动画的效果类似于 Gif一样关节动画把角色分成若干独立部分一个部分对应一个网格模型部分的动画连接成一 个整体的动画角色比较灵活骨骼动画应用最广泛的动画结合上面两种动画形式内部骨骼外部蒙皮
23. LOD是什么优缺点是什么
LOD(Level of detail) 多层次细节可以获得高效渲染效率但增加了内存。
24. MipMap是什么作用
mip或mip级别是具有特定分辨率的纹理版本。mip存在于称为mipmaps的集合中。在GPU以低于其全分辨率渲染纹理的情况下Mipmaps可以加快渲染操作并减少渲染锯齿。
25. IL2CPP是什么
IL2CPP (Intermediate Language To C) 是一种由 Unity 开发的脚本后端可在为各种平台构建项目时替代 Mono。使用 IL2CPP 构建项目时Unity 会在为所选平台创建本机二进制文件例如 .exe、apk、.xap之前将脚本和程序集内的 IL 代码转换为 C。IL2CPP 的一些用途包括提高 Unity 项目的性能、安全性和平台兼容性。
26. Unity 是否支持多线程程序
Unity支持多线程的使用可以使用C#的Thread类来创建和管理线程只需要引入这个类 但需要注意的是在Unity中只有主线程也称为渲染线程可以访问Unity对象如GameObject、Transform等如果在其他线程中访问这些对象会导致不可预期的结果。
27. Unity中协程
如果不想再update单帧执行某个动作那么可以使用协程。
协程就像一个函数能够暂停执行并将控制权返还给 Unity然后在下一帧继续执行。
协程本质上是一个用返回类型 IEnumerator 声明的函数并在主体中的某个位置包含 yield return 语句。yield return null 行是暂停执行并随后在下一帧恢复的点。
28. 渲染顺序 29. Draw Call、Batch、SetPassCall的区别 DrawCall DrawCall是一个CPU命令GPU渲染的操作 Batch 把数据加载到显存设置渲染状态CPU调用GPU渲染的过程称之为一个Batch。可以理解为DrawCall值。一个batch至少包含一个DrawCall。 SetPassCall 渲染 pass 的数量。每个 pass 都需要 Unity 运行时绑定一个新的着色器。 Shader脚本中一个Pass语义块就是一个完整的渲染流程一个着色器可以包含多个Pass语义块每当GPU运行一个Pass之前就会产生一个SetPassCall所以可以理解为一次完整的渲染流程次数
30. 10000个monobehavior每个各自执行update和放到一个update里执行哪个效率更高为什么
放到一个Update里执行效率更高。
31. World坐标系和Local坐标系 世界坐标系 它是一个绝对位置世界坐标是物体在整个场景中的坐标当某个物体没有父物体时它坐标就是世界空间下的坐标。 相对坐标系 当物体有父物体时它transform中坐标就是local坐标 32. 什么是万向锁问题 由于欧拉角不同的 旋转顺序会导致不同的结果如x-y-z和x-z-y而欧拉角旋转就会造成万向锁现象如果按照y轴旋转90度后z轴也会跟着旋转与x轴重合那么旋转z轴和x轴效果是一样的。物体丢失了一个自由度。 那么可以把最不可能旋转90度的轴放在旋转顺序的中间。 33. Unity渲染队列有哪些 Background 1000 在任何其他队列之前被渲染通常使用它来渲染那些需要绘制在背景上的物体。 Geometry 2000 默认的渲染队列不透明物体。 AlphaTest 2450 需要透明度测试的物体使用这个物体。 Transparent 3000 在所有Geometry和AlphaTest物体渲染后再按从后往前的顺序进行渲染任何使用透明度混合的都应该使用该队列。 Overlay 4000 用于实现一些叠加效果任何需要在最后渲染的物体都应该使用该队列。
34. 凹多边形的三角剖分算法
步骤一将Polygon的所有点取出来放到数组V中。步骤二判断Polygon是否为凸多边形如果是则按凸多边形三角剖分算法Delaunay德罗内三角算法处理。否则到步骤三。步骤三将所有顶点的序号读入一个数组A中保存起来然后遍历多边形的顶点判断每个顶点是否为“耳朵节点”然后将所有“耳朵节点”保存到数组B。步骤四如果耳朵节点数组B为空或者顶点数组V的顶点数组小于三则算法结束。否则取出耳朵节点中的第一个顶点P来。步骤五找到该节点的前序节点M和后序节点N这三个点MPN组成一个三角形保存到结果数组R中然后把当前顶点P从耳朵节点中去掉从数组V中去掉从序号数组B中去掉。步骤六前序节点M和后序节点N成为了“耳朵节点”的候选。则分别判断M与N是不是耳朵节点如果是耳朵节点且没有在当前的耳朵节点数组B中则将判断为耳朵节点的点放入耳朵节点数组B中。步骤七跳转到步骤四。