Unity3D游戏开发.ppt
《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点光源
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Unity3D 游戏 开发
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5451656.html