面试 4

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值