1, unity 中的协程和c#线程之间的区别是什么
多线程程序同时运行多个线程,而unity在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起.除主线程之外的线程无法访问unity的对象,组件,方法.
线程进程都是同步机制,而协程则是异步
unity没有多线程的概念,不过unity也给我们提供了SrartCiroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法.StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体力处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作,而LoadLevelAsync则允许你再后台加载新资源和场景,所以在利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜
2, 简述unity支持的作为脚本的语言的名称
unity 的脚本语言基于mono的.net平台上运行,可以使用.net库,这也为XML,数据库,正则表达式等问题提供了很好的解决方案.
unity里的脚本都会经过编译,他们的运行速度也很快.这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上
JavaScript:和网页中的JavaScript不一样,她编译后的运行速度很快,语法方面也会有不少区别,
C#
Boo:可以看做是Python语言的变种,又糅合了Ruby和c#的特性,他是静态类型语言
3,unity是否支持协程多线程程序,如果支持需要注意什么
仅能从主线程中访问unity的组件,对象和unity的系统调用
4, 支持:如果同时你要处理很多事情或者与unity的对象互动小可以用thread,否则使用coroutine
注意:c#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定对象
5, OnEnable,Awake,Start运行时的发生顺序?那些可能在同一个对象周期中反复的发生
Awake->OnEnable->Start(声明周期表):https://blog.csdn.net/lin_xiao_zhi/article/details/77764794
6, 请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
当物体是否可见切换之时,可以用于只需要在物体可见时才进行的计算
7, unity 如何获知场景中需要加载的数据
Resource.Load
AssetBundle.Load
8, 物体发生碰撞时,有几个阶段,分别对应的函数
三个阶段,OnCollisionEnter/Stay/Exit 函数
9, unity中,几种施加力的方式,描述出来
rigidbody.AddForce/ AddForceAtPosition, 都是rigidbody的成员函数
10, 物体自旋转使用的函数叫什么
transform.Rotate
11, 物体绕某点旋转使用函数叫什么
transform.RotateAround
12, unity从唤醒到销毁有一段声明周期,请列出系统自己调用的几个重要方法
Awake->OnEnable->Start->Update->FixedUpdate->LateUpdate->OnGUI->Reset->OnDisable->OnDestroy
13, 物理更新一般在哪个系统函数里?
FixedUpdate 每固定帧绘制时执行一次,和update不同的是FixedUpdata是渲染帧执行,如果你的渲染效率低下的时候Fixedupdate调用次数就回跟着下降,Fixedupdate用于物理引擎的计算,update用于做控制
14, 移动相机动作在那个函数里面,为什么在这个函数里
LateUpdate,是在所有update结束后才调用,比较适合用于命令脚本的执行,否则会出现摄像机已经推进了,还未有角色出现,出现空帧
15, 为什么unity会出现组件上数据丢失的情况
一般是组件上绑定的物体对象被删除了
16, 什么是协同程序
在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行,换句话说,开启协程就是开启一个线程,可以用来控制运动,序列以及对象的行为
17, 反向旋转动画的方法是什么
反转动画,将动画的速度调到-1,碰撞时,被碰撞物体与碰撞物体有collider组件,碰撞物体有刚体组件,或角色碰撞的包含角色组件OR改变animation.speed
18, 用代码实现第三角色控制器
public Transform _cameraTrans
private Transform -cameraOffset
void Awake{
-cameraOffset = transform.position--caneraTrans.position
}
void Update
{
caneraTrans.position= transform.position--cameraOffset
}
19, 用原生GUI创建一个可以拖动的窗口命令是GUI.DragWindow();
20, localPosition与Position的使用区别
locaPosition是自身位置相对于父级的变化的位置
position 在世界坐标transform的位置
21, Mathf.Round, Mathf.Clamp,Mathf.Lerp
Mathf.Round:四舍五入 :如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Mathf.Clamp: 限制
Mathf.Lerp:插值
22, 写出Animation的五个方法
AddCilp 添加剪辑
Blend 混合
Play 播放
Stop 停止
Sample 采样
23, 愤怒的小鸟给与初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法
Vector3 v代表初速度,v1代表现在的速度,假设小鸟是沿着z轴也就是transform.forward方向运动的质量为1,那么v1=v-new Vector3(0,g*t,f*t),transform.Translate(v1),做的就是抛物线运动(g为重力加速度需要自己调试,f为阻力也要自己调试设置,t为时间)
24, 鼠标控制屏幕晃动,鼠标控制开枪
晃动:
float temp = input.GetAxis("Mouse X")*旋转角度(120)*time.deltatime
transform.Rotate(new Vector(0,temp,-0))
开枪:
if(input.GetMouseButtonDown(0))
{
instantiate(prefabBullet,transform.position,transform.rotation)
}
25, 3D空间有三个点 有一条鱼在三个点游动,用四元数和欧拉角控制鱼的运动朝向和转向平滑
transform.loaclRotation = Quaternion.Slerp(Quaternion a,Quaternion b,float c)