【重点面试题】1、Unity3D中的协程(coroutine),C#线程和进程之间的区别是什么?
简记:协程和线程区别 协程(协同程序Coroutine): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。 Unity提供了StartCoroutine来开启协程,当你在 StartCoroutine 的函数体里处理一段代码时,利用 yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
举个例子:LoadLevelAsync(异步加载关卡)后台加载场景的方法。允许你在后台加载新资源和场景,再利用协同,你就可以在前台用 loading 条或动画提示玩家游戏处于加载中,同时后台协同处理加载的事宜。
进程progress:进程是线程的容器。 线程thread: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理,并发并行。 协程:具体多返回点的方法,时间分片(帧),Unity只能是单线程,只能在主线程调用Api,对象
2、Unity3D 是否支持写成多线程程序?如果支持的话需要注意什么? 支持,如果掌握的Unity多线程的方法,就可以从容的使用多个硬件处理器或处理很难划分管理数据块。 【注意】 1、只能从主线程中访问 Unity3D 的组件,对象和 Unity3D 系统调用 2、如果同时你要处理很多事情或者与 Unity 的对象互动,可以用 thread,可以通过排序来解决一个线程改变一个数据的问题,否则使用协程coroutine。 3、C#中有 lock 这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
【重点面试题】3、OnEnable、Awake、Start 运行时的发生顺序?哪些可能在同一个对象周期中反复的发生? Awake > OnEnable>Start 推荐看脚本生命周期顺序 OnEnable可以在同一周期反复的发生 SetActive(true)就会反复触发OnEnable事件 SetActive(false)就会反复触发OnDisable事件
其中Awake函数一般用于实现单例模式;当脚本被实例化时,调用awake,完成成员变量的初始化,在单例模式中会有一个虚方法OnStart在awake中调用,在实际脚本中重写OnStart方法 OnEnable函数是在游戏对象可以调用时调用; OnDisable是在游戏对象不可用时调用; Start函数则是在场景中显示该游戏对象前调用一次,用于开始设置物体属性和渲染; FixedUpdate函数具有固定更新频率,一般进行游戏对象的物理引擎的更新; Update函数则是渲染帧更新,每秒更新一定频率; LateUpdate函数是延迟更新,只有在每一帧的所有Update函数都执行完了过后才会执行; 而OnGUI函数则是在每一帧更新时调用。
4、Unity3D 如何获知场景中需要加载的数据?如何动态资源加载? instantiate:最简单的一种方式,以实例化的方式动态生成一个物体。
Assetsbundle:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object,unity官方推荐也是绝大多数商业化项目使用的一种方式。
Resource.Load:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中
AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的。
5、Unity中碰撞器(Collider)和触发器(Trigger)的区别? 碰撞器(Collider)有碰撞效果,IsTrigger=false,可以调OnCollisionEnter/Stay/Exit函数
触发器(Trigger)没有碰撞效果,isTrigger=true,可以调用OnTriggerEnter/Stay/Exit函数
6、U3D中,几种施加力的方式,描述出来 首先需要对象要有rigidbody组件 Rigidbody.AddForce /AddForceAtPosition 2D Constant Force Force/Relative Force/Torque
7、物体自旋转使用的函数叫什么?物体绕某点旋转使用函数叫什么? transform.Rotate transform.RotateAround
8、u3d 提供了一个用于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数 PlayerPrefs类是一个本地持久化保存与读取数据的类 PlayerPrefs类支持3中数据类型的保存和读取,浮点型,整形,和字符串型。 分别对应的函数为: SetInt();保存整型数据;GetInt();读取整形数据; SetFloat();保存浮点型数据; GetFlost();读取浮点型数据; SetString();保存字符串型数据; GetString();读取字符串型数据;
9、unity3d 从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法。 (init)Awake>OnEnable>Start > (Physic)FixedUpdate> (GameLogic)Update>Yield >LateUpdate>OnGui>OnDisable>OnDistroy
10、物理更新一般在哪个系统函数里? FixedUpdate,每固定帧绘制时执行一次,和 update 不同的是 FixedUpdate 是渲染帧执行,如果你的渲染效率低下的时候 FixedUpdate 调用次数就会跟着下降。
FixedUpdate 比较适用于物理引擎的计算,因为是跟固定帧渲染有关。 Update 就比较适合做游戏逻辑更新。 LateUpdate比较适合相机更新,update后更新,防止视角移动,游戏对象发生空帧未出现。
11、反向旋转动画的方法是什么? 1.将动画速度调成-1 2.改代码animation.speed=-1
【重点面试题】12、用代码实现第三人称角色控制器?第一人称角色控制器 大致思路: 摄像机与角色的距离范围 摄像机旋转、平移 鼠标控制摄像机 //代码稍后会在博客中贴出,转链接,目前未实现
13、获取、增加、删除组件的命令分别是什么? 获取:GetComponent 增加:AddComponent 删除:Destroy
14、Animation.CrossFade 是什么? 动画淡入淡出
15、Application.LoadLevel 命令作用是什么? 加载关卡,已弃用 现在使用SceneManager.LoadScene
16、调式记录到控制台的命令是什么? Debug.Log();
17、编辑器类存放路径是什么? Asset/Editor
18、使用原生 GUI 创建一个可以拖动的窗口命令是什么? GUI.DragWindow
19、localPosition 与 Position 的使用区别? localPosition :自身坐标系,相对于父级的位置 Position :世界坐标系中的位置
20、Mathf.Round和Mathf.Clamp和Mathf.Lerp含义? Mathf.Round:四舍五入 Mathf.Clamp:左右限值 Mathf.Lerp:插值
【重点面试题】21、写一个计时器工具,从整点开始,格式为00:00:00 分小时、分、秒
22、写出 Animation 的五个方法 AddClip 将 clip 添加到名称为 newName 的动画中。 Blend 在后续 time 秒中将名称为 animation 的动画向 targetWeight 混合。 CrossFade 在后续 time 秒的时间段内,使名称为 animation 的动画淡入,使其他动画淡出。 CrossFadeQueued 使动画在上一个动画播放完成后交叉淡入淡出。 IsPlaying 名称为 name 的动画是否正在播放? PlayQueued 在先前的动画播放完毕后再播放动画。 RemoveClip 从动画列表中移除剪辑。 Sample 对当前状态的动画进行采样。 Stop 停止所有使用该动画启动的正在播放的动画。
23、用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个 Cube 即可) 在场景中添加一个Plan,Camera,Directional Light,Cube。添加两个脚本一个挂在Camera上,另一个挂在Cube上。 1.鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现2.鼠标实现在场景中拖动物体:解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。 具体代码实现:http://www.cnblogs.com/hewencong/p/4299722.html
24、<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法 Vector3 v 代表初速度 v’代表现在的速度, 假设小鸟是沿的 z 轴也就是transform.forward 方向,运动的质量为 m,那么 v‘=v-new Vector3(0,mgt,ft),transform.Translate(v’)做的就是抛物线运动(g 为重力加速度不要用现实中的需要自己调试,f 为阻力也要自己调试 设置,t 为时间)
25、当游戏中需要频繁创建一个物体时,我们需要怎样做能够节省内存? 1.使用预制体对象 2.使用对象池技术
26、碰撞检测需要物体具备什么属性? 能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器
27、如何使子控件居中,如果使用UGUI怎么实现 锚点设置为中心
28、去掉敏感字的程序(手写程序) 字符串replace
29、写出WWW的几个方法 WWW.LoadFromCacheOrDownload:可被用于将Assets Bundles自动缓存到本地磁盘 WWW.Dispose :释放现有的 WWW 对象。 WWW.isDone:是否完成下载?(只读) WWW.progress:下载进度(只读)。
【重点面试题】30、启用MipMaps对内存的影响是?MipMap的作用?如何操作? 增加约33%的内存,1/4 +1/16 Lod相关知识
31、采用Input.mousePosition来获取鼠标在屏幕上的位置 左下角为原点(0,0),右上角为(Screen.Height,Screen.Width)
32、Unity中销毁GameObject的方式,简述Destroy和DestroyImmediate的区别 Destroy销毁消息对象,内存中还是存在,只有内存不够才被清除释放内存 DestroyImmediate立即销毁对象,并释放内存
33、如何检测物体是否被其他对象遮挡 射线检测 EventSystem.IsPointerOverGameObject 是否具有给定 ID 的指针是否位于 EventSystem 对象上
34、UnityAction和UnityFunc的区别 unity中需要带上修饰event,事件与委托密切相关,两行代码变一行代码 public event Action myEvent;
UnityAction本质上就是委托,带泛型参数最多4个,且没有返回值的方法 Action<T1,T2,T3> UnityFunc本质上也是委托,带泛型参数最多4个,可以有返回值的方法 Func<T1,T2,T3,Return>
Action和Func的重要区别: Action只用于没有返回值的方法,Func只用于有返回值的方法 它们泛型里的区别: Action的泛型里要和方法参数的类型相同,且只有一种泛型 Func的泛型里前者和方法参数类型相同,最后一个与返回值类型相同
一般用于回调方法,注册事件,类直接数据交互松耦合 链接: 参考资料.
【重点面试题】35、unity常用资源路径有哪些
//获取的目录路径最后不包含 /
//获得的文件路径开头包含 /
Application.dataPath; //Asset文件夹的绝对路径
//只读
Application.streamingAssetsPath; //StreamingAssets文件夹的绝对路径(要先判断是否存在这个文件夹路径)
Application.persistentData ; //可读写
//资源数据库 (AssetDatabase) 是允许您访问工程中的资源的 API
AssetDatabase.GetAllAssetPaths; //获取所有的资源文件(不包含meta文件)
AssetDatabase.GetAssetPath(object) //获取object对象的相对路径
AssetDatabase.Refresh(); //刷新
AssetDatabase.GetDependencies(string); //获取依赖项文件
Directory.Delete(p, true); //删除P路径目录
Directory.Exists(p); //是否存在P路径目录
Directory.CreateDirectory(p); //创建P路径目录
AssetDatabase //类库,对Asset文件夹下的文件进行操作,获取相对路径,获取所有文件,获取相对依赖项
Directory //类库,相关文件夹路径目录进行操作,是否存在,创建目录,删除等操作
复制
【重点面试题】36、向量的点乘、叉乘以及归一化的意义?、 叉乘cross:可以获得两个向量A和B所构成平面,垂直的向量C,和左手坐标系类似,可以用来判断角色移动方向,判断顺时针还是逆时针旋转
点乘 dot :用来求向量之间的夹角,判断向量是否在同一方向、以及B向量在A向量上的投影
a·b>0 方向基本相同,夹角在0°到90°之间 a·b=0 正交 a·b<0 方向基本相反,夹角在90°到180°之间
归一化normalized:用在只关系方向,不关心大小的情况下