Unity3D面试总结(二)

本文总结了Unity3D面试中的高频问题,包括渲染管道、内存优化、动态加载资源、协同程序、常用插件、2D游戏实现方式、碰撞器与触发器的区别等。还涉及游戏开发中的资源管理、物理引擎、光照计算、LOD技术、阴影判断方法、动画原理、组件操作等核心概念。此外,还探讨了Unity3D的多线程支持、协程与C#线程的区别以及面向对象设计原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最先执行的方法是:

1、(激活时的初始化代码)Awake,2、Start、3、Update【FixUpdate、LateUpdate】、4、(渲染模块)OnGUI、5、再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy

 

高频问答的问题:

1.什么是渲染管道?

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

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

主要步骤有:

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

2.如何优化内存?

有很多种方式,例如

A、压缩自带类库;

B、将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;

C、释放AssetBundle占用的资源;AssetBundle资源包

D、降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;

E、使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

3.动态加载资源的方式?(有时候也问区别,具体请百度)

1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。Resources.Load();

2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。AssetBundle

3.通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的【AssetDatabase 资源数据库】

区别:Resources的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以unity推荐的方式是不用它,都用bundle的方式替代,把资源达成几个小的bundle,用哪个就load哪个,这样还能分包发布和patch,但是在开发过程中,不可能没更新一个资源就打一次bundle,所以editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,在不同的环境下做不同实现。

动态资源的存放

  有时我需要存放一些自己的文件在磁盘上,例如我想把几个bundle放在初始的安装里, unity有一个streaming asset的概念,用于提供存储接口的访问。我们需要在编辑器建立一个StreamingAssets名字的文件夹,把需要我们放在客户磁盘上的动态文件放在这个文件夹下面,这样安装后,这些文件会放在用户磁盘的指定位置,这个位置可以通过Application.streamingAssetsPath来得到。

 

4.什么是协同程序?

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

5.你用过哪些插件?

一 界面制作 推荐:NGUI

二 2D游戏制作 推荐:2D Toolkit   //[ˈtu:lkɪt] 工具包,工具箱

三 可视化编程 推荐:PlayMaker

四 插值插件 推荐:iTween,HOTween

五 路径搜寻 推荐:Simple Path

六 美术及动画制作 推荐:RageSpline,Smooth Moves

七 画面增强    推荐:Bitmap2Material,Strumpy Shader Editor

八 摄像机管理  推荐:Security Camera

九 资源包  推荐:Nature Pack 

十、造路插件EasyRoads3D

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

1.使用本身的GUI;

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

//[ˌɔ:θə'ɡræfɪk] adj. 正字法的,拼字正确的;正射

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

 

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

触发器只是碰撞器身上的一个属性,碰撞器是触发器的载体。

碰撞器有碰撞的效果,IsTrigger=false,可以调用OnCollisionEnter/Stay/Exit函数;

{[kəˈlɪʒn]n. 碰撞;冲突;(意见,看法)的抵触;(政党等的)倾轧}

触发器没有碰撞效果,IsTrigger=true,可以调用OnTriggerEnter/Stay/Exit函数。

a.如果不想让碰撞检测影响物体移动但是又想检测到碰撞这时用到触发器(Trigger)

b.触发器用来检测一个物件是否经过空间中的某个区域 

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

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

 

8.1 .CharacterController和Rigidbody的区别?

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

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

[CharacterController:角色控制器]

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

 

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

三个阶段

1.OnCollisionEnter(进入碰撞) 2.OnCollisionStay (逗留碰撞) 3.OnCollisionExit(当退出碰撞) 

 

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

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

 

11.什么叫做链条关节?

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

{ [hɪndʒ] n. 铰链,折叶;关键,转折点;枢要,中枢}

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

Transform.Rotate()

 

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

Transform.RotateAround()

 

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

PlayerPrefs.SetInt() PlayerPrefs.GetInt()

 

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

四种。

平行光:Directional Light 点光源:Point Light

聚光灯:Spot Light 区域光源:Area Light

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值