unity5中transform.position.zlocalposition一定要加游戏对象吗

给我们留言
地址:福建省晋江市青阳街道洪山路国际工业设计园纳金网
电话: 400-067-3919
(周一到周五, 周六周日休息)
设计师入口
1 第1页 | 共2 页
查看: 8159|回复: 14
最后登录注册时间阅读权限90积分32161
资深设计师, 积分 32161, 距离下一级还需 17839 积分
纳金币33367 精华83
最先执行的方法是:
1、(激活时的初始化代码)Awake,2、Start、3、Update【FixUpdate、LateUpdate】、4、(渲染模块)OnGUI、5、再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy
高频问答的问题:
1.什么是渲染管道?
是指在显示器上为了显示出图像而经过的一系列必要操作。
渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有:
本地坐标-&视图坐标-&背面裁剪-&光照-&裁剪-&投影-&视图变换-&光栅化。
2.如何优化内存?
有很多种方式,例如
A、压缩自带类库;
B、将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
C、释放AssetBundle占用的资源;AssetBundle资源包
D、降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
E、使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
3.动态加载资源的方式?(有时候也问区别,具体请百度)
1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。Resources.Load();
2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。AssetBundle
3.通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的【AssetDatabase 资源数据库】
区别:Resources的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以unity推荐的方式是不用它,都用bundle的方式替代,把资源达成几个小的bundle,用哪个就load哪个,这样还能分包发布和patch,但是在开发过程中,不可能没更新一个资源就打一次bundle,所以editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,在不同的环境下做不同实现。
动态资源的存放
&&有时我需要存放一些自己的文件在磁盘上,例如我想把几个bundle放在初始的安装里, unity有一个streaming asset的概念,用于提供存储接口的访问。我们需要在编辑器建立一个StreamingAssets名字的文件夹,把需要我们放在客户磁盘上的动态文件放在这个文件夹下面,这样安装后,这些文件会放在用户磁盘的指定位置,这个位置可以通过Application.streamingAssetsPath来得到。
4.什么是协同程序?
在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。
5.你用过哪些插件?
一 界面制作 推荐:NGUI
二 2D游戏制作 推荐:2D Toolkit& &//[?tu:lk?t] 工具包,工具箱
三 可视化编程 推荐:PlayMaker
四 插值插件 推荐:iTween,HOTween
五 路径搜寻 推荐:Simple Path
六 美术及动画制作 推荐:RageSpline,Smooth Moves
七 画面增强& & 推荐:Bitmap2Material,Strumpy Shader Editor
八 摄像机管理&&推荐:Security Camera
九 资源包&&推荐:Nature Pack
十、造路插件EasyRoads3D
6.使用实现2d游戏,有几种方式?
1.使用本身的GUI;
2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;
//[??:θ?'ɡr?f?k] adj. 正字法的,拼字正确的;正射
3.使用2d插件,如:2DToolKit;
7.Unity3d中的碰撞器和触发器的区别?
触发器只是碰撞器身上的一个属性,碰撞器是触发器的载体。
碰撞器有碰撞的效果,IsTrigger=false,可以调用OnCollisionEnter/Stay/Exit函数;
{[k??l??n]n. 碰撞;冲突;(意见,看法)的抵触;(政党等的)倾轧}
触发器没有碰撞效果,IsTrigger=true,可以调用OnTriggerEnter/Stay/Exit函数。
a.如果不想让碰撞检测影响物体移动但是又想检测到碰撞这时用到触发器(Trigger)
b.触发器用来检测一个物件是否经过空间中的某个区域
8.物体发生碰撞的必要条件
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
8.1 .CharacterController和Rigidbody的区别?
CharacterController自带胶囊碰撞器,里面包含有刚体的属性;
Rigidbody就是刚体,使物体带有刚体的特征。
[CharacterController:角色控制器]
Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的
9.在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数
1.OnCollisionEnter(进入碰撞) 2.OnCollisionStay (逗留碰撞) 3.OnCollisionExit(当退出碰撞)
10.Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。
11.什么叫做链条关节?
Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
{ [h?nd?] n. 铰链,折叶;关键,转折点;枢要,中枢}
12.物体自身旋转使用的函数?
Transform.Rotate()
13.物体围绕某点旋转使用的函数?
Transform.RotateAround()
14.Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数
PlayerPrefs.SetInt() PlayerPrefs.GetInt()
15.Unity3d提供了几种光源类型,分别是哪几种?
平行光:Directional Light 点光源:Point Light
聚光灯:Spot Light 区域光源:Area Light
16.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
Awake—&Start—&Update—&FixedUpdate—&LateUpdate—&OnGUI—&Reset—&OnDisable—&OnDestroy
17.物理更新一般放在哪个系统函数里?
FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
18.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?
LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
19.当游戏中需要频繁创建一个物体时,我们需要怎样做能够节省内存?
使用预制物体对象Prefab,然后复制创建。
20.在场景中放置多个Camera并同时处于活动状态会发生什么?
游戏界面可以看到很多摄像机的混合。
21.请描述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它?
Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。
如何销毁一个UnityEngine.Object及其子类?
使用Destroy()方法;
22.请简述Unity3d下如何安全的在不同工程间迁移asset数据,请列举出三种方法?
1.可以把assets目录和Library目录一起迁移
3.用Unity带的assets Server功能
23.请描述游戏动画有哪几种,以及其原理?
主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
a.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一 个整体的动画,角色比较灵活,Quake2中使用这种动画;
b.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
c.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
24.请描述为什么Unity3d中会发生在组件上出现数据丢失的情况
一般是组件上绑定的物体对象被删除了
25.alpha blend工作原理
Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。
{['?lf?] 透明(度); [blend] 混合;把…掺在一起}
26.写出光照计算中的diffuse的计算公式
计算公式为: Idiffuse = Dintensity*Dcolor*N.L ; (Dintensity表示漫反射强度, Dcolor 表示漫反射光颜色, N 为该点的法向量, L 为光源向量 其中N与L点乘,如果结果小于等于0,则漫反射为0。){[d?'fju:z] vi. 传播;四散|intensity[?n'tens?t?] n. 强烈;(感情的)强烈程度;强度;烈度}
27.Lod是什么,优缺点是什么?
LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
28.两种阴影判断的方法、工作原理。
A.阴影由两部分组成:本影与半影
a.本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
b.半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
求阴影区域的方法:做两次消隐过程
一次对每个光源进行消隐,求出对于光源而言不可见的区域L;
一次对视点的位置进行消隐,求出对于视点而言可见的面S;
shadow area= L ∩ S
B.阴影分为两种:自身阴影和投射阴影
自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
若是动态光源此方法就无效了。
29.Vertex Shader是什么,怎么计算?
顶点着色器
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
30.MipMap是什么,作用?
MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
31.机试:二选一
1.用代码实现第三角色控制器
2.实现吊机吊物体的功能
【吊机吊物体需要节点挂接和坐标系转换】
32.反向旋转动画的方法是什么?
【反转动画,讲动画的速度调到-1,碰撞时,被碰撞物体与碰撞物体有collider组件,碰撞物体有刚体组件,或角色碰撞得包含角色组件 OR 改变animation.speed】
33.碰撞检测需要物体具备什么属性?
能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器
【Physics.Overlaphere相交球检测碰撞,碰撞检测需要包围盒】
34.获取、增加、删除组件的命令分别是什么?
获取:GetComponent 增加:AddComponent&&删除:Destroy
35.Animation.CrossFade命令作用是:(C)&&{Fadevi. 褪去,失去光泽;}
A.动画放大& & & & B.动画转换& & & & C.动画的淡入为其他动画
36.Application.loadLevel命令为:(A)
A加载关卡& & & & B.异步加载关卡& & & & C.加载动作
37.调试记录到控制台的命令是什么?
Debug.Log();
39.编辑器类存放路径是什么?
工程目录下的Assets/Editor文件夹下。
40.使用原生GUI创建一个可以拖动的窗口命令是什么?
GUI.DragWindow();
41.localPosition与Position的使用区别?
localPosition:自身位置,相对于父级的变换的位置。
Position:在世界坐标transform的位置
Mathf.Round& & & &&&插值
Mathf.Clamp& & & &&&四舍五入
Mathf.Lerp& & & &&&限制
42.写一个计时器工具,从整点开始计时,格式为:00:00:00
43.写出Animation的五个方法
AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样
44.怎么拿到一个对象上脚本的方法
GameObject.GetComponent&&();
上机题:用实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可)。
45.请简述向量的点乘,向量的叉乘以及向量归一化的几何意义?
点乘的几何意义是:计算两个向量之间的夹角,以及在某一方向上的投影;
叉乘的几何意义是:创建垂直于平面,三角形,或者多边形的向量;
46..Unity3D是否支持写成多线程?如果支持的话要注意什么?
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine.{ [k?ru:'ti:n] n. 协同程序}
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
47.Unity3D中的协程(Coroutine)和C#线程之间的区别是什么?
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜asynchronous[e??s??kr?n?s].synchronous同步
48.请简述四元数的作用以及四元数相对于欧拉角的优点
A.四元数一般定义如下:q=w+xi+yj+zk其中 w,x,y,z是实数。同时,有: i*i=-1& & j*j=-1& & k*k=-1
B.四元数也可以表示为: q=[w,v]
有多种方式可表示旋转,如 axis/angle、欧拉角(Euler angles)、矩阵(matrix)、四元组等。 相对于其它方法,四元组有其本身的优点:
a.四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁]
b.四元数由4个数组成,旋转矩阵需要9个数
c.两个四元数之间更容易插值
d.四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化& & & & (orthogonalize),对四元数规范化更容易
e.与旋转矩阵类似,两个四元组相乘可表示两次旋转
49.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及他们执行的意义?
当renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible
当renderer(渲染器)在任何相机上可见时调用:OnBecameVisible
50.动画层(Animation Layers)的作用是什么?
动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画
52.请说出4种面向对象的设计原则,并分别简述它们的含义。
1) 单一职责原则 (The Single Responsiblity Principle,简称SRP):一个类,最好只做一件事,只有一个引起它的变化.
2) 开放-封闭原则 (The Open-Close Principle,简称OCP):对于扩展是开放的,对于更改是封闭的
3) Liskov 替换原则(The Liskov Substitution Principle,简称LSP):子类必须能够替换其基类
4) 依赖倒置原则(The Dependency Inversion Pricinple,简称DIP):依赖于抽象
5) 接口隔离原则 (The Interface Segregation Principle,简称ISP):使用多个小的专门的接口,而不要使用一个大的总接口。
53.Material和Physic Material区别?
PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。
Material材质(材质类)为了获得一个对象使用的材质,可以使用 Renderer.materia属性:
54.法线贴图 、CG动画
A.法线贴图:是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。
B.CG动画:原为Computer Graphics的英文缩写。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成,国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为CG。它既包括技术也包括艺术,几乎囊括了当今电脑时代中所有的视觉艺术创作活动,如平面印刷品的设计、网页设计、三维动画、影视特效、多媒体技术、以计算机辅助设计为主的建筑设计及工业造型设计等。
NGUI(NUGUI1、NGUI2)
55、NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么
a、直接监听事件
把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不灵活。
56、请描述游戏动画有哪几种,以及其原理。
  主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。 a、关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2([kwe?k]vi.发抖,颤抖;)中使用了这种动画;b、 单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。 c、骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画
57、下面哪种做法可以打开Unity的Asset Store
Windows -& Asset Store
58、Mecanim系统中,Body Mask的作用是?
  指定身体的某一部分是否参与渲染
59、以下哪种操作步骤可以打开Unity编辑器的Lightmapping视图?
  Windows --& Lightmapping
60、关于光照贴图
  A:使用光照贴图比使用实时光源渲染要快 B:可以降低游戏内存消耗 C、多个物体可以使用同一张光照贴图
61、关于Vector3的API,以下说法正确的是?
  Vector3.forward与Vector3(0,0,1)是一样的意思;
62、 以下哪个函数在游戏进入新场景后会被马上调用?
  MonoBehaviour.OnLevelWasLoaded
63、 什么是导航网格( NavMesh)?
  一种用于实现自动寻路的网格
64、什么是局部坐标,什么是世界坐标?
  世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。
65、itween插件的作用是什么,itween作用于世界坐标还是局部坐标,请列举出3个其常用方法?
& & iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等“
  方法:a、MoveTo&&物体移动 ;b、ColorTo:随着时间改变对象的颜色组; c、LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置
66、请简述NGUI中Panel和Anchor的作用
  Anchor包含UIAnchor脚本。UIAnchor的功能是把对象锚定在屏幕的边缘(左上,左中,左下,上,中,下,右上,右中,右下),或缩放物体使其匹配屏幕的尺寸
  Panel对象有UIPanel脚本,UIPanel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化,以减少绘制命令的调用。
67、Unity摄像机有几种工作方式,分别是什么?
68、LayerMask.NameToLayer()这个方法有什么作用?
  LayerMask的使用是按位操作的,LayerMask.NameToLayer(&Players&) 返回该Layer的编号。
69、请描述MeshRender中material和shader的区别?
  Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)
  Shader大体上可以分为两类:表面着色器(Surface Shader) 、片段着色器(Fragment Shader)
70、什么是矢量图
矢量图:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。
71、Unity 连接数据库
  需要得到Mono.Data.Sqlite.dll 文件与System.Data.dll文件
72、四元组是什么?
  所谓四元数,就是把4个实数组合起来的东西。4个元素中,一个是实部,其余3个是虚部。
最后登录注册时间阅读权限90积分6667
高级设计师, 积分 6667, 距离下一级还需 3333 积分
纳金币2715 精华0
Very good FAQ! ! Thanks !
最后登录注册时间阅读权限70积分3962
中级设计师, 积分 3962, 距离下一级还需 1038 积分
纳金币582 精华0
最后登录注册时间阅读权限90积分5676
高级设计师, 积分 5676, 距离下一级还需 4324 积分
纳金币7268 精华0
最后登录注册时间阅读权限50积分1440
助理设计师, 积分 1440, 距离下一级还需 560 积分
纳金币0 精华0
感谢分享      
最后登录注册时间阅读权限70积分2255
中级设计师, 积分 2255, 距离下一级还需 2745 积分
纳金币512 精华0
最后登录注册时间阅读权限70积分3154
中级设计师, 积分 3154, 距离下一级还需 1846 积分
纳金币1065 精华0
感谢分享!!!
最后登录注册时间阅读权限50积分1174
助理设计师, 积分 1174, 距离下一级还需 826 积分
纳金币92 精华0
最后登录注册时间阅读权限30积分565
初级设计师, 积分 565, 距离下一级还需 435 积分
纳金币34 精华0
总结很全面
最后登录注册时间阅读权限0积分451
纳金币134 精华0
提示: 作者被禁止或删除 内容自动屏蔽
1 第1页 | 共2 页
站长推荐 /1
纳金名模第150期西洋乐器3d模型:数量88个,大小为1.2GB。完全免费下载哦!这样的福利我和我的小伙伴们都惊呆了!!下载地址:
Powered by - X2.5
Narkii Inc.  [摘 要]游戏开发者总是容易被现实世界的各种物理逻辑,真实规律所束缚。文章讲述一种新的游戏开发思维,介绍如何利用魔术思" />
免费阅读期刊
论文发表、论文指导
周一至周五
9:00&22:00
利用魔术思维优化基于Unity3D的《立方杀阵》游戏
2016年2期目录
&&&&&&本期共收录文章20篇
  [摘 要]游戏开发者总是容易被现实世界的各种物理逻辑,真实规律所束缚。文章讲述一种新的游戏开发思维,介绍如何利用魔术思维开发游戏,从而使程序在不改变需求的情况下,更有效率,更加灵活,扩展性更高。研究通过对基于Unity3D的《立方杀阵》游戏的优化,证明了这种思维的可行性和有效性。 中国论文网 /1/view-7278304.htm  [关键词]Unity3D 魔术思维 预制体   中图分类号:P208 文献标识码:A 文章编号:X(3-02   1 引言   与一般应用不同,游戏中常需模拟现实世界、甚至超现实世界的动作效果,这对游戏开发者提出了更高的要求。例如在射击游戏中,如何为用户提供逼真的射击感受十分重要。在进行游戏开发时,很多难题,不如换一个视角来观察,换一种方式来解决,可能获得意想不到的效果。文章提出一种从魔术思维出发的方式,通过一些伪技巧,把一些真实需求魔术化地呈现给玩家。让游戏开发不仅仅是一种技术,更提升为一种艺术。   2 游戏《立方杀阵》开发前期遇到的困扰   (1)要让玩家感觉到房间数量巨大,有种身处巨型密室的感觉,然而场景中构建过多房间会导致游戏帧数低于10帧。   《立方杀阵》是从电影《异次元杀阵》中获取灵感进而改编的独立游戏。根据电影中的设定,该杀阵是一个由26×26×26=17576个小立方体房间组成的巨型立方体密室。所以,如果要让玩家可以在密室中像电影一样逃脱,并获得乐趣,显然必须有非常多的立方体房间才可以满足游戏的需求。然而,在Unity3D中,经过测试,当立方体房间超过4×4×4=64个房间的时候,还没运行游戏,就已经开始卡频了。64个房间,即立方体每个方向4个房间,无法让玩家感受密室的庞大。   (2)子弹速度过快导致无碰撞穿越。   Unity3D中,物体的移动速度过快,极大可能导致在碰撞另外的物体时,产生穿越,从而无法发射碰撞检测。根据射击系统的需求,子弹是必须出现的。如果子弹速度不够快,那么玩家的射击体验将会大大下降,游戏沉浸感会大大减少。子弹速度要达到真实世界的子弹速度,又会导致穿越现象,有时候射击了物体但没反应。   3 现实逻辑实现需求   (1)现实逻辑解决需求1:使玩家体验到身处许多房间的巨型密室。   Unity3D的游戏脚本为基于Mono的Mono脚本,一个基于.NET Framework的开源语言,因此程序员可用C#,JavaScript等加以编写[1]。文章将采用C#语言进行示例。   在游戏世界放置数量足够多的房间。用代码生成场景如下:   public void InstantiateAllRoom(int Num,GameObject RoomPrefab){   int nowNum=0; //当前房间个数   for(int y=0;y<Num;y++){ //Y轴   for(int z=0;z<Num;z++){ //Z轴   for(int x=0;x<Num;x++){ //X轴   //实例化一个房间在对应的(X,Y,Z)坐标上   GameObject g=(GameObject)Instantiate(RoomPrefab,newVector3(x,y,z), RoomPrefab.transform.localRotation);   g.name="第"+nowNum+"个"; //为房间命名   nowNum+=1; //数量加一   }   }   }   }   这种思维会真实模拟出电影《异次元杀阵》的世界,让游戏场景可以按照电影的世界来构造,使游戏世界非常直观。但时间复杂度较高,复杂度为O(Num3)。   在CPU为Intel酷睿i52450M,内存4GB,显卡NVIDIA GeForce GT 520M(1G显存)的电脑环境下测试,当房间数量达到10000个时,游戏运行对CPU占用的时间为每帧37.06ms,对摄像机渲染值(消耗显存)占有率达到了80%左右。生成26*26*26规模的立方场景测试游戏实际运行帧数,帧数运行效果如下图1所示:   图1中左侧的Hierarchy面板中表示游戏场景有17576个房间,游戏场景输出了当前游戏帧数。可以看到在房间数量超过1万间的情况下,当前Draw Call(Unity每次在准备数据并通知GPU渲染的过程称为一次Draw Call)为27次,帧数低于10帧,流畅度较低。   (2)现实逻辑解决需求2:子弹达到真实世界射击体验   当射击事件触发时,实例化一颗子弹的预制物体,赋予该预制子弹物体的加速度与方向,使其向目标发射。当子弹进入目标触发范围,或者与目标发生碰撞时,产生击中事件。游戏对象如果需要感应碰撞,那么必须给其添加碰撞器[2]。手动添加Unity3D的碰撞器即可。子弹射击效果实现代码如下:   public void Fire(GameObject Bullet,float Force){   //在当前位置实例化一颗子弹   GameObject g=(GameObject)Instantiate(Bullet,transform.localPosition,Bullet.transform.localRotation);   //在子弹身上作用一个向前的力使其飞行   g.GetComponent().AddForce(transform.forward*Force);   }   但是这种方法,每次射击实例化一个物体,多次射击后,为了防止内存逐渐增多,每颗子弹都要实现延迟销毁。然而Unity3D中的Destroy()函数对子弹的销毁并不彻底,被销毁的物体本身在内存中保留有网格渲染缓存,直到进行场景切换才彻底清空。随着游戏运行时间的增加,内存消耗增加,并且该方法也没有达到射击体验的需求。
  4 魔术思维实现需求的方式   (1)魔术思维实现需求1:使玩家体验到身处许多房间的巨型密室。   魔术师戒指握在手心,在观众眼前轻轻吹一口气,再打开手,戒指消失了,接下来魔术师让观众打开桌子上的盒子,观众发现,戒指赫然出现在盒子里。   这个魔术里面用到了2种思维,分别是错误引导思维和预制体思维。要解决立方杀阵游戏场景房间过多问题,用两种思维即可解决。   首先利用错误引导思维,在游戏介绍或者开头CG上告诉玩家这是个巨型立方体。在游戏开始时让玩家处于一个已初始化的房间中。玩家在开门前,无法得知房间外的情况,事实上此时只有一个房间。   而预制体思维说的是盒子里的戒指其实一开始就存在,和消失的戒指一模一样,早就放在盒子里,必要的时候,才会让它出现给观众看到。同样,事先构建好立方体房间的一种单独个体,预制在资源文件中,作为预设体,可以理解为是一个游戏对象及其组件的集合,目的是使游戏对象及资源能够被重复使用[3]。使用该预制对象,就可以创建一个交互式的3D场景[4]。当玩家开启某个门时,实例化一个立方体房间在对应的下一个房间位置上,当门被完全打开时,玩家看到的,是另一个立方体房间。以此类推,如此,多房间体验需求就解决。   玩家在房间中进行游戏时,类似于虚拟漫游项目的观房,使用动态的、有交互功能的三维观 , 能够使整个看房过程更加生动,使用户有一种身临其境的感觉[5]。同样,在有交互性与三维的前提下,这种开发思维也达到了身临其境的房间体验。   无论使用哪种方式,都会导致一个问题,便是随着玩家打开的房间越来越多,超过64个房间时,会导致游戏很卡。解决方式是利用改进的先进先出算法删除旧房间。由于《立方杀阵》中玩家经过8个房间所需的时间和房间周期性位移设定的时间几乎相同,此时即使第一个房间因被删除而发生变化也不会出现不合理的空间现象,所以《立方杀阵》中的房间设定最大值为8。模块代码如下:   public void InstantiateOneRoom(Vector3 RoomTransform,GameObject RoomPrefab){   bool canInstantiateOneRoom=true; //该位置可否生成房间的标志   if(NowRoomNum>=AllRoom.Length){NowRoomNum=0;} //数组序号重置   for(int i=0;i  //遍历房间数组,看目前该位置是否已经存在房间,如果存在则不可以再次生成房间   if(AllRoom[i].name==""+RoomTransform){canInstantiateOneRoom=false;break;}   }   if(canInstantiateOneRoom){ } //生成房间   }   生成房间代码时间复杂度为:O(AllRoom.Length)。对比第一种方法, O(AllRoom.Length)远远小于O(Num3)。   经过测试,当房间数量为8间时,游戏运行对CPU占用的时间为每帧0.1ms,对比前一开发方案减少了36%。对摄像机渲染值(消耗显存)占有率达到1.2%左右。对比前一开发方案,减少了78.8%。很明显,该方案较好的优化了该游戏,使游戏更加顺畅。当生成8个房间,测试实际游戏运行的帧数,如图2所示:   图2中左侧的Hierarchy面板中表示游戏场景有8个房间,游戏场景输出了当前游戏帧数,可以看到当前情况下, Draw Call为8次,帧数达到59.9帧,流畅度极高。   (2)魔术思维实现需求2:子弹达到真实世界射击体验   魔术思维开发方式:魔术师将女助手四肢呈一个大字绑在一个大转盘上面,在转盘慢速旋转的情况下,魔术师蒙上眼镜,将10把飞刀一个个准确的扔到女助手身体旁边的转板上,狠狠的插了进去,丝毫不伤及女助手。   其实,魔术师只是在假装扔飞刀,接下来,事先安装在转盘背面的弹簧装置,从转盘背后反方向弹出一把插在转板上的飞刀。   实例化子弹每次都会产生一次内存损耗。为解决该问题,采用魔术思维,以Unity3D里的一种射线替代子弹。玩家射击时,出现一条可控制距离(用于不同枪械射击距离)的射线,而射线只出现一帧,那一帧立刻判断射线是否射中目标,是否触发击中事件,模拟了真实世界子弹的射击速度,避免了检测丢失的现象。射线方案射击功能模块代码如下:   public void Fire(float Distance){   RaycastHit hit=new RaycastHit(); //射线发射相关信息   Camera camaer=Camera.main; //主摄像机   Vector3 t=camaer.transform.position+camaer.transform.forward*Distance; //射线目标坐标   //由摄像机到终点的方向发射一条射线   Ray ray1 =new Ray(camaer.transform.position,t-camaer.transform.position);   if(Physics.Raycast(ray1,out hit,Distance)){   //当发射射线时,在开发者界面绘制一条绿色的线   Debug.DrawRay (ray1.origin,t-camaer.transform.position, Color.green);   }   }
  对于各种模拟子弹飞行时的特效火线,或者击中墙壁等地形时的石灰飞溅效果,都可以在射击事件和击中事件中在对应位置实例化这个效果,AI射击方面也可以用射线判定。   对两种思维实现射击的效果进行测试,同时运行游戏20分钟。在实例化子弹的方案中,即使销毁了子弹物体,由于缓存的作用,游戏内存的占有率一直逐渐增加,20分钟时达到了250M左右。而使用射线方案的情况下,内存占有率一直在205M左右浮动。由此可知,随着游戏的持续运行,用射线代替实例化子弹的方案更优。   5 其他问题的魔术思维优化方案   (1)需实现第一人称手拿着物品,但不显示手部的美工模型与动画。   把物品模型的2/3出现在屏幕左或右下方(表示左右手),1/3隐藏在屏幕下方外界,主角拿着物品走动时,应使物品有频率抖动效果。   (2)场景初始化过于突兀。   一个游戏场景需要初始化许多物体,出现逐渐渲染周围世界的效果,或者主角模型的坐标需要重置等。这些效果会导致玩家看到一些如突然瞬移,一棵树突然出现等奇怪的现象,降低游戏沉浸度。在场景开始时,保留读取界面的UI图片或背景,使其与读取界面无缝结合,等待场景物体初始化完成后(一般不会超过2秒),让玩家按下某个按键来开始游戏,可掩盖一些不应该出现的效果,使游戏平滑过场。   6 总结与展望   通过对《立方杀阵》一部分游戏模块的分析可知,在合理的情况下,使用魔术思维的游戏开发方式让游戏的程序结构更加灵活,效率更高,为游戏需求的实现增加了更多的考虑方向,更让游戏开发从技术提升为另一种领域的艺术。   但魔术思维并不适应所有的游戏开发需求,某些需求如果需要非常清楚的展示整个效果的实现过程,那么魔术思维这种伪实现方式便无法发挥作用,希望未来能继续改进,使魔术思维的运用更加广泛,完善。   参考文献   [1] 俞亮,俞文心.基于Unity的Web游戏设计与实现[J].计算机光盘软件与应用,2014(8):225-226.   [2] 王彩玲,刘瑞香,宋钊.基于Unity3D的虚拟校园漫游的设计与实现[J]. 科技视界,2015,5.   [3] Unity Technologies.Unity4.x 从入门到精通[M].北京:中国铁道出版社,2011,11.   [4] 方凯.在Unity3D中实现区域触发交互[J].科技信息,2012,28.   [5] 丁妹,胡志秋.虚拟建筑模型场景漫游系统[J].信息技术与信息化, 2005,1.
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。

我要回帖

更多关于 transform.position 的文章

 

随机推荐