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

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中。
  • 步骤七:跳转到步骤四。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Maven POM元素解析

这是对Maven中使用的Maven项目描述符的引用。 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/…

列车调度

描述 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入&#xff0c;最后从出口离开。在图中有9趟列…

C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤

前言 我们在查询数据库中数据的时候,有时候需要剔除一些我们不想要的数据,这时候就需要对数据进行过滤,比如学生信息中,我只需要年龄等于18的,类似这种操作,本文就是详细介绍如何对查询的数据进行初步的过滤。 1、等于操作符 本次查询student_age 等于20的数据,使用我…

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve&#xff0c;字面上理解即为参数曲线(Parametric Curve)。在几何建模中&#xff0c;PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看&#xff0c;当给定一个曲面方程&#xff0c;并且其参数u和v是另一个参数t的函数时&#xff…

PyCharm双击无法打开 安装新旧版本pycharm同时启动失败的解决办法

由于2019版本无法直接升级到2023版本 所以下载了两个版本的PyCharm 且两个都是专业版的 一个是2019的&#xff0c; 一个是2024新版的其中2019版本是破解版&#xff01; 然后现在想要打开2024的新版&#xff0c;发现双击无法启动&#xff0c;到文件所在位置打开也无法启动&a…

二维数组及其内存图解

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

如何使用校园网——Win10笔记本,台式机互开热点

当我们使用校园网的时候&#xff0c;往往只能连接一个电脑端&#xff0c;但是又想两个机子同时连接WIFI怎么办呢&#xff1f; 当然&#xff0c;前提条件是你先得其中一台电脑有网络哈 1、打开想开共享热点的电脑的设置 A、点击WIN&#xff0c;再点击设置 2、点击网络和Inte…

论如何在小程序展示超链接在线网页

在工作中遇到一个需求&#xff0c;就是在小程序中展示超链接网页&#xff0c;起初我是直接使用web-view标签 <web-view src"https://www.baidu.com/"/>但是web-view只能在开发阶段手机上展示&#xff0c;一旦小程序发布线上&#xff0c;就会出现下面这种情况“…

每日OJ题_两个数组dp④_力扣44. 通配符匹配

目录 力扣44. 通配符匹配 解析代码 力扣44. 通配符匹配 44. 通配符匹配 难度 困难 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符序列&#xff08;包…

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

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

【Java集合】面试题汇总

Java 集合Java 集合概览1. List, Set, Queue, Map 四者的区别&#xff1f;2. ArrayList 和 Array&#xff08;数组&#xff09;的区别&#xff1f;3. ArrayList 和 Vector 的区别?4. Vector 和 Stack 的区别?&#xff08;了解即可&#xff09;5. ArrayList 可以添加 null 值吗…

ts中的类型简介

注意&#xff1a;尽量不要在ts中用var&#xff0c;不然后续维护代码&#xff0c;容易出现很多问题。 var定义会在全局中生效&#xff0c;而let只会在作用域中起作用。 boolean string number array tuple&#xff08;元组&#xff09; enum&#xff08;枚举&#xff09; null u…

自动驾驶中的传感器融合算法:卡尔曼滤波器和扩展卡尔曼滤波器

自动驾驶中的传感器融合算法&#xff1a;卡尔曼滤波器和扩展卡尔曼滤波器 附赠自动驾驶学习资料和量产经验&#xff1a;链接 介绍&#xff1a; 追踪静止和移动的目标是自动驾驶技术领域最为需要的核心技术之一。来源于多种传感器的信号&#xff0c;包括摄像头&#xff0c;雷达…

想进阶为 Go 语言高级开发工程师吗?那么,一定要阅读此文!

大家好&#xff0c;我是孔令飞&#xff0c;字节跳动云原生开发专家、前腾讯云原生技术专家&#xff1b;《企业级Go项目开发实战》作者&#xff0c;云原生实战营 知识星球星主&#xff1b; 我们知道&#xff0c;Go 出自名门 Google 公司&#xff0c;是一门支持并发、垃圾回收的编…

绝地求生:齐贺PUBG七周年!分享你的游玩感受及反馈赢惊喜道具

PUBG七周年庆典火热进行中&#xff0c;特殊道具、周年主题艾伦格上线&#xff01;七周年期间游玩PUBG&#xff0c;在评论区分享你的游玩感受及反馈&#xff0c;即可参与活动赢取夏日浪潮宝箱奖励。 参与方式 齐贺PUBG七周年&#xff01;在评论区分享分享你的七周年游玩感受及反…

(学习日记)2024.04.09:UCOSIII第三十七节:事件函数接口

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

stable diffusion的从安装到使用

stable-diffusion&#xff0c;一个免费开源的文生图软件&#xff0c;文章主要讲怎么从源码开始安装&#xff0c;以及使用的方式 git地址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui 本人电脑环境win10&#xff0c;软件pycharm&#xff0c;需要提前…

基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 正常图像&#xff1a; checkb位于f192b和f250b之间 多度曝光图像&#xff1a; checkb位于f192b和f250b之外&#xff0c;判决为曝光过度。 2.算法…

k8s_入门_kubelet安装

安装 在大致了解了一些k8s的基本概念之后&#xff0c;我们实际部署一个k8s集群&#xff0c;做进一步的了解 1. 裸机安装 采用三台机器&#xff0c;一台机器为Master&#xff08;控制面板组件&#xff09;两台机器为Node&#xff08;工作节点&#xff09; 机器的准备有两种方式…

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

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