Unity面经(自整)——Unity基础知识

news2024/10/7 2:28:27

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数据?

  1. 将Assets和Library一起迁移
  2. 导出包package
  3. 使用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提供了几种光源?

  1. 平行光源 Directional Light
  2. 点光源 Point Light
  3. 聚光灯 Spot Light
  4. 区域光源 Area Light

10. 对象池是什么?

对象池就是存放需要被反复创建销毁的一个Pool,比如游戏中大量重复的敌人、子弹等等。

11. CharacterController和Rigidbody的区别?

Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不完全真实。

12. LateUpdate函数是什么

它是在所有Update函数执行完毕后被调用的,通常用于处理相机的跟随逻辑。由于相机的跟随操作需要在游戏物体的移动之后进行,所以将相机的跟随逻辑放在LateUpdate函数中可以确保相机始终能够跟随游戏物体。

13. Prefab的作用

预制件允许创建、配置和存储游戏对象及其所有组件、属性值和子游戏对象作为可重用资源。Prefab相当于一个模板,在此模板的基础之上可以在场景中创建新的预制件实例。但是不代表所有预制件实例都是完全相同的,可以有预制件的变体。

14. 优化移动性能的做法

优化移动游戏性能:来自Unity顶级工程师的性能分析、内存与代码架构小贴士 - 技术专栏 - Unity官方开发者社区

性能分析

  1. Unity Profile

    使用Unity Profiler来准确找到卡顿的问题来源。

  2. Profiler Analyzer

    该工具可以汇总多帧Profiler数据,由用户来挑选出那些问题较大的帧

  3. 为每一帧设定一个时间预算

    理想情况下,一个以30 fps运行的应用每帧应占有约33.33毫秒(1000毫秒/30帧)。同样地,60 fps每帧约为16.66毫秒。

  4. 设备温度优化

    对于移动设备而言,长时间占用最大时间预算可能会导致设备过热,操作系统可能会启动CPU与GPU降频保护。建议每帧仅占用约65%的时间预算,保留一定的散热时间。常见的帧预算为:30 fps为每帧22毫秒,60 fps为每帧11毫秒。在进行性能分析前后,预留10-15分钟用于设备散热

  5. 分清GPU与CPU依赖程度

内存分析

  1. Memory Profiler

    Memory Profiler可以截取托管数据堆内存的状态,帮助识别出数据碎片化和内存泄漏等问题

  2. 减少GC:优化代码来减少GC

  3. 定时处理GC

    可以使用System.GC.Collect来启动垃圾数据收集;使用增量式垃圾回收(Incremental GC)分散垃圾回收。

编程与代码架构

  1. 深入理解Unity PlayerLoop和生命周期

  2. 降低每帧的代码量

  3. 避免在Start/Awake中加入繁重的逻辑

  4. 避免加入空事件

  5. 删除Debug Log语句

  6. 使用哈希值、避免字符串

  7. 选择正确的数据结构

  8. 避免在运行时添加组件

  9. 缓存GameObjects和组件

    调用GameObject.Find、GameObject.GetComponentCamera.main(2020.2以下的版本)会产生较大的运行负担,因此这些方法不适合在Update中调用,而应在Start中调用并缓存。

  10. 使用对象池

15. 动态加载资源的方法

  • Resources(只能加载Resources目录中的资源)
  • AssetBundle(只能加载AB资源,当前设备允许访问的路径都可以)
  • WWW(可以加载任意处资源,包括项目外资源(如远程服务器))
  • AssetDatabase(只能加载Assets目录下的资源,但只能用于Editor)
  • UnityWebRequest(可以加载任意处资源,是WWW的升级版本)

16. 使用Unity3d实现2d,有几种方式

  1. 使用本身UGUI.
  2. 把摄像机的投影改为正交投影,不考虑Z轴.
  3. 使用Untiy自身的2D模式.
  4. 使用2D TooKit插件.

17. 在物体发生碰撞的整个过程中,有几个阶段

  • OnCollisionEnter
  • OnCollisionStay
  • OnCollisionExit

18. Unity3d中有几种施加力的方式?

  • Rigidbody.AddForce(Vector3,ForceMode):给刚体添加一个力,让刚体按世界坐标系进行运动

  • Rigidbody.AddRelativeForce(Vector3,ForceMode):给刚体添加一个力,让刚体按自身坐标系进行运动

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. 动画有哪几种,及其原理?

  1. 序列帧动画:通过快速播放一系列图片产生动画的效果,类似于 Gif一样
  2. 关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一 个整体的动画,角色比较灵活
  3. 骨骼动画:应用最广泛的动画,结合上面两种动画形式,内部骨骼,外部蒙皮

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. 渲染顺序

image-20240331161317088

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坐标系

34. 凹多边形的三角剖分算法

  • 步骤一:将Polygon的所有点取出来放到数组V中。
  • 步骤二:判断Polygon是否为凸多边形,如果是则按凸多边形三角剖分算法(Delaunay德罗内三角算法)处理。否则到步骤三。
  • 步骤三:将所有顶点的序号读入一个数组A中保存起来,然后遍历多边形的顶点,判断每个顶点是否为“耳朵节点”,然后将所有“耳朵节点”保存到数组B。
  • 步骤四:如果耳朵节点数组B为空或者顶点数组V的顶点数组小于三,则算法结束。否则,取出耳朵节点中的第一个顶点P来。
  • 步骤五:找到该节点的前序节点M和后序节点N,这三个点MPN组成一个三角形,保存到结果数组R中,然后,把当前顶点P从耳朵节点中去掉,从数组V中去掉,从序号数组B中去掉。
  • 步骤六:前序节点M和后序节点N,成为了“耳朵节点”的候选。则分别判断M与N是不是耳朵节点,如果是耳朵节点,且没有在当前的耳朵节点数组B中,则将判断为耳朵节点的点放入耳朵节点数组B中。
  • 步骤七:跳转到步骤四。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Map接口及其实现类及常用方法

1.Map接口及其实现类 java.util.Map : 存储一对一对的数据(key-value键值对)|----->HashMap : 主要实现类,线程不安全,效率高,可以添加null的键值对;底层使用数组单向链表红黑树。|------->LinkedHashMap : 是HashMap的子类,在HashMap的数据结构的基础上,添加了一对双向…

222222222222222222222222

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

低温漂、低功耗电压基准,用在精密数据采集系统,供电类设备,工业仪表,测试设备等领域

MSR015/MSR025 是低温漂、低功耗、高精度 CMOS 电压基准, 具有 0.05% 初始精度、低功耗特点。该器件的低输出电压迟滞和低长期输出电压 漂移特性,进一步提高稳定性和系统可靠性。 此外,器件的小尺寸和低运行 电流特性使其非常适合便携…

吴恩达深度学习笔记:深层神经网络(Deep Neural Networks)4.5-4.8

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第四周:深层神经网络(Deep Neural Networks)4.5 为什么使用深层表示?(Why deep representations?) 第一门课:神经网络和深度学习 (…

若依ts版本(vue3+element plus+ts)

1、项目简介 本项目参考若依前后端分离版,前端由[若依vue3]改写为ts版本[ruoyi-web-vue3-ts],后端对[若依V3.8.7]进行了修改[后端版本分支vue3.ts.3.8.7],具体文档参见[若依官方文档]。本项目对部分代码做了优化,增加了activiti7…

二维数组及其内存图解

二维数组 在一维数组的介绍当中曾说,数组中可以储存任何同类型的元素,那么这个元素是不是可以也是数组呢?答案是可以,即在数组之中储存数组元素。这种情况就是多维数组,当一个数组中的元素是数组时叫做二维数组&#x…

公网环境下如何端口映射?

公网端口映射是一种网络技术,它允许将本地网络中的设备暴露在公共互联网上,以便能够从任何地方访问这些设备。通过公网端口映射,用户可以通过互联网直接访问和控制局域网中的设备,而无需在本地网络中进行复杂的配置。 公网端口映射…

自动驾驶---Motion Planning之STSC轨迹优化

1 背景 在之前的博客《自动驾驶---Motion Planning之构建SLT Driving Corridor》中,为读者讲解了SLT图构建的思路---通过构建Driving Corridor的方式确定SL两个方向的boundary。但是并没有去详细讲解如何去构造优化问题,以及如何去生成最终的轨迹,所以本篇博客将继续为读者讲…

如果用大模型考公,kimi、通义千问谁能考高分?

都说大模型要超越人类了,今天就试试让kimi和通义千问做公务员考试题目,谁能考高分? 测评结果再次让人震惊! 问题提干:大小两种规格的盒装鸡蛋,大盒装23个,小盒装16个,采购员小王买了…

libVLC 音频立体声模式切换

在libVLC中,可以使用libvlc_audio_set_channel函数来设置音频的立体声模式。这个函数允许选择不同的音频通道,例如立体声、左声道、右声道、环绕声等。 /*** Set current audio channel.** \param p_mi media player* \param channel the audio channel…

【webrtc】源码下载与编译

目录 下载 下依赖 参考文章 : 下载 (1) windows ,centos上都会报错 (2) ubuntu A : 在git上设置代理 B fetch通过 ubuntu的界面 proxy设置了代理 这将会拉取webRTC源码,且额外加了android相关的依赖,例如And…

MySQL·库的操作

目录 数据库的增加 字符集和校验规则 显示的指明字符集和校验规则 校验规则对数据库的影响 数据库的删除 数据库的查看 显示创建语句 数据库的修改 数据库的备份与恢复 备份 恢复 注意事项 查看连接情况 数据库的增加 CREATE DATABASE [IF NOT EXISTS] db_name [cr…

【神经网络】卷积神经网络CNN

卷积神经网络 欢迎访问Blog全部目录! 文章目录 卷积神经网络1. 神经网络概览2.CNN(Convolutional Neunal Network)2.1.学习链接2.2.CNN结构2.2.1.基本结构2.2.1.1输入层2.2.1.2.卷积层|Convolution Layers2.2.1.3.池化层|Pooling layers2.3…

【Entity Framework】EF连接字符串和模型

【Entity Framework】EF连接字符串和模型 文章目录 【Entity Framework】EF连接字符串和模型一、概述二、使用 Code First 按约定创建连接三、使用 Code First 和指定的数据库名称按约定创建连接四、将 Code First 与 app.config/web.config 文件中的连接字符串结合使用五、将 …

软件设计师——数据库

数据库 三级模式两级映像关系模型基本术语关系模型中的关系完整性约束 三级模式两级映像 概念模式(也称模式)对应基本表 外模式(也称用户模式或子模式)对应视图 内模式(也称存储模式)对应存储文件 两级映像…

下载python电子书

下面展示一些 内联代码片。 import requests from lxml import etree from urllib import parse from pprint import pprint from tqdm import tqdm class PythonBook: def init(self): self.url“https://m.jb51.net/books/list476_1.html” self.url_page“https://m.jb51.n…

编译Nginx配置QUIC/HTTP3.0

1. 安装BoringSSL sudo apt update sudo apt install -y build-essential ca-certificates zlib1g-dev libpcre3 \ libpcre3-dev tar unzip libssl-dev wget curl git cmake ninja-build mercurial \ libunwind-dev pkg-configgit clone --depth1 https://github.com/google/b…

el-cascader的懒加载模式怎么设置默认值

点击修改会跳出一个dialog&#xff0c;dialog需要显示信息&#xff0c;其中地址使用el-cascader标签并使用懒加载实现&#xff0c;地址数据都是从后台获取&#xff0c;如果直接使用v-model绑定默认值&#xff0c;会不显示。 解决方法1&#xff1a; <el-cascader class&quo…

Docker之数据卷和Dockerfile

目录 一、Docker数据管理 二、数据卷 创建数据卷 查看数据卷 删除数据卷 挂载数据卷 三、数据卷容器 创建数据卷容器 测试数据卷容器 备份数据卷容器 还原数据卷容器 四、Dockerfile 什么是Dockerfile 基本结构 常用指令 快速入门 编写Dockerfile文件 构建镜…

OneFlow深度学习框架:技术优势与功能特点

文章目录 一、概要二、核心技术优势2.1、分布式训练2.2、极致性能2.3、端到端的智能数据平台2.4、开放灵活的算法支持2.5、跨平台支持 三、功能特点四、OneFlow与TensorFlow对比四、安装OneFlow五、总结 一、概要 OneFlow是一款基于Python的开源深度学习框架&#xff0c;旨在实…