收藏 分销(赏)

Unity3D游戏开发PPT.ppt

上传人:丰**** 文档编号:10263737 上传时间:2025-05-06 格式:PPT 页数:57 大小:2.35MB
下载 相关 举报
Unity3D游戏开发PPT.ppt_第1页
第1页 / 共57页
Unity3D游戏开发PPT.ppt_第2页
第2页 / 共57页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,高级软件人才实作培训专家,高级软件人才实作培训专家,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,北京传智播客教育 ,*,北京传智播客教育,Unity3D,游戏开发,讲师:杨中科,1,天神传,神,庙,逃,亡,2,最终幻想,V,武士,2,复仇,Unity3D,开发的 游戏,2,仙剑奇侠传,OL,调教三国,小小忍者,绝代双骄,Unity3D,开发的 游戏,3,游戏开发和,Unity3D,简介,演示高铁惊魂、打炮弹。,Unity3D,:跨多平台(,IOS,、,Android,、,Windows Phone,、,Windows,、,Flash,、,XBOX360,、,PS3,、,Wii,等)游戏引擎,可以开发,2D,、,2.5D,、,3D,游戏。,appstore,手机上有,1500+,款用,Unity3D,开发的游戏。,什么是游戏引擎?开发简单、高度封装(,OpenGL,、,DirectX,)。其他游戏引擎:,Cocos2d,、,UDK,、,Unreal Engine 3,、,Quest3D,等。,Why Unity3D,?跨平台;费用便宜(非开源,有免费版),4,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 Online,,大型多人在线);,RPG,(虚拟人生,浪漫庄园),2.5D,(用,2D,模拟出来的,3D,。中国,2D,网游占据,8,成市场);锁定视角,3D,(视角固定,不足够炫,但是不头晕,开发难度低,建模建,3,面即可),第三人称;第一人称;,单机游戏;网络游戏:大公司使用自主引擎,中小公司使用,Java,开发的,smartfoxserver,、,C#,开发的,Photon,(底层,C+,),等;,运营商、游戏代理、渠道商:开发商自己要处理推广、支付、打击盗版等,一般和渠道商合作分成。比如,捕鱼达人,android,版,90%,收入来自渠道。,Android,手机游戏开发的困境,渠道太多,,N,多打包;,游戏公司分工:,策划;美工;程序员;测试;客服等。黑话:主程、主美;,6,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,中比较准确)。,点击 在模拟器中启动运行,再点击停止运行,项目的保存和再次加载:一般打开,unity,场景文件。,7,8,第一个例子解析,Unity,支持,C#,和,JavaScript,,国内用,C#,的占大多数。,JavaScript,不是标准语法,叫,UnityScript,更合适。使用,Mono,实现,C#,跨平台,,C#,编辑工具也是,MonoDevlop,。如果,Unity,提示代码编译错误,则到,MonoDevelop,中,Build,一下就能看到是什么错误。脚本要取有意义的名字,脚本的名字要和类名一致。,Start,、,Update,是系统预定义的一些方法,当相应事件发生的时候系统就会调用脚本的相应方法,后续还有,OnMouseDown,、,OnGUI,,为了简化这些方法不是,override,父类的用法,类似于,Main,的调用约定。,脚本是依附于游戏对象的,事件和操作的对象也是当前脚本所在的游戏对象。脚本只能依附于游戏对象或者由其他脚本调用才会运行,一个脚本可以放到多个游戏对象上,是多个实例。一个脚本的多个实例和其他脚本之间互不干扰。,案例深入,项目运行过程中的修改不会保存。其实相当于调试时改代码立即生效的功能,只是调试结束一切调试期的修改都消失,抗锯齿:主菜单,Edit,Project Settings,Quality,,,AntiAliasing,选为,4x,(越大越平滑但是越占资源),体验跨平台:,File,Build Settings,,构建为,exe,、,flash,,如果有,android,、,ios,等开发环境还可以构建为手机软件。,理解和美工的分工:在,3dsmax,中设计出,3d,模型、贴图出来(打开“希腊圣殿场景”),然后,ribbon,按钮导出成,FBX,格式,,FBX,拖入,Project,,接着把模型拖入到,Hierarchy,,调整它的坐标。把旋转脚本拖到“圣殿”上这样圣殿也就跟着一起旋转了,把,Cube,的脚本去掉(,Inspector,中,Remove,掉,Component,即可)这样,Cube,就不旋转了。必须按照,Unity3d,标准要求设计的,3dsmax,才能正确导入,资源下载地址:,等。项目路径和,FBX,文件名不要有中文,9,编辑器的使用的使用,Scene,:,高效操作:按住鼠标右键拖放可以改变预览的时候看的方向;按住滚轮拖放可以横向改变看的部分;滚轮可以前进后退;,Hierarchy,中双击可以聚焦到元素,放大区域;点击 按钮 选中一个游戏对象拉着三个方向的箭头就可以在三个方向修改元素的位置。,方向键可以更方便的在,XZ,方向漫游,按着,Shift,可以加快速度。,Hierarchy,中,Create,的时候会自动在当前坐标创建对象,方便建模;,Inspector,:,暂时想禁用试一下的游戏对象可以在,Inspector,前的钩去掉,暂时想禁用一下的组件也可以把钩去掉,永久删掉就“,Remove Component,”,Unity,多开:建一个快捷方式加上“,-projectPath,”参数即可。,10,脚本基础,C#,脚本不支持命名空间,脚本在,Project,中的显示名称不要加,cs,,类名要和,cs,名称一致,所有类继承自,MonoBehaviour,。跟具体游戏对象无关的脚本可以放到摄像机,MainCamera,中。不要不正确的给一个游戏对象设置多个脚本对象,初始化不要放到构造函数中,而是放到,Start(),方法中。,放到游戏对象中的脚本(实例化)可以在,Inspector,中修改属性,,get/set,写法属性不被识别,直接,public,字段就能当属性用,,private,或者不写修饰符就是私有字段。,脚本中文问题:代码中有中文的话会有乱码问题。到资源管理器中打开项目的,Assets,文件夹(或点右键,Show In Explorer,),用,unity3d,目录下的,EditorDataToolsUniSciTE,下的,UniSciTE.exe,打开,cs,文件,,File,Encoding,改为,UTF-8 with BOM,,敲个空格造成修改,然后保存即可(可以修改,cs,文件打开方式更简单)。最好一开始就修改编码,否则会很麻烦。,11,程序的调试,程序的运行时调试消息输出:,Debug.Log(),,显示到,Console,视图(,window,console,打开),项目的断点调试:启动,MonoDevelop,,主菜单,Tools,Options,Unity,Debugger,的,Editor,选择,Unity,开发环境,Unity.exe,的程序的路径;然后,MonoDevelop,打开项目(注意,Unity,不要同时打开这个项目),然后主菜单,Run,Run With,Unity Debugger,就可以启动调试了。建议使用,Debug.Log(),调试,优秀程序员的素质。,12,GUI,概念,无论摄像机拍到的图像时怎么变的,,GUI,永远是显示在屏幕上,不受,变形、碰撞、光照的影响。,13,GUI,基础,GUI,部分是每帧擦除重绘的,只应该在,OnGUI,中绘制,GUI,,按钮:,GUILayout.Button(“Hello”);,只读标签:,GUILayout.Label(),修改控件的颜色:,GUI.backgroundColor=Color.red;,设置背景色,,GUI.color,设置前景色,影响,OnGUI,中之后的控件直到下次修改颜色为止。,14,15,OnGUI,易错,Hierarchy,中的游戏对象不一样,,OnGUI,是每帧擦除重绘的,(,有可能一帧调用多次)。,GUILayout.Button(“Hello”),应该理解为“画一个,Button,控件”而不是“创建一个,Button,控件”:,if(tick%10050)/,每,50,帧画一次,Buton,GUILayout.Button(Hello);,tick+;,因此,,TextBox,的输入要成员变量保存当前的值,否则输不进去。,GUILayout.TextField(“yzk”),,参数为要显示的值,返回值为用户输入的值。,username=GUILayout.TextField(username);,按钮的点击,响应按钮点击:,GUI,中没有事件概念,鼠标点击了按钮,Button,返回值就是,true,,例如:,if(GUILayout.Button(Test),Camera.mainCamera.transform.Translate(Vector3.back);,思考下面的代码有什么问题,怎么解决:,if(GUILayout.Button(Test),GUILayout.Label(Clicked Test);,案例:实现登陆功能,显示登陆结果。演练一下。常见错误:,OnGUI,大小写;文件编码;运行提示“,Compiler Error,”,16,GUILayout,布局,GUILayout,布局默认会伸展控件的尺寸。,Button,等控件支持,params GUILayoutOption options,可变参数数组,可以通过,GUILayout.Width(30),返回一个设置控件宽度的,GUILayoutOption,对象,,Height(),、,MinWidth(),、,MinHeight(),等同理。例子:,GUILayout.Button(Test,GUILayout.Width(500),GUILayout.Height(30),GUILayout,采用线性布局,类似于,StackPanel,,默认是纵向布局。通过,GUILayout.BeginHorizontal();,开启和,GUILayout.EndHorizontal(),结束一个横向排列区域,同理,BeginVertical(),、,EndVertical(),。,如果嫌控件太挤,可以使用,GUILayout.Space(30);,增加若干像素的间隙。,17,常用,GUI,控件,1,密码框:,pwd=GUILayout.PasswordField(pwd,*),,第二个参数为掩码字符,注意帧刷新的问题。,Button,只有鼠标抬起才会返回,true,,这样用,Button,做发射子弹就不能按下一直发射,可以使用,RepeatButton,,这样按下期间会一直返回,true,。案例:,Button,和,RepeatButton,实现游戏对象移动。,Tab,页:,electedToolBarId=GUILayout.Toolbar(selectedToolBarId,new string“,装备,”,“,经验,”,“,队友,”);,返回值为激活的按钮的序号。,复选框:,isMuted=GUILayout.Toggle(isMuted,“,静音,”);,多行文本区:,msgBody=GUILayout.TextArea(msgBody,GUILayout.Width(300),GUILayout.Height(300);,18,常用,GUI,控件,2,滑动条:纵向,,sliderValue=GUILayout.VerticalSlider(sliderValue,0,100);,返回值为当前值,第二个参数为最小值,第二个为最大值。,HorizontalSlider(),横向,区域,Area,,相当于一个控件的盒子,,Area,中的控件跟着,Area,移动,,BeginArea(),开始一个区域,参数指定区域的大小和坐标,,EndArea(),结束区域;,窗口,区域是没有边框和标题的,也不可以拖放。,GUILayout.Window(0,new Rect(50,50,200,200),AddWindow1,“,我的窗口,”);,第一个参数为窗口的编号,第二个为窗口大小,第三个为,void WindowFunction(int windowId),委托,用来绘制窗口内容。,窗口拖拽,在,WindowFunction,的最后调用,GUI.DragWindow(),可以启用全屏拖放(给,DragWindow,传,Rect,参数可以设定可拖放的区域)。考虑帧刷新的问题,要在,OnGUI,把,Window(),的返回,Rect,保存才可以可拖动,,Start(),中设定初始位置。,案例:点击,【,显示装备,】,显示装备窗口,点击窗口中的,【,关闭,】,按钮则关闭,19,20,贴图材质,Material,画皮,无论是,3D,的游戏对象还是,GUI,,好看的效果都是贴图上去的。给,Cube,贴图:,Project,中新建,Material,,选择颜色或者图片,然后把,Material,拖到,Cube,上。给,Sphere,设定一个地球贴图。,给,GUI,贴图:给脚本增加一个,Texture,类型的,public,字段,,GUI.DrawTexture(new Rect(100,100,100,100),MyTexture);,把,Texture,画到界面上指定区域。直接把图片从,Project,拖到脚本的,MyTexture,属性上即可。,通过代码动态加载贴图:通过代码加载的贴图等资源需要放到,Assets,的,Resources,(固定的)目录下,然后,Texture2D txt2D=(Texture2D)Resources.Load(“meinv”);,加载。注意“,meinv,”这个名字是在,Project,中的显示的名称,不用带后缀,这个名字和物理文件名可以不一样,可以改名。,做项目是推荐定义,public Texture,的做法,这样可以方便美工修改贴图,便于分工。,NGUI,、,EZGUI,。,案例:用状态机做一个游戏主菜单和选项画面。,3D,模型基础,Hierarchy,显示的是界面上的游戏对象(,GameObject,),每个游戏对象都有。至少要有一个,Camera,,点击,Camera,就可以在,Preview,中看到摄像机的视角画面。每个对象(包括摄像机)有,Position,(位置)、,Rotation,(旋转,角度)、,Scale,(缩放大小)三组属性。,Unity3D,采用的是:沿屏幕横向为,X,轴,沿屏幕纵向为,Y,轴,垂直屏幕方向为,Z,轴。右、上、,背向观众,三个方向为正方向。左手坐标系。,Vector3,是,Unity,中定义的一个含有,x,、,y,、,z,三个字段的类,可以表示位置点,也可以表示一个向量。,Vector3,乘以数值表示对向量的三个值乘以相应的值,,v1-v2,则表示从,v2,指向,v1,的向量。(复习立体几何),不要用,Unity,的拖拽开发,很难精细化调整,要手动修改,Inspector,中的属性。如果,Unity,的,Scene,视图显示不正常,就主菜单,Window,Layouts,Revert Factory Settings,,恢复出厂设置即可。,常用:,Cube,立方体、,Sphere,球体、,Capsule,胶囊。,21,游戏对象移动,transform.Translate(vector3),让对象沿着,vector3,向量的方向移动,比如,transform.Translate(new Vector3(0.2f,0.2f,0),就是,z,轴不动,向斜上方,45,度运动,每次运动的分量是,x,、,y,都是,0.2,。,Vector3,类中内置了,up,、,down,、,left,、,right,、,forward,、,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,移动,松开左键摄像头,forward,移动。,22,游戏对象旋转,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),元素围绕着摄像头运动。,23,24,世界坐标和本地坐标,世界坐标系(,world,)与本地坐标系(,local/self,)。,所有物体的世界坐标系都是相同的、不会改变。每个物体都有一个本地坐标系,当物体旋转时,本地坐标系统也会跟着物体一起旋转。,把,Cube,的,Rotation,改为,(45,45,45),,这样世界,(world),坐标和本地,(local/self),坐标就不一样了。,transform.Translate(Vector3.forward),是向自己坐标前方,,transform.Translate(Vector3.forward,Space.World),是向世界坐标前方。,案例:地球围着太阳转,游戏中每个游戏对象都对应一个,GameObject,类的实例,脚本中的,transform,等就是针对脚本依附的游戏对象的,,gameObject,属性也能拿到这个游戏对象。,在脚本中操作别的对象使用,GameObject.Find(,名字,),找到对象,尽量不要每次操作都去,Find,,效率低,而是到在,Start,中找到保存到成员字段中。改名后要回车。,PointLight,是点光源;,Spotlight,是聚光灯(探照灯);,Directional Light,是平行光,类似于太阳的普照效果;,案例,创建地球和太阳,调整他们的位置。太阳比较大,所以设定它的三个,Scale,值都为,3,;给,sun,添加金黄色的材质;给地球加一个地球的贴图。,增加一个,Point Light,点光源,让它的,xy,坐标和,sun,重合,这样就有太阳放光芒的效果了。,为保证匀速所以写到,FixedUpdate,中。,transform.RotateAround(sun.transform.position,Vector3.up,1);,25,Update,和,FixedUpdate(),Update(),受当前渲染效率的影响,有时快有时慢,帧率会变化,,Update,被调用的时间间隔就发生变化,,Time.deltaTime,获得自上次,Update,一来经历的时间,只应该在,Update(),中使用,deltaTime,,,OnGUI,等里面不要用。,FixedUpdate(),固定的时间间隔被调用,通过,Edit-Project Setting-time,设置。一般把控制运动的代码写到,FixedUpdate(),中,避免跳帧的感觉。,Time.fixedDeltaTime,获得固定的时间间隔。,OnGUI,():一般是每帧刷新一次,每帧刷新多次。画,GUI,26,地形,Terrain,主菜单,Terrain,Create Terrain,创建地形,,Terrain,Set Resolution,设定尺寸、分辨率等。,选中地形,来产生突起,,Brushes,中选择笔刷,往上拉;,往下压地形;设定地形的贴图,点击,【Edit Texture】,【Add Texture】,增加地形,选择地形图片(先导入,Unity,内置的贴图,,Assets,Import Packages,Terrain Assets,),可以添加多个贴图到,Textures,中,选择不同的,Texture,然后刷地形,这样可以实现不同的块刷不同的地形;用来生成树,先,Import Packages,Tree Creator,导入资源,点击,【Edit Trees】,【Add Tree】,,选择材质,增加多个,Tree,到,Trees,中,然后刷就可以产生树;用来产生草,用法和,Tree,差不多;,水面:,Import Packages,Water,;,Plane,和,Terrain,类似,不过没有山这些东西,就是平板。,27,SkyBox,天空盒子,天空盒子一共有六个面,可以单独设定贴图,可以导入一些内置的免费,SkyBox,。在,Project,上点右键,选择“,Import package,”“,SkyBoxes,”。然后在主菜单选择“,Edit,”“,Render Settings,”,然后再,Inspector,面板中,修改,Skybox material,,选择导入的材质即可。,28,物理引擎,物理引擎就是模拟真实世界中物体碰撞、跌落等反应的引擎,通过,Ballance,、愤怒的小鸟,来理解什么是物理引擎。,Unity,的物理引擎使用的是,NviDIA,的,PhysX,。,选中一个游戏对象,主菜单,Component,Physics,Rigidbody,,这样就添加了刚体组件。一旦给一个,GameObject,添加刚体组件,它就会受重力、碰撞等的反应,最典型的就是如果“脚下无地”就会坠落、和其他刚体碰撞会反弹、无法进入等。,Rigidbody,组件的属性:,Mass,:质量,一般不要大于,10,;,Drag,:摩擦力;,Use Gravity,:是否受重力影响,比如飞船、昆虫等漂浮的刚体就要不勾选,这样还是受碰撞等物理引擎影响的;,Freeze Position,:锁定位置,不会因为重力、碰撞等而变化位置,当然可以代码修改位置;,Freeze Rotation,:锁定旋转,如果不希望旋转则勾选;,材质:可以设定刚体是橡胶的还是木头还是冰,,Import Packages,Physic Materials,,修改*,Collider,的,Material,指向相应材料即可。案例:弹跳的小球。,29,案例,1,:第一人称摄像头,画地形;放一个,Cube,,把,MainCamera,去掉,选中,Cube,,给,Cube,增加,Camera,组件(,Component,Rendering,),这样就是把摄像头装到了,Cube,上;,编写脚本放到,Cube,上控制,Cube,前后左右移动;,Cube,会钻到地下去,给,Cube,增加刚体,但是会翻滚,因此,Freeze Rotation,;想让它飘起来,因此去掉,Use Gravity,。,练习思考:如何实现按,Shift,键加速移动。,30,案例,2,:第三人称美女漫游,Todo,:把动画提前,运动过程中放动画。,基础知识,1,:系统内置的第三人称摄像机控制脚本,,Import Package,Scripts,,把,Smooth Follow,脚本添加到,Camera,上,设置脚本组件的,Target,属性为要监视的游戏对象;这样当对象移动的时候摄像头就一直看着它,可以查看修改脚本;,基础知识,2,:在,Hierarchy,中可以把一个对象设置为一个对象的子对象,这样子对象会跟着父对象一起移动、旋转,子对象的,Position,、,Rotation,什么的也是相对于父对象的;,导入,FBX,酒娘模型,;酒娘显示的非常小,修改,Scale,放大,300,倍;让酒娘成为第三人称主角并且,Smooth Follow,。(项目路径不要有中文,,fbx,文件名不要有中文,否则可能会无法导入贴图),练习:人不会横着走,应该是按着向上箭头是前行,按住是转向。实现之!备注,1,。,完善:人不应该能穿山!刚体?试试!因为非原始模型的碰撞处理比较麻烦,性能低,一般把自定义模型放到原始模型中,给原始模型添加刚体。,31,32,给“力”,可以给游戏对象一个力,这样对象可以响应,比如愤怒的小鸟。注意添加了刚体组件才能给力,否则,rigidbody,为,null,rigidbody.AddForce(Vector3.up*10,ForceMode.Impulse);,给一个向上的为,10,的力,,Impulse,表示是冲击力,rigidbody.AddForce(new Vector3(3,3,0),ForceMode.Impulse);,给一个,x,为,3,、,y,为,3,的力,抛物线出去,案例:向对象施加一个从游戏对象指向摄像机的脉冲力,Vector3 vector=mainCam.transform.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.5f,0),ForceMode.Impulse);,就是让,Cube,围绕着,Y,轴中心旋转。,33,碰撞检测,当碰撞开始,void OnCollisionEnter(Collision col),方法调用,,col.gameObject,可以拿到被碰撞的游戏对象;,void OnCollisionStay(Collision col),方法在碰撞中每帧都会被调用;,void OnCollisionExit(Collision col),是结束碰撞的时候调用。,案例:随便放一些,Cube,,点击,【,炸弹,】,按钮给“炸弹,Sphere,”产生力,被打中的,Cube,消失(,Destroy,);点击,【,缩小,】,按钮给“药丸,Sphere,”力,被打中的,Cube,缩小,0.5,。,34,射线,Ray,射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,他将停止发射。注意这条件是逻辑上的,界面上看不到。一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等。,Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);,RaycastHit hit;,if(Physics.Raycast(ray,out hit)/,如果命中,/hit.collider.gameObject,可以获得命中的游戏对象,(*),hysics.RaycastAll,投射一条光线并返回所有碰撞,练习,1,:人在场景中行走寻找,鼠标点中的,Cube,消失。,开发打鸭子游戏,开发大炮打箱子,35,动态创建游戏对象,使用,CreatePrimitive,方法创建对象,创建出的对象不需要,Add,之类的就可以显示出来:,GameObject cube=GameObject.CreatePrimitive(PrimitiveType.Cube);,cube.AddComponent(typeof(Rigidbody);,cube.name=cube1;/,设定名字,cube.renderer.material.color=Color.red;,动态创建出来的对象运行时在,Hierarchy,中可以看到,可以帮助检查内存泄露。,克隆游戏对象产生复制对象的效率高,比如游戏中产生大量子弹。调用,Instantiate,来生成对象,,Destroy(obj),是立即销毁游戏对象,,,Destroy(obj,1),是延迟一秒销毁游戏对象:,GameObject obj=(GameObject)Instantiate(cube);,Destroy(obj,1);,36,给,GameObject,动态添加移除,动态添加脚本的方法,只要把脚本名称传递给,AddComponent,即可:,cube1.AddComponent(script1);/,把,script1,这个脚本加到,cube1,这个游戏对象上;,Destroy(cube1.GetComponent(“script1”),销毁,cube1,对象上附加的脚本组件实例,37,练习:开发大炮打箱子游戏,提前讲游戏对象的动态创建、复制,38,自定义鼠标指针,屏幕坐标系(,ScreenPoint,)是以屏幕 左下角为(,0,0,),右上角为(,Screen.Width,Screen.Height),,向上向右正方向,鼠标的位置,Input.mousePosition,是屏幕坐标系;,GUI,则是常规的以右上角为,(0,0),,向下向右为正方向。,Screen.Width,Screen.Height,是游戏屏幕的大小,不是电脑屏幕的大小;,Screen.fullScreen,读写游戏全屏状态(模拟器中不起作用);,Screen.showCursor,读写是否显示鼠标光标状态。,自定义游戏光标:,Start,中隐藏光标,Screen.showCursor=false;,声明属性,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);,39,角色控制,if(Mathf.Abs(Vector3.Distance(transform.position,targetPosition)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);,选中地形则在地形的当前位置创建对象,选中其他对象则在它位置产生一个,40,41,NavMesh,寻找路径,对于,NPC,可以采用,NavMesh,进行控制。,打开主菜单,Windows-Navigation,。在,Hierarchy,中将所有障碍物选上,在,Navigation,窗口,将,Navigation Static,打上勾,,Navigation Layer,设置为,not walkable,;,Component-Navigation-NavMeshAgent,给角色添加,NavMeshAgent,组件。,在,Navigation,窗口中,点击,【Bake】,烘焙生成路径数据。,脚本:,navmeshagent=gameObject.GetComponent();,拿到组件对象,在,Update,中,navmeshagent.SetDestination(position);,刷新显示向,position,位置走。,42,粒子系统,(,Particle System),它可以实现硝烟、火焰、雪花、水汽、爆炸等多种效果。在,Hierarchy,视图中,Create,Particle System,。可以在,Inspector,修改例子的半径、方向、产生例子的数量等参数非常强大。,可以修改粒子系统的贴图显示多姿多彩的内容,首先引入内置的贴图,在,Assets,中,Import Package,Particles,,选择倒入的粒子,然后在粒子系统组件的,Inspector,中选择,Material,属性选择即可。,声音播放,Unity,支持格式:,aiff,和,wav,为短音效;,mp3,和,ogg,为长音乐。,1,)首先项目中要有一个,AudioListener,组件,扬声器播放的声音就是,AudioListener,组件所在的位置听到的声音。默认,AudioListener,是放到,Main Camera,上。没有,AudioListener,的话是听不到声音的。,2,)把音乐拖到,Assets,中,选中要播放音乐的游戏对象(如果是鸡叫、坦克爆炸之类的声音一般放到鸡、坦克这些游戏对象上,而背景音乐等则一般放到摄像机上),点击主菜单“,Component,”“,Audio,”“,audio source,”增加,Audio,组件到,GameObject,上,然后把音乐文件拖到组件的,Audio Clip,属性上即可。,Mute,设定是否静音,,Play On Awake,为是否自动播放,,Loop,为是否循环播放,,Volumn,为音量。,43,声音的,3D,特性,Audio Listener,和,Audio Source,的空间距离决定了听到的声音的效果,比如第二人生或者浪漫庄园中离人物越远听到的声音越小就是这个原因,向右前方越来越远的声音:把音乐组件放到,cube,上,,MainCamera,为,AudioListener,,给,cube,添加如下脚本:,void Update(),transform.Translate(new Vector3(1,0
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服