Unity3D游戏开发.ppt

上传人:牧羊曲112 文档编号:5451656 上传时间:2023-07-08 格式:PPT 页数:57 大小:2.01MB
返回 下载 相关 举报
Unity3D游戏开发.ppt_第1页
第1页 / 共57页
Unity3D游戏开发.ppt_第2页
第2页 / 共57页
Unity3D游戏开发.ppt_第3页
第3页 / 共57页
Unity3D游戏开发.ppt_第4页
第4页 / 共57页
Unity3D游戏开发.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《Unity3D游戏开发.ppt》由会员分享,可在线阅读,更多相关《Unity3D游戏开发.ppt(57页珍藏版)》请在三一办公上搜索。

1、北京传智播客教育,Unity3D游戏开发,讲师:杨中科,天神传,神庙逃亡 2,最终幻想V,武士2复仇,Unity3D开发的 游戏,仙剑奇侠传OL,调教三国,小小忍者,绝代双骄,Unity3D开发的 游戏,游戏开发和Unity3D简介,演示高铁惊魂、打炮弹。Unity3D:跨多平台(IOS、Android、Windows Phone、Windows、Flash、XBOX360、PS3、Wii等)游戏引擎,可以开发2D、2.5D、3D游戏。appstore手机上有1500+款用Unity3D开发的游戏。什么是游戏引擎?开发简单、高度封装(OpenGL、DirectX)。其他游戏引擎:Cocos2d

2、、UDK、Unreal Engine 3、Quest3D等。Why Unity3D?跨平台;费用便宜(非开源,有免费版),5,游戏开发待遇,0809就业班冯伟,深圳一家小公司,Unity3D手机2D游戏开发,试用期工资8.5。,5000以下占25%;50007500元占23%;1万以上16%;金山奖励剑侠世界的项目组成员,3辆宝马3,4辆马自达6,游戏开发常识,游戏术语:手游(新增长点);网游(捉迷藏OL,U3D);端游(需要下载客户端);页游(WebGame)FPS(First Person Shoot/Frame Per second);MMO(Massively Multiplayer

3、Online,大型多人在线);RPG(虚拟人生,浪漫庄园)2.5D(用2D模拟出来的3D。中国2D网游占据8成市场);锁定视角3D(视角固定,不足够炫,但是不头晕,开发难度低,建模建3面即可)第三人称;第一人称;单机游戏;网络游戏:大公司使用自主引擎,中小公司使用Java开发的 smartfoxserver、C#开发的Photon(底层C+)等;运营商、游戏代理、渠道商:开发商自己要处理推广、支付、打击盗版等,一般和渠道商合作分成。比如捕鱼达人android版90%收入来自渠道。Android手机游戏开发的困境,渠道太多,N多打包;游戏公司分工:策划;美工;程序员;测试;客服等。黑话:主程、主

4、美;,Unity3D基本使用,通过一个例子理解U3D开发工具使用(对坐标系暂时先了解):Hierarchy中Create一个Cube立方体,在Inspector中修改它的Position XYZ为0;添加一个光源照亮场景Directional light,Position XYZ为(0,2,2);修改摄像机MainCamera(摄像机看到的就是屏幕看到的)的Position为(0,2,-6),看起来清楚一些Project中Create一个C#Script,编写一个拖动Cube旋转Cube的功能。见备注,先粘贴过来能运行即可。把脚本拖到Cube上(拖到Hierarchy中比较准确)。点击 在模拟

5、器中启动运行,再点击停止运行项目的保存和再次加载:一般打开unity场景文件。,8,第一个例子解析,Unity支持C#和JavaScript,国内用C#的占大多数。JavaScript不是标准语法,叫UnityScript更合适。使用Mono实现C#跨平台,C#编辑工具也是MonoDevlop。如果Unity提示代码编译错误,则到MonoDevelop中Build一下就能看到是什么错误。脚本要取有意义的名字,脚本的名字要和类名一致。Start、Update是系统预定义的一些方法,当相应事件发生的时候系统就会调用脚本的相应方法,后续还有OnMouseDown、OnGUI,为了简化这些方法不是ov

6、erride父类的用法,类似于Main的调用约定。脚本是依附于游戏对象的,事件和操作的对象也是当前脚本所在的游戏对象。脚本只能依附于游戏对象或者由其他脚本调用才会运行,一个脚本可以放到多个游戏对象上,是多个实例。一个脚本的多个实例和其他脚本之间互不干扰。,案例深入,项目运行过程中的修改不会保存。其实相当于调试时改代码立即生效的功能,只是调试结束一切调试期的修改都消失抗锯齿:主菜单EditProject SettingsQuality,AntiAliasing选为4x(越大越平滑但是越占资源)体验跨平台:FileBuild Settings,构建为exe、flash,如果有android、ios

7、等开发环境还可以构建为手机软件。理解和美工的分工:在3dsmax中设计出3d模型、贴图出来(打开“希腊圣殿场景”),然后ribbon按钮导出成FBX格式,FBX拖入Project,接着把模型拖入到Hierarchy,调整它的坐标。把旋转脚本拖到“圣殿”上这样圣殿也就跟着一起旋转了,把Cube的脚本去掉(Inspector中Remove掉Component即可)这样Cube就不旋转了。必须按照Unity3d标准要求设计的3dsmax才能正确导入,资源下载地址:等。项目路径和FBX文件名不要有中文,编辑器的使用的使用,Scene:高效操作:按住鼠标右键拖放可以改变预览的时候看的方向;按住滚轮拖放可

8、以横向改变看的部分;滚轮可以前进后退;Hierarchy中双击可以聚焦到元素,放大区域;点击 按钮 选中一个游戏对象拉着三个方向的箭头就可以在三个方向修改元素的位置。方向键可以更方便的在XZ方向漫游,按着Shift可以加快速度。Hierarchy中Create的时候会自动在当前坐标创建对象,方便建模;Inspector:暂时想禁用试一下的游戏对象可以在Inspector前的钩去掉暂时想禁用一下的组件也可以把钩去掉,永久删掉就“Remove Component”Unity多开:建一个快捷方式加上“-projectPath”参数即可。,脚本基础,C#脚本不支持命名空间,脚本在Project中的显示

9、名称不要加cs,类名要和cs名称一致,所有类继承自MonoBehaviour。跟具体游戏对象无关的脚本可以放到摄像机MainCamera中。不要不正确的给一个游戏对象设置多个脚本对象初始化不要放到构造函数中,而是放到Start()方法中。放到游戏对象中的脚本(实例化)可以在Inspector中修改属性,get/set写法属性不被识别,直接public字段就能当属性用,private或者不写修饰符就是私有字段。脚本中文问题:代码中有中文的话会有乱码问题。到资源管理器中打开项目的Assets文件夹(或点右键Show In Explorer),用unity3d目录下的EditorDataToolsU

10、niSciTE下的UniSciTE.exe打开cs文件,FileEncoding改为UTF-8 with BOM,敲个空格造成修改,然后保存即可(可以修改cs文件打开方式更简单)。最好一开始就修改编码,否则会很麻烦。,程序的调试,程序的运行时调试消息输出:Debug.Log(),显示到Console视图(windowconsole打开)项目的断点调试:启动MonoDevelop,主菜单ToolsOptionsUnityDebugger的Editor选择Unity开发环境Unity.exe的程序的路径;然后MonoDevelop打开项目(注意Unity不要同时打开这个项目),然后主菜单RunRu

11、n WithUnity Debugger就可以启动调试了。建议使用Debug.Log()调试,优秀程序员的素质。,GUI概念,无论摄像机拍到的图像时怎么变的,GUI永远是显示在屏幕上,不受变形、碰撞、光照的影响。,GUI基础,GUI部分是每帧擦除重绘的,只应该在OnGUI中绘制GUI,按钮:GUILayout.Button(“Hello”);只读标签:GUILayout.Label()修改控件的颜色:GUI.backgroundColor=Color.red;设置背景色,GUI.color设置前景色,影响OnGUI中之后的控件直到下次修改颜色为止。,15,OnGUI易错,Hierarchy中的

12、游戏对象不一样,OnGUI是每帧擦除重绘的(有可能一帧调用多次)。GUILayout.Button(“Hello”)应该理解为“画一个Button控件”而不是“创建一个Button控件”:if(tick%10050)/每50帧画一次ButonGUILayout.Button(Hello);tick+;因此,TextBox的输入要成员变量保存当前的值,否则输不进去。GUILayout.TextField(“yzk”),参数为要显示的值,返回值为用户输入的值。username=GUILayout.TextField(username);,按钮的点击,响应按钮点击:GUI中没有事件概念,鼠标点击了按

13、钮Button返回值就是true,例如:if(GUILayout.Button(Test)Camera.mainCamera.transform.Translate(Vector3.back);思考下面的代码有什么问题,怎么解决:if(GUILayout.Button(Test)GUILayout.Label(Clicked Test);案例:实现登陆功能,显示登陆结果。演练一下。常见错误:OnGUI大小写;文件编码;运行提示“Compiler Error”,GUILayout布局,GUILayout布局默认会伸展控件的尺寸。Button等控件支持params GUILayoutOption

14、options可变参数数组,可以通过GUILayout.Width(30)返回一个设置控件宽度的GUILayoutOption对象,Height()、MinWidth()、MinHeight()等同理。例子:GUILayout.Button(Test,GUILayout.Width(500),GUILayout.Height(30)GUILayout采用线性布局,类似于StackPanel,默认是纵向布局。通过GUILayout.BeginHorizontal();开启和GUILayout.EndHorizontal()结束一个横向排列区域,同理BeginVertical()、EndVerti

15、cal()。如果嫌控件太挤,可以使用GUILayout.Space(30);增加若干像素的间隙。,常用GUI控件1,密码框:pwd=GUILayout.PasswordField(pwd,*),第二个参数为掩码字符,注意帧刷新的问题。Button只有鼠标抬起才会返回true,这样用Button做发射子弹就不能按下一直发射,可以使用RepeatButton,这样按下期间会一直返回true。案例:Button和RepeatButton实现游戏对象移动。Tab页:electedToolBarId=GUILayout.Toolbar(selectedToolBarId,new string“装备”,“

16、经验”,“队友”);返回值为激活的按钮的序号。复选框:isMuted=GUILayout.Toggle(isMuted,“静音”);多行文本区:msgBody=GUILayout.TextArea(msgBody,GUILayout.Width(300),GUILayout.Height(300);,常用GUI控件2,滑动条:纵向,sliderValue=GUILayout.VerticalSlider(sliderValue,0,100);返回值为当前值,第二个参数为最小值,第二个为最大值。HorizontalSlider()横向区域Area,相当于一个控件的盒子,Area中的控件跟着Are

17、a移动,BeginArea()开始一个区域,参数指定区域的大小和坐标,EndArea()结束区域;窗口,区域是没有边框和标题的,也不可以拖放。GUILayout.Window(0,new Rect(50,50,200,200),AddWindow1,“我的窗口”);第一个参数为窗口的编号,第二个为窗口大小,第三个为void WindowFunction(int windowId)委托,用来绘制窗口内容。窗口拖拽,在WindowFunction的最后调用GUI.DragWindow()可以启用全屏拖放(给DragWindow传Rect参数可以设定可拖放的区域)。考虑帧刷新的问题,要在OnGUI把

18、Window()的返回Rect保存才可以可拖动,Start()中设定初始位置。案例:点击【显示装备】显示装备窗口,点击窗口中的【关闭】按钮则关闭,20,贴图材质Material 画皮,无论是3D的游戏对象还是GUI,好看的效果都是贴图上去的。给Cube贴图:Project中新建Material,选择颜色或者图片,然后把Material拖到Cube上。给Sphere设定一个地球贴图。给GUI贴图:给脚本增加一个Texture类型的public字段,GUI.DrawTexture(new Rect(100,100,100,100),MyTexture);把Texture画到界面上指定区域。直接把图

19、片从Project拖到脚本的MyTexture属性上即可。通过代码动态加载贴图:通过代码加载的贴图等资源需要放到Assets的Resources(固定的)目录下,然后Texture2D txt2D=(Texture2D)Resources.Load(“meinv”);加载。注意“meinv”这个名字是在Project中的显示的名称,不用带后缀,这个名字和物理文件名可以不一样,可以改名。做项目是推荐定义public Texture的做法,这样可以方便美工修改贴图,便于分工。NGUI、EZGUI。案例:用状态机做一个游戏主菜单和选项画面。,3D模型基础,Hierarchy显示的是界面上的游戏对象(

20、GameObject),每个游戏对象都有。至少要有一个Camera,点击Camera就可以在Preview中看到摄像机的视角画面。每个对象(包括摄像机)有Position(位置)、Rotation(旋转,角度)、Scale(缩放大小)三组属性。Unity3D采用的是:沿屏幕横向为X轴,沿屏幕纵向为Y轴,垂直屏幕方向为Z轴。右、上、背向观众三个方向为正方向。左手坐标系。Vector3是Unity中定义的一个含有x、y、z三个字段的类,可以表示位置点,也可以表示一个向量。Vector3乘以数值表示对向量的三个值乘以相应的值,v1-v2则表示从v2指向v1的向量。(复习立体几何)不要用Unity的拖

21、拽开发,很难精细化调整,要手动修改Inspector中的属性。如果Unity的Scene视图显示不正常,就主菜单WindowLayoutsRevert Factory Settings,恢复出厂设置即可。常用:Cube立方体、Sphere球体、Capsule胶囊。,游戏对象移动,transform.Translate(vector3)让对象沿着vector3向量的方向移动,比如transform.Translate(new Vector3(0.2f,0.2f,0)就是z轴不动,向斜上方45度运动,每次运动的分量是x、y都是0.2。Vector3类中内置了up、down、left、right、f

22、orward、back、zero几个简化的静态成员。鼠标判断:Input.GetMouseButtonDown(0)、GetMouseButtonUp、GetMouseButton。GetMouseButton也是只要按下就一直返回true。案例:键盘方向键控制元素移动。键盘判断:Input.GetKeyDown(KeyCode.Space),Input.GetKeyUp(KeyCode.LeftArrow),Input.GetKey(KeyCode.A),GetKey像RepeatButton一样只要按下保持住就一直返回true。案例点鼠标摄像头产生后坐力,按下左键摄像头back移动,松开左

23、键摄像头forward移动。,游戏对象旋转,Unity是左手坐标系,比如transform.Rotate(Vector3.right);是大拇指指向右方,四指指向的方向就是旋转的方向。案例:键盘控制对象围绕XY轴旋转。见备注。练习:左右上下键控制摄像头摇头,滚轮(todo)控制摄像头前进后退RotateAround(v1,v2,angle),元素围绕着世界坐标的v1点采用v2向量旋转angle角度。案例:FixedUpdate中transform.RotateAround(Camera.mainCamera.transform.position,Vector3.up,0.5f)元素围绕着摄像头

24、运动。,24,世界坐标和本地坐标,世界坐标系(world)与本地坐标系(local/self)。所有物体的世界坐标系都是相同的、不会改变。每个物体都有一个本地坐标系,当物体旋转时,本地坐标系统也会跟着物体一起旋转。把Cube的Rotation改为(45,45,45),这样世界(world)坐标和本地(local/self)坐标就不一样了。transform.Translate(Vector3.forward)是向自己坐标前方,transform.Translate(Vector3.forward,Space.World)是向世界坐标前方。,案例:地球围着太阳转,游戏中每个游戏对象都对应一个Ga

25、meObject类的实例,脚本中的transform等就是针对脚本依附的游戏对象的,gameObject属性也能拿到这个游戏对象。在脚本中操作别的对象使用GameObject.Find(名字)找到对象,尽量不要每次操作都去Find,效率低,而是到在Start中找到保存到成员字段中。改名后要回车。PointLight是点光源;Spotlight是聚光灯(探照灯);Directional Light是平行光,类似于太阳的普照效果;案例创建地球和太阳,调整他们的位置。太阳比较大,所以设定它的三个Scale值都为3;给sun添加金黄色的材质;给地球加一个地球的贴图。增加一个Point Light点光源

26、,让它的xy坐标和sun重合,这样就有太阳放光芒的效果了。为保证匀速所以写到FixedUpdate中。transform.RotateAround(sun.transform.position,Vector3.up,1);,Update和FixedUpdate(),Update()受当前渲染效率的影响,有时快有时慢,帧率会变化,Update被调用的时间间隔就发生变化,Time.deltaTime获得自上次Update一来经历的时间,只应该在Update()中使用deltaTime,OnGUI等里面不要用。FixedUpdate()固定的时间间隔被调用,通过Edit-Project Settin

27、g-time设置。一般把控制运动的代码写到FixedUpdate()中,避免跳帧的感觉。Time.fixedDeltaTime获得固定的时间间隔。OnGUI():一般是每帧刷新一次,每帧刷新多次。画GUI,地形Terrain,主菜单TerrainCreate Terrain创建地形,TerrainSet Resolution设定尺寸、分辨率等。选中地形,来产生突起,Brushes中选择笔刷,往上拉;往下压地形;设定地形的贴图,点击【Edit Texture】【Add Texture】增加地形,选择地形图片(先导入Unity内置的贴图,AssetsImport PackagesTerrain A

28、ssets),可以添加多个贴图到Textures中,选择不同的Texture然后刷地形,这样可以实现不同的块刷不同的地形;用来生成树,先Import PackagesTree Creator导入资源,点击【Edit Trees】【Add Tree】,选择材质,增加多个Tree到Trees中,然后刷就可以产生树;用来产生草,用法和Tree差不多;水面:Import PackagesWater;Plane和Terrain类似,不过没有山这些东西,就是平板。,SkyBox天空盒子,天空盒子一共有六个面,可以单独设定贴图,可以导入一些内置的免费SkyBox。在Project上点右键,选择“Import

29、 package”“SkyBoxes”。然后在主菜单选择“Edit”“Render Settings”,然后再Inspector面板中,修改Skybox material,选择导入的材质即可。,物理引擎,物理引擎就是模拟真实世界中物体碰撞、跌落等反应的引擎,通过Ballance、愤怒的小鸟来理解什么是物理引擎。Unity的物理引擎使用的是NviDIA的PhysX。选中一个游戏对象,主菜单ComponentPhysicsRigidbody,这样就添加了刚体组件。一旦给一个GameObject添加刚体组件,它就会受重力、碰撞等的反应,最典型的就是如果“脚下无地”就会坠落、和其他刚体碰撞会反弹、无法

30、进入等。Rigidbody组件的属性:Mass:质量,一般不要大于10;Drag:摩擦力;Use Gravity:是否受重力影响,比如飞船、昆虫等漂浮的刚体就要不勾选,这样还是受碰撞等物理引擎影响的;Freeze Position:锁定位置,不会因为重力、碰撞等而变化位置,当然可以代码修改位置;Freeze Rotation:锁定旋转,如果不希望旋转则勾选;材质:可以设定刚体是橡胶的还是木头还是冰,Import PackagesPhysic Materials,修改*Collider 的Material指向相应材料即可。案例:弹跳的小球。,案例1:第一人称摄像头,画地形;放一个Cube,把Ma

31、inCamera去掉,选中Cube,给Cube增加Camera组件(ComponentRendering),这样就是把摄像头装到了Cube上;编写脚本放到Cube上控制Cube前后左右移动;Cube会钻到地下去,给Cube增加刚体,但是会翻滚,因此Freeze Rotation;想让它飘起来,因此去掉Use Gravity。练习思考:如何实现按Shift键加速移动。,案例2:第三人称美女漫游,Todo:把动画提前,运动过程中放动画。基础知识1:系统内置的第三人称摄像机控制脚本,Import PackageScripts,把Smooth Follow脚本添加到Camera上,设置脚本组件的Tar

32、get属性为要监视的游戏对象;这样当对象移动的时候摄像头就一直看着它,可以查看修改脚本;基础知识2:在Hierarchy中可以把一个对象设置为一个对象的子对象,这样子对象会跟着父对象一起移动、旋转,子对象的Position、Rotation什么的也是相对于父对象的;导入FBX酒娘模型;酒娘显示的非常小,修改Scale放大300倍;让酒娘成为第三人称主角并且Smooth Follow。(项目路径不要有中文,fbx文件名不要有中文,否则可能会无法导入贴图)练习:人不会横着走,应该是按着向上箭头是前行,按住是转向。实现之!备注1。完善:人不应该能穿山!刚体?试试!因为非原始模型的碰撞处理比较麻烦,性

33、能低,一般把自定义模型放到原始模型中,给原始模型添加刚体。,32,给“力”,可以给游戏对象一个力,这样对象可以响应,比如愤怒的小鸟。注意添加了刚体组件才能给力,否则rigidbody为nullrigidbody.AddForce(Vector3.up*10,ForceMode.Impulse);给一个向上的为10的力,Impulse表示是冲击力rigidbody.AddForce(new Vector3(3,3,0),ForceMode.Impulse);给一个x为3、y为3的力,抛物线出去案例:向对象施加一个从游戏对象指向摄像机的脉冲力Vector3 vector=mainCam.trans

34、form.position-cube1.transform.position;/v1-v2为从v2指向v1的向量cube1.rigidbody.AddForce(vector*20);练习:开发打鸭子、水果忍者游戏;,给“力”2(*),AddForceAtPosition(Vector3 force,Vector3 position),则是在position这个点施加一个force方向的力。AddTorque是增加一扭矩力,第一个参数是设定围绕旋转的中心点以及向量大小,如果Cube放到(0,0,0)这个位置,则cube1.rigidbody.AddTorque(new Vector3(0,0.

35、5f,0),ForceMode.Impulse);就是让Cube围绕着Y轴中心旋转。,碰撞检测,当碰撞开始void OnCollisionEnter(Collision col)方法调用,col.gameObject可以拿到被碰撞的游戏对象;void OnCollisionStay(Collision col)方法在碰撞中每帧都会被调用;void OnCollisionExit(Collision col)是结束碰撞的时候调用。案例:随便放一些Cube,点击【炸弹】按钮给“炸弹Sphere”产生力,被打中的Cube消失(Destroy);点击【缩小】按钮给“药丸Sphere”力,被打中的Cub

36、e缩小0.5。,射线Ray,射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,他将停止发射。注意这条件是逻辑上的,界面上看不到。一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等。Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if(Physics.Raycast(ray,out hit)/如果命中可以获得命中的游戏对象(*)hysics.RaycastAll投射一条光线并返回所有碰撞练习1:人在场景中行走寻找,鼠标点中的Cube消失。开发打鸭子游戏,开发大炮打箱子,

37、动态创建游戏对象,使用CreatePrimitive方法创建对象,创建出的对象不需要Add之类的就可以显示出来:GameObject cube=GameObject.CreatePrimitive(PrimitiveType.Cube);cube.AddComponent(typeof(Rigidbody);cube.name=cube1;/设定名字cube.renderer.material.color=Color.red;动态创建出来的对象运行时在Hierarchy中可以看到,可以帮助检查内存泄露。克隆游戏对象产生复制对象的效率高,比如游戏中产生大量子弹。调用Instantiate来生成对

38、象,Destroy(obj)是立即销毁游戏对象,Destroy(obj,1)是延迟一秒销毁游戏对象:GameObject obj=(GameObject)Instantiate(cube);Destroy(obj,1);,给GameObject动态添加移除,动态添加脚本的方法,只要把脚本名称传递给AddComponent即可:cube1.AddComponent(script1);/把script1这个脚本加到cube1这个游戏对象上;Destroy(cube1.GetComponent(“script1”)销毁cube1对象上附加的脚本组件实例,练习:开发大炮打箱子游戏,提前讲游戏对象的动态

39、创建、复制,自定义鼠标指针,屏幕坐标系(ScreenPoint)是以屏幕 左下角为(0,0),右上角为(Screen.Width,Screen.Height),向上向右正方向,鼠标的位置Input.mousePosition 是屏幕坐标系;GUI则是常规的以右上角为(0,0),向下向右为正方向。Screen.Width,Screen.Height是游戏屏幕的大小,不是电脑屏幕的大小;Screen.fullScreen读写游戏全屏状态(模拟器中不起作用);Screen.showCursor读写是否显示鼠标光标状态。自定义游戏光标:Start中隐藏光标 Screen.showCursor=fals

40、e;声明属性 public Texture CursorTexture;找一个png格式鼠标图片放到Project中,然后拖到CursorTexture属性上;OnGUI中:Vector3 mousePos=Input.mousePosition;GUI.DrawTexture(new Rect(mousePos.x,Screen.height-mousePos.y,CursorTexture.width,CursorTexture.height),CursorTexture);,角色控制,if(Mathf.Abs(Vector3.Distance(transform.position,tar

41、getPosition)1)CharacterController charCtrl=gameObject.GetComponent();transform.LookAt(new Vector3(targetPosition.x,transform.position.y,targetPosition.z);float speed=0.1f;Vector3 nextPos=Vector3.ClampMagnitude(targetPosition-transform.position,speed);charCtrl.Move(nextPos);选中地形则在地形的当前位置创建对象,选中其他对象则在

42、它位置产生一个,41,NavMesh寻找路径,对于NPC可以采用NavMesh进行控制。打开主菜单Windows-Navigation。在Hierarchy中将所有障碍物选上,在Navigation窗口,将Navigation Static打上勾,Navigation Layer 设置为not walkable;Component-Navigation-NavMeshAgent给角色添加NavMeshAgent组件。在Navigation窗口中,点击【Bake】烘焙生成路径数据。脚本:navmeshagent=gameObject.GetComponent();拿到组件对象在Update中na

43、vmeshagent.SetDestination(position);刷新显示向position位置走。,42,粒子系统(Particle System),它可以实现硝烟、火焰、雪花、水汽、爆炸等多种效果。在Hierarchy视图中CreateParticle System。可以在Inspector修改例子的半径、方向、产生例子的数量等参数非常强大。可以修改粒子系统的贴图显示多姿多彩的内容,首先引入内置的贴图,在Assets中Import PackageParticles,选择倒入的粒子,然后在粒子系统组件的Inspector中选择Material属性选择即可。,声音播放,Unity支持格式

44、:aiff和wav为短音效;mp3和ogg为长音乐。1)首先项目中要有一个AudioListener组件,扬声器播放的声音就是AudioListener组件所在的位置听到的声音。默认AudioListener是放到Main Camera上。没有AudioListener的话是听不到声音的。2)把音乐拖到Assets中,选中要播放音乐的游戏对象(如果是鸡叫、坦克爆炸之类的声音一般放到鸡、坦克这些游戏对象上,而背景音乐等则一般放到摄像机上),点击主菜单“Component”“Audio”“audio source”增加Audio组件到GameObject上,然后把音乐文件拖到组件的Audio Cl

45、ip属性上即可。Mute设定是否静音,Play On Awake为是否自动播放,Loop为是否循环播放,Volumn为音量。,声音的3D特性,Audio Listener和Audio Source的空间距离决定了听到的声音的效果,比如第二人生或者浪漫庄园中离人物越远听到的声音越小就是这个原因向右前方越来越远的声音:把音乐组件放到cube上,MainCamera为AudioListener,给cube添加如下脚本:void Update()transform.Translate(new Vector3(1,0,1)*Time.deltaTime);环绕声音,把上面的Update代码改成:tran

46、sform.RotateAround(Camera.main.transform.position,Vector3.up,1);,模型动画1,1)在3dsmax、maya中设计模型和动画,导出fbx格式。有的3dsmax文件导出fbx会有问题,比如导出没有贴图、没有动画等,主要是制作不标准。2)将生成的fbx文件拖到Unity的Project的assets中,选中Project中的fbx文件(注意不是Hierarchy中的),在Inspector中的Animations页签中进行动画剪辑。美工给的动画是几个动作连续播放的,需要剪辑成单独的动作。点击加号增加动作片段(clip),输入开始帧(st

47、art)和结束帧(end),给这个片段的动作取一个名字,然后别忘了点击【Apply】按钮,这样就完成了一个片段的编辑。如果美工给了每个动画的起止帧最简单填上即可,如果是下载的别人的,不知道每个片段的起止帧,那只能start填上一个片段的end+1,end尝试输入结束帧的号码,微调后点击 预览自己确定。,模型动画2,3)片段切割完毕要把片段授权,否则运行的时候会提示没有legacy或者gameobject中没有animation组件。切换到Rig,Animation Type选择“legacy”,Generation选择“Store in Root”,点击【apply】按钮。4)把fbx拖到Hi

48、erarchy或者Scene中这样就成为GameObject了5)播放动画:gameObject.animation.Play(walk);,配置信息保存,PlayerPrefs提供了读写键值对配置信息的方法,只适合读写简单的数据。HasKey、Get*、Set*。复杂的数据要使用IO操作,就是普通的.Net IO操作,Application.dataPath取得为应用程序分配的数据文件夹的路径。,多场景,FileNewScene来创建新的场景,Unity只能同时打开一个场景。新创建的场景需要手动添加到BuildSettings中,主菜单FileBuild Settings,点击【AddCur

49、rent】按钮就可以将当前场景添加进入,按delete键删除,通过鼠标拖动修改顺序。第二列为场景的id,id为0的场景为程序的第一个场景通过Application.LoadLevel()来通过名字(不带.unity后缀)或者id加载场景(*)Application.LoadLevelAysnc()则可以异步加载场景。Application.loadedLevelName可以获得当前场景的名字。,资源的动态加载,可以动态加载资源,动态加载的资源要放到Assets的Resources路径下。使用Resources.Load加载,不用指定文件名:Texture2D txt2d=(Texture2D)

50、Resources.Load(1);如果加载FBX模型的话,使用模型的主显示名,加载出来的虽然也是GameObject对象,但是不会显示到Hierarchy中,需要Instantiate()复制一个实例才能显示出来。见备注。案例:游戏选项画面:选择人物,人物3D旋转,把选择的人物记录到配置文件中,游戏主画面中就使用这个人物。Xml配置角色信息。,50,Coroutine,Unity中使用StartCoroutine实现异步操作的效果,类似于Win8中的async。Yield原理见备注。一个方法如果是异步的则需要返回IEnumerator类型的,必须有至少一个yield return,使用Sta

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号