Unity面试题加强版之三Unity脚本基础

unity超全面试题,掌握轻轻松松拿Offer,码住学习

107.Unity3D中的协程(coroutine)和C#线程之间的区别是什么?
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问 Unity3D 的对象、组件、方法。
Unity3d 没有多线程的概念,不过 unity 也给我们提供了 StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine 为什么叫协同程序呢,所谓协同,就是当你在 StartCoroutine 的函数体里处理一段代码时,利用 yield 语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而 LoadLevelAsync 则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用 loading 条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜

108.简述 Unity3D 支持的作为脚本的语言的名称
Unity 的脚本语言基于 Mono 的.Net 平台上运行,可以使用.NET 库,这也为 XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity 里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
JavaScript:和网页中常用的 JavaScript 不一样,它编译后的运行速度很快,语法方面也会有不少区别。
C#
Boo:可以看做是 Python 语言的变种,又糅合了 Ruby 和 C#的特性,它是静态类型语言

109.Unity3D 是否支持写成多线程程序?如果支持的话需要注意什么?
仅能从主线程中访问 Unity3D 的组件,对象和 Unity3D 系统调用

110.支持:如果同时你要处理很多事情或者与 Unity 的对象互动小可以用 thread,否则使用coroutine。
注意:C#中有 lock 这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

111.OnEnable、Awake、Start 运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
Awake —>OnEnable—>Start
OnEnable 在同一周期中可以反复地发生

112.请简述 OnBecameVisible 及 OnBecameInvisible 的发生时机,以及这一对回调函数的意义?
当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。

113.Unity3D 如何获知场景中需要加载的数据?
Resource.Load
AssetBundle.Load

114.物体发生碰撞时,有几个阶段,分别对应的函数
三个阶段,OnCollisionEnter/Stay/Exit 函数

115.u3d 中,几种施加力的方式,描述出来
rigidbody.AddForce/AddForceAtPosition,都是 rigidbody 的成员函数

116.物体自旋转使用的函数叫什么
transform.Rotate

117.物体绕某点旋转使用函数叫什么
transform.RotateAround

118.u3d 提供了一个用于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数
PlayerPrefs.SetInt 与 PlayerPrefs.GetInt

119.unity3d 从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法
Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –>OnGUI –> Reset –> OnDisable –> OnDestroy

120.物理更新一般在哪个系统函数里?
FixedUpdate,每固定帧绘制时执行一次,和 update 不同的是 FixedUpdate 是渲染帧执行,如果你的渲染效率低下的时候 FixedUpdate 调用次数就会跟着下降。FixedUpdate 比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update 就比较适合做控制。

121.移动相机动作在哪个函数里,为什么在这个函数里。
LateUpdate,,是在所有 update 结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有 update 操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

122.为什么 u3d 会出现组件上数据丢失的情况
一般是组件上绑定的物体对象被删除了

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

124.反向旋转动画的方法是什么?
反转动画,讲动画的速度调到-1,碰撞时,被碰撞物体与碰撞物体有collider 组件,碰撞物体有刚体组件,或角色碰撞得包含角色组件 OR 改变 animation.speed

125.用代码实现第三角色控制器

public class Player : MonoBehaviour {public Transform _cameraTrans;private Vector3 _cameraOffset;void Awake() {_cameraOffset = transform.position - _cameraTrans.position;}void Update() {_cameraTrans.position = transform.position - _cameraOffset;}
}

126.实现吊机吊物体的功能
吊机吊物体需要节点挂接和坐标系转换

127.获取、增加、删除组件的命令分别是什么
获取:GetComponent
增加:AddComponent
删除:Destroy

128.Animation.CrossFade 命令作用是:C
A.动画放大 B.动画转换 C.动画的淡入为其他动画

129.Application.loadLevel 命令为:A
A.加载关卡 B.异步加载关卡 C.加载动作

130.调试记录到控制台的命令是什么?
Debug.Log();

131.编辑器类存放路径是什么?
工程目录下的 Assets/Editor 文件夹下。

132.使用原生 GUI 创建一个可以拖动的窗口命令是什么?
GUI.DragWindow();

133.localPosition 与 Position 的使用区别?
localPosition:自身位置,相对于父级的变换的位置。 Position:在世界坐标 transform的位置

134.Mathf.Round, Mathf.Clamp, Mathf.Lerp的含义

Mathf.Round 四舍五入
Mathf.Clamp 限制
Mathf.Lerp 插值

135.写一个计时器工具,从整点开始计时,格式为:00:00:00

private float timer = 0f;
private int h = 0;
private int m = 0;
private int s = 0;
private string timeStr = string.Empty;
void Update () {timer += Time.deltaTime;if (timer >= 1f) {s++;  timer = 0;}if (s >= 60) {m++;s = 0;}
if (m >= 60) {h++;m = 0;}if (h >= 99) {h = 0;}
}
void OnGUI(){timeStr = string.Format ("{0:D2}:{1:D2}:{2:D2}", h, m, s);GUI.Label (new Rect (10, 10, 100, 200), timeStr);
}

136.写出 Animation 的五个方法
AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样

137.用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个 Cube 即可)。
在场景中添加一个Plan,Camera,Directional Light,Cube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。
**1.鼠标滚轮实现缩放:**将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:

void Update () {//鼠标滚轮的效果if (Input.GetAxis("Mouse ScrollWheel") < 0) {if (Camera.main.fieldOfView <= 100)Camera.main.fieldOfView += 2;if (Camera.main.orthographicSize <= 20)Camera.main.orthographicSize += 0.5F;}//Zoom inif (Input.GetAxis("Mouse ScrollWheel") > 0) {if (Camera.main.fieldOfView > 2)Camera.main.fieldOfView -= 2;if (Camera.main.orthographicSize >= 1)Camera.main.orthographicSize -= 0.5F;}
}

2.鼠标实现在场景中拖动物体:
  解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理
主要代码如下:

// Use this for initialization
void Start () {StartCoroutine(OnMouseDown());
}
IEnumerator OnMouseDown() {//将物体由世界坐标系转换为屏幕坐标系Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);
 //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系 //2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离//将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离
    Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));while (Input.GetMouseButton(0)) {//得到现在鼠标的2维坐标系位置Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);//将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;//curPosition就是物体应该的移动向量赋给transform的position属性transform.position = curPosition;yield return new WaitForFixedUpdate(); //这个很重要,循环执行}
}

138.NGUI Button 怎样接受用户点击并调用函数,具体方法名称是什么
1、主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick() OnPress()等函数,可以说NGUI的按钮是通过发消息这个方式调用的。具体方法名称是OnClick() 2、void Awake () { //获取需要监听的按钮对象 GameObject button = GameObject.Find("UI Root/Button3"); //设置这个按钮的监听,指向本类的ButtonClick方法中。 UIEventListener.Get(button).onClick = OnButton3Click; } private void OnButton3Click(GameObject button) { Debug.Log("我是按钮3被点击了"); }

139.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.
Vector3 v 代表初速度 v’代表现在的速度, 假设小鸟是沿的 z 轴也就是 transform.forward方向运动的质量为 1,那么 v’=v-new Vector3(0,gt,ft),transform.Translate(v’)做的就是抛物线运动(g 为重力加速度不要用现实中的需要自己调试,f 为阻力也要自己调试设置,t 为时间)

140.当游戏中需要频繁创建一个物体时,我们需要怎样做能够节省内存?
1、使用预制物体对象 Prefab
2、使用对象池技术,不使用时关闭,使用时打开

141.碰撞检测需要物体具备什么属性?
能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器
【Physics.OverlapSphere 相交球检测碰撞,碰撞检测需要包围盒】

142.Vector3.forward与Vector3(0,0,1)是一样的意思对吗?

143.下哪个函数在游戏进入新场景后会被马上调用?
MonoBehaviour.OnLevelWasLoaded

144.itween 插件的作用是什么,itween 作用于世界坐标还是局部坐标,请列举出 3 个其常用方法?
iTween 是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等“方法:
a、MoveTo 物体移动;
b、ColorTo:随着时间改变对象的颜色组;
c、LookTo:随时间旋转物体让其脸部朝向所提供的 Vector3 或 Transform 位置;

145.U3D 中用于记录节点空间几何信息的组件名称,及其父类名称
Transform 父类是 Component

146.NGUI:把子控件放在父控件里面,如何上下边距都是10。
给子控件设置上下两个锚点为10

147.如何使子控件居中,如果使用UGUI怎么实现
设置子控件锚点为中心

148.去掉敏感字的程序(手写程序)
String s = “你是坏蛋”;
s.Replace(“坏蛋”, “**”);

149.unity3D从唤醒到销毁有一段生命周期,列出系统自己调用的重要方法。
Awake ()
OnEnable ()
Start()
FixedUpdate()
OnTriggerXXX(Collider other)
OnCollisionXXX (Collision collisionInfo)
Update()
LateUpdate ()
OnGUI()
OnDisable ()
OnDestroy ()

150.Unity3d中resources目录一般用来放些什么,打包的时候会有什么影响?
resource一般用来放置一些需要动态加载的资源,打包程序的时候会将Resource目录下的全部文件都加密压缩打进包内,这样再想使用assetbundle方式打小包的话就不行了

151.空间内一物体绕球面固定点(0、1、2)按照固定速度speed环绕运动。

public float Speed = 1;
void Update () {transform.RotateAround (new Vector3(0,1,2),Vector3.up,Speed);
}

152.以下关于WWW.LoadFromCacheOrDownload描述正确的是: C
A.可被用于将Text Assets自动缓存到本地磁盘
B.可被用于将Resource自动缓存到本地磁盘
C.可被用于将Assets Bundles自动缓存到本地磁盘
D.可被用于将任意的Unity资源文件自动缓存到本地磁盘

153.以下哪个函数在游戏进入新场景后会被马上调用? C
A:MonoBehaviour.OnSceneWasLoaded
B:MonoBehaviour.OnSceneEnter
C:MonoBehaviour.OnLevelWasLoaded
D:MonoBehaviour.OnLevelEnter

154.关于MonoBehavior.LateUpdate函数描述错误的是: B
A.当MonoBehavior类型应用后,每帧调用一次
B.常被用于处理RigidBody的更新
C.在所有Update函数执行后才能被调用
D.常被用于实现跟随相机效果,且目标物体的位置已经在Update函数中被更新

155.某个GameObject有一个名为MyScript的脚本,该脚本中有一个名为DoSomething的函数,则如何在该GameObject的另一个脚本中国调用该函数? A
A.GetComponent().DoSomething()
B.GetComponent

156.启用MipMaps对内存的影响是? A
A.增加约33%的内存
B.减少约33%的内存
C.增加约25%的内存
D.减少约25%的内存

157.以下关于MonoBehaviour.OnGUI()的描述的是: D
A.如果MonoBehaviour没有被启用,则OnGUI函数不会被调用
B.用于绘制和处理GUI events
C.每帧可能会被绘制多次,每次对应于一个GUI event
D.每帧被调用一次

158.采用Input.mousePosition来获取鼠标在屏幕上的位置,以下表述正确的是: C
A.左上角为原点(0, 0),右下角为(Screen.Width, Screen.Height)
B.左下角为原点(0, 0),右上角为(Screen.Height, Screen.Width)
C.左下角为原点(0, 0),右上角为(Screen.Width, Screen.Height)
D.左上角为原点(0, 0),右下角为(Screen.Height, Screen.Height)

159.正确排列出下面Unity脚本自带的函数执行顺序Start,Awake,Update,OnUpdate,OnEnable,FixedUpdate,OnGUI,LateUpdate、OnDisable、OnDestory
Awake–>OnEnable–>Start–>FixedUpdate–>Update–>LateUpdate–>OnGUI–>OnDisable -->OnDestory

160.Unity中销毁GameObject的方式,简述Destroy和DestroyImmediate的区别
Destroy销毁场景中的物体,但是内存中它还是存在的,只有当内存不够时,机制才会将它销毁并释放内存。而DestroyImmediate会立即将对象销毁,并且将内存释放。

161.Unity中如何派发事件(消息)
在脚本里的Update函数里调用EventDispatcher.Instance().OnTick();就可以了

162.ScriptObject的作用和使用方式
ScriptObject类型经常使用于存储一些Unity本身不可以打包的一些object,比如字符串,一些类对象,用这个类型的子类型可以用BuildPipeline打包成assetbundle包共后续使用,非常方便。

163.如何检测物体是否被其他对象遮挡
使用射线进行检测

164.写一个角色控制器,鼠标控制屏幕晃动,鼠标控制开枪。

public class Player : MonoBehaviour {public GameObject _prefabBullet;private float _angleSpeed = 120f;void Update() {float eularY = Input.GetAxis("Mouse X") * _angleSpeed * Time.deltaTime;transform.Rotate(new Vector3(0, eularY, 0));if (Input.GetMouseButtonDown(0)) {Instantiate(_prefabBullet, transform.position, transform.rotation);}}
}

165.敌人AI,有各种状态,实现各种状态之间的切换。
通过状态机来实现各种状态之间的切换
166.1.写一个角色控制器,鼠标控制屏幕晃动,鼠标控制开枪。
2.敌人AI,有各种状态,实现各种状态之间的切换。
3.敌人会和主角对抗,敌人被打到之后,会闪一次红色,然后红色比例提升10%,10次攻击之后,成红色。
4.敌人会自动攻击主角,主角也会有颜色变化。
5.敌人会在范围内巡逻。
6.UI,左边显示8个AI的被攻击次数,右边显示AI的攻击次数排序

public class Player : MonoBehaviour {public Camera _camera;public GameObject _prefabBullet;private float _angleSpeed = 120f;//生命值private int _life = 10;//玩家的状态private bool _state = false;//是否被打到public void IsState() {if (_state && _life > 0) {_life -= 1;_state = false;} else {_state = true;}}public void RoleRotate() {float eularY = Input.GetAxis("Mouse X") * _angleSpeed * Time.deltaTime;}//风发射子弹public void RoleShoot() {if (Input.GetMouseButtonDown(0)) {Instantiate(_prefabBullet, transform.position, transform.rotation);}}
}
public class Enemy : MonoBehaviour {//敌人被打到状态private bool _state = false;//玩家与敌人距离private float _distance;//角色public GameObject _role;//生命值private int _life = 10;//敌人被攻击次数private int _timeAccack = 0;//敌人状态public void EnemyState() {if (_distance >= 10f) {if (_life >= 1 && _state == true) {_life -= 1;_timeAccack++;}_state = false;}else if (_distance >= 0 && _state == false) {_state = true;}}//敌人与玩家距离public void Distance() {_distance = Vector3.Distance(transform.position, _role.transform.position);}void OnGUI() {GUI.TextArea(new Rect(20, 50, 80, 30), _timeAccack.ToString());GUI.TextArea(new Rect(20, 90, 80, 30), _timeAccack.ToString());GUI.TextArea(new Rect(20, 130, 80, 30), _timeAccack.ToString());}
}

**
**
使用transform.localRotation = Quaternion.Slerp(Quaternion a,Quaternion b,float c)实现物体平滑转向

Unity面试题加强版之三《Unity脚本基础》相关推荐

  1. 全网最全Unity面试题加强版之八《图形学相关》

    Unity面试题加强版之八unity与图形学 unity面试独家秘笈,码住学习,掌握轻轻松松拿Offer. 220.简述四元数的作用,四元数对欧拉角的优点? 四元数用于表示旋转 A.四元数一般定义如下 ...

  2. Unity面试题加强版之二《unity编辑器基础》

    Unity面试题加强版之二Unity编辑器基础 unity超全面试题,掌握轻轻松松拿Offer,码住学习 40.请描述游戏动画有几种,以及其原理. 主要有关节动画.单一网格模型动画(关键帧动画).骨骼 ...

  3. Unity 面试题汇总(三)Unity 基础相关

    Unity 面试题汇总(三)Unity 基础相关 目录 Unity 面试题汇总(三)Unity 基础相关 0.FSM(状态机).HFSM(分层状态机).BT(行为树)的区别 1.什么是协同程序? 2. ...

  4. Unity中的MonoBehaviour脚本-基础知识和继承关系

    本文分享Unity中的MonoBehaviour脚本-基础知识和继承关系 作为一个程序员, 在Unity中开发, 我们接触最多的对象之里一定有MonoBehaviour, 所以作为Unity基础知识学 ...

  5. Unity学习-脚本基础part01

    文章目录 一.脚本相关概念 1-脚本的定义 2-语法结构 3-脚本编译过程 4-创建脚本文件 5-脚本在Unity中的一些操作 6-脚本生命周期(重要) 6-1.定义 6-2.初始阶段 6-3.物理阶 ...

  6. Unity面试题ABC(Yanlz+A经典面试题+C#问题+Unity问题+...+F高薪就业+...+立钻哥哥+...)

    <Unity面试题> 版本 作者 参与者 完成日期 备注 Unity_JobView_V01_1.0 严立钻 2018.07.26 ##<Unity面试题>发布说明: ++++ ...

  7. Unity面试题D(Yanlz+...+D模拟面试+...+F高薪就业+...+立钻哥哥+...)

    <Unity面试题> 版本 作者 参与者 完成日期 备注 Unity_JobView_V01_1.0 严立钻 2018.07.26 #Unity面试题ABC:https://blog.cs ...

  8. Unity面试题(含答案)

    Unity面试题(含答案) 个人感觉非常有必要在面试之前大体看一下  并且也建议大家看一下 在应聘之前做好准备 我的个人经历:在面试的时候遇到的题,大多这里都有,事后超后悔. 所以自己整理了一下 方便 ...

  9. Unity面试题F(Yanlz+...+F高薪就业+...+立钻哥哥+...)

    <Unity面试题> 版本 作者 参与者 完成日期 备注 Unity_JobView_V01_1.0 严立钻 2018.07.26 #Unity面试题ABC:https://blog.cs ...

  10. Unity面试】 2022年Unity面试题分享

    [重点面试题]代表面试的时候问到的题目 光背答案是没有用的,一定要动手操作一下,才能知道答案为什么是这个. 本文章力求从简单的形式到深入理解原理,再到扩展,丰富知识的层次感,知其所以然. 在文末为大家 ...

最新文章

  1. [codeforces]Round #538 (Div. 2) F. Please, another Queries on Array?
  2. Mysql字符串字段判断是否包含某个字符串的3种方法
  3. Python常用内置函数(二)
  4. ConfigParser
  5. 天翼云从业认证(2.1)云计算的定义、特点、背景和发展历程
  6. P2153-晨跑【费用流,网络流,拆点】
  7. mac tomcat java_Mac下配置Java开发环境(JDK1.8)和Tomcat服务器
  8. android 接收SDCcard插拔的广播
  9. Cadence学习之路(三)STM32芯片原理图绘制
  10. 6岁就获吉尼斯世界纪录!这届10后程序员「小鬼当家」
  11. Stratified k-foldTimeSeriesSplit
  12. 用C语言算两个数的商和
  13. Collections 的 emptyList()、emptyMap() 、emptySet()
  14. 学生成绩管理系统(转载)
  15. 克罗地亚3-1战胜苏格兰晋级淘汰赛 当贝投影F3陪你畅爽观赛
  16. 【武忠祥高等数学基础课笔记】反常积分
  17. 在Windows 2008/2012/2016 上安装 Intel I217-V/I218-V网卡驱动
  18. lync2010服务器证书,无法登录 Skype for Business Online,因为无法获取证书 | Microsoft Docs...
  19. C++设置打印机暂停打印SetPrinter
  20. 新员工培训需要经过哪些步骤和流程

热门文章

  1. 使用android studio设置签名信息
  2. win10官方iso下载
  3. 运维每天基本的工作流程
  4. 戴尔电脑重装win10系统
  5. 阿里成立“平头哥”半导体公司,明年推神经网络芯片
  6. winrar是不是计算机应用软件,请注意winrar不是一个免费软件。在40天的试用期结束后,你必须购买一个许可,或者将他从你的计算机中删除...
  7. MRI T1、T2mapping
  8. 2022搜狐校园算法大赛推荐赛道Rank2方案分享
  9. gridview动态添加行
  10. IDEA连接数据库后在数据表里添加外键的两种方式