1.写出四种匿名委托的格式
答:委托的格式:(每点 1 分)
(1)delegate(参数列表) {方法体};
(2)(参数列表) => {方法体};
(3)Func<参数类型 1, 参数类型 2, 返回值类型> 委托名
(4)Action<参数类型 1, 参数类型 2> 委托名
2.拖拽事件的三种接口?答:拖拽事件的三种接口:(每条 1 分)
(1)IBeginDragHandler
(2)IDragHandler
(3)IEndDragHandler
3.简述事件的使用步骤(5分)答:事件的使用步骤:(每条 1 分)
(1)声明委托
(2)声明事件
(3)绑定事件
(4)调用事件
(5)触发调用时机
4. u3d中碰撞器和触发器的区别?
答:(1)collider碰撞器会有碰撞的效果(受力的作用);
IsTrigger = false;
可以调用OnCollisionEnter/Stay/Exit函数;
参数类型为Collision
(2)trigger触发器没有碰撞效果 (不受力的左右);
isTrigger = true;
可以调用OnTriggerEnter/stay/exit函数;
参数类型为Collider
5.GameObject.Find 和 transform.Find的区别(4分)
答:(每点2分, 未答全得1分)
(1) GameObject.Find :返回 Gameobject,全局查找transform.Find:返回 transform,找当前游戏物体的孩子(子物体)(2) GameObject.Find 找不到当前未激活的对象
transform.Find 找到未激活的对象
6. 四元数(Quaternion)和欧拉角的优缺点 (8 分)
(1)欧拉旋转
优点:(2 分)
1)很容易理解,形象直观;
2)表示更方便,只需要 3 个值(分别对应 x、y、z 轴的旋转角度);缺点:(2 分)
会造成万向节锁(Gimbal Lock)的现象。由于万向节锁的存在,欧
拉旋转无法实现球面平滑插值;
(2)四元数旋转
优点:(2 分)
1)可以避免万向节锁现象;
2)只需要一个 4 维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;3)可以提供平滑插值;
缺点:(2 分)1)比欧拉旋转稍微复杂了一点点,因为多了一个维度;
2)理解更困难,不直观;
7. 按执行顺序写出在脚本生命周期内,一定不会重复执行的方法。(3分)
(方法对但未按顺序得2分,方法未写全但按顺序得2分, 有错误方法得1分)
答: Awake () / Start () / OnDestroy ()
8. TCP和UDP 的区别?(6分)
答:(每点1分)
1、TCP 面向连接(如打电话要先拨号建立连接)(三次握手);UDP 是
无连接的,即发送数据之前不需要建立连接,每一条 TCP 连接只能是
点到点的;UDP 支持一对一,一对多,多对一和多对多的交互通信
2、TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无
差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保
证可靠交付
3、TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节
流;UDP 是面向报文的(数据报)
4、UDP 没有拥塞控制(或叫流量控制),因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等)
5、TCP 首部开销 20 字节;UDP 的首部开销小,只有 8 个字节
6、TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道
9. [SyncVar]、[Command]、Spawn 的作用分别是? (6 分)
答:
(1)[SyncVar]:服务器的值能自动同步到客户端,保持客户端的值
与服务器一样。(2 分)客户端值改变并不会影响服务器的值
(2)[Command]:客户端调用,服务器执行。(2 分)需要注意,在
客户端需要有权限的 NetworkIdentity 组件才能调用 Command 命令。
(3)Spawn:把服务器上的 GameObject,卵生到与服务器连接的各
个客服端。(2 分)根据 NetworkIdentity 组件找到对应监视连接,
在监视连接里生成相应的 GameObject.10、对SqliteConnection、SqliteCommand、SqliteDataReader说明作用 (6分)
答:(每条 2 分)(1)SqliteConnection:数据库连接对象,用于连接数据库、创建
SqliteCommand、以及打开和关闭数据库;
(2)SqliteCommand:数据库命令对象,用于执行 SQL 语句;
(3)SqliteDataReader:数据库读取对象,用于高效读取数据库里
面的记录
11、使用 AssetBundle 实现资源热更的流程? (5 分)
(每条1分)
(1). 打包 AssetBundle。
(2). 上传到服务器 server。
(3). 运行游戏时候自动判断版本号,如果不同就从服务器上下载新的 AssetBundle 包替换本地 AB 包。
(4). 解析加载 AssetBundle.完成资源热更。
12、写单例类 Student 的实现(4 分)
答:代码如下:
public class Student {
private Student {};(1 分)
private static Student instance;(1 分)public static Student GetInstance()
{
}
if (instance == null){
instance = new Student ();
}
return instance;
}(2分)
13、什么是预制体,使用预制体的目的是?(2 分)
答:(每点 1 分)
(1)预设体是一个游戏对象及其组件的集合
(2)目的是使游戏对象及资源能够被重复使用,相同的游戏对象可
以通过一个预设体来创建
14、物体发生碰撞的必要条件 (3 分)
答:(每点 1 分)
碰撞发生的条件:
1)发生碰撞的两个物体都必须带有 Collider
2)发生碰撞的两个物体至少有一个带有刚体
3)发生碰撞的两个物体必须有相对运动
15、实现点击选中场景中的游戏物体或 UI 控件的方法有哪些? (6 分)
答:(每点 1.5 分)
游戏物体
(1)给物体添加碰撞器,并通过脚本添加鼠标事件(OnMouseDown、
OnMouseUpAsButton 等)
(2)给物体添加碰撞器,从摄像机发射一条经过鼠标当前点击位置
的射线选中
UGUI UI 控件
(1)添加事件系统,编写脚本实现相应接口方法
(IPointerClickHandler)
(2)添加按钮(button)组件, 绑定点击方法
16、Canvas 有哪三种渲染模式, 分别的使用场合是什么? (6 分)
答:
(1)ScreenSpace - Overlayer:默认渲染模式,在这个渲染模式下,
UI 会覆盖整个场景,所有的 UI 元素会在场景最上层渲染输出。(1 分)使用场合:适合做玩家的 HP、MP 等 UI;(1 分)
(2) ScreenSpace - Camera:是由场景中指定的摄像机渲染输出(1
分)
使用场合:最常用的使用场景是使用透视摄像机随 UI 进行渲染
输出,得到景深效果,可以用来实现比较炫酷的游戏开始界面,
适合做带粒子特效的绚丽 UI;(1 分)
(3)WorldSpace:在世界坐标系下渲染 UI(1 分)
使用场合:例如对话框、标签等在场景中跟随游戏对象运动。
用来实现一些 HUD 的效果,把 UI 作为 3D 物体对待;(1 分)
17.如何实现动画遮罩? (3分)
答:(每点 1 分)
1)需要添加 AvatarMask2)在新建层中设置一个空的状态机(用来代替旧层中的某些节点)3)新层的权重值设为 1
18、简述实现小地图功能的步骤?(3 分)
答:步骤:(每条 1 分)
(1)添加 RawImage 控件,调整好位置
(2)创建单独的摄像机,并调整角度,用于照射主角或场景
(3)创建 RenderTexture,并分别拖拽到摄像机的 Target Texture
属性、RawImage 的 Texture 属性
19、Unity3D 是否支持写成多线程程序?如果支持的话需要注意什么?(4 分)
答:
(1)Unity3D 支持多线程。(2 分)能够创建额外的线程和主线程同
时运行。
(2)注意:
1)仅能从主线程中访问Unity3D的组件,对象和Unity3D系统
调用,如果同时你要处理很多事情或者与 Unity 的对象互动小
可以用 thread,否则使用 coroutine。(1 分)
2)保证线程安全,C#中有 lock 这个关键字,以确保只有一个线
程可以在特定时间内访问特定的对象(1分)
20、移动相机动作在哪个函数里,为什么在这个函数里。(4 分)
答:
(1)LateUpdate(1 分)
(2)在所有 update 操作完才跟进摄像机,不然就有可能出现摄像机
已经推进了,但是视角里还未有角色的空帧出现。(3 分)
21. 怎么判断两个平面是否相交?不能用碰撞体,说出计算方法 (10 分)
答:(2 种方法任意写一种,只写出原理或者只写出计算方法得 5 分)假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个
矩形
rect1{(minx1, miny1)(maxx1, maxy1)}
rect2{(minx2, miny2)(maxx2, maxy2)}
相交的结果一定是个矩形,构成这个相交矩形 rect{(minx, miny)
(maxx, maxy)}的点对坐标是:
minx =max(minx1,minx2)
miny =max(miny1,miny2)
maxx =min(maxx1,maxx2)
maxy =min(maxy1,maxy2)
如果两个矩形不相交,那么计算得到的点对坐标必然满足:
(minx > maxx)或者
( miny > maxy )
判定是否相交,以及相交矩形是什么都可以用这个方法一体计算完成。
从这个算法的结果上,我们还可以简单的生成出下面的两个内容:(一) 相交矩形: (minx, miny) (maxx, maxy)
(二) 面积: 面积的计算可以和判定一起进行
if ( minx>maxx ) return 0;
if ( miny>maxy ) return 0;
return (maxx-minx)*(maxy-miny)
第二种方法
两个矩形相交的条件:两个矩形的重心距离在 X 和 Y 轴上都小于两个
矩形长或宽的一半之和.这样,分两次判断一下就行了.
bool CrossLine(Rect r1,RECT r2)
{if(abs((r1.x1+r1.x2)/2-(r2.x1+r2.x2)/2)<((r1.x2+r2.x2-r1.x1-r2.x1)/2) &&abs((r1.y1+r1.y2)/2-(r2.y1+r2.y2)/2)<((r1.y2+r2.y2-r1.y1-r2.y1)/2)) {
return true;
}
return false;
}
机试题 (100分)
//C#, 在命令行输出
22、写出您想到的一种方法实现: 1-2+3-4+......+m,输入任何数字,得到
结果; (10分)
思路:使用循环语句,及求余运算进行奇偶数判断
23、 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等
于X,要求速度越快越好;(15分)
思路:因为是有序数组,可借用二分查找思想实现
//Unity 新建场景完成以下任务
24、 实现磁铁效果
(1) 随机产生磁铁道具, 及金币(磁铁道具产生时间间隔长,金币产
生时间间隔短,都会自动消失)(5分)
(2) 控制玩家移动,玩家获得磁铁道具后 ,自动吸附附近金币的效果
(10分)
思路:使用触发器,当获得磁铁道具后触发器范围增大
25、(1)新建场景,完成场景搭建,及UI界面搭建(血条、玩家等级、玩家头
像)。(5分)
(2)生成玩家,玩家头像由网络请求得到 (5分)
(3)用户使用键盘控制玩家运动及转向,使用动画状态机 (10分)
(4)随机生成敌人,敌人产生后向玩家运动,当接近玩家时发动攻击 (10
分)
(5)玩家受到攻击后血量减少,播放受伤动画,死亡后玩家失活(10 分)(6)打包玩家资源,通过AssetBundle加载 (20分)(注意文件管理,和代码规范)
网友评论