—高级软件人才实作培训专家北京传智播客教育net.itcast.cnUnity3D游戏开发讲师:杨中科—高级软件人才实作培训专家天神传神庙逃亡2最终幻想V武士2复仇Unity3D开发的游戏—高级软件人才实作培训专家仙剑奇侠传OL调教三国小小忍者绝代双骄Unity3D开发的游戏—高级软件人才实作培训专家游戏开发和Unity3D简介演示高铁惊魂、打炮弹。Unity3D:跨多平台(IOS、Android、WindowsPhone、Windows、Flash、XBOX360、PS3、Wii等)游戏引擎,可以开发2D、2.5D、3D游戏。appstore手机上有1500+款用Unity3D开发的游戏。什么是游戏引擎?开发简单、高度封装(OpenGL、DirectX)。其他游戏引擎:Cocos2d、UDK、UnrealEngine3、Quest3D等。WhyUnity3D?跨平台;费用便宜(非开源,有免费版)—高级软件人才实作培训专家5游戏开发待遇0809就业班冯伟,深圳一家小公司,Unity3D手机2D游戏开发,试用期工资8.5。5000以下占25%;5000~7500元占23%;1万以上16%;金山奖励《剑侠世界》的项目组成员,3辆宝马3,4辆马自达6—高级软件人才实作培训专家游戏开发常识游戏术语:手游(新增长点);网游(捉迷藏OL,U3D);端游(需要下载客户端);页游(WebGame)FPS(FirstPersonShoot/FramePersecond);MMO(MassivelyMultiplayerOnline,大型多人在线);RPG(虚拟人生,浪漫庄园)2.5D(用2D模拟出来的3D。中国2D网游占据8成市场);锁定视角3D(视角固定,不足够炫,但是不头晕,开发难度低,建模建3面即可)第三人称;第一人称;单机游戏;网络游戏:大公司使用自主引擎,中小公司使用Java开发的smartfoxserver、C#开发的Photon(底层C++)等;运营商、游戏代理、渠道商:开发商自己要处理推广、支付、打击盗版等,一般和渠道商合作分成。比如《捕鱼达人》android版90%收入来自渠道。Android手机游戏开发的困境,渠道太多,N多打包;游戏公司分工:策划;美工;程序员;测试;客服等。黑话:主程、主美;—高级软件人才实作培训专家Unity3D基本使用通过一个例子理解U3D开发工具使用(对坐标系暂时先了解):Hierarchy中Create一个Cube立方体,在Inspector中修改它的PositionXYZ为0;添加一个光源照亮场景Directionallight,PositionXYZ为(0,2,2);修改摄像机MainCamera(摄像机看到的就是屏幕看到的)的Position为(0,2,-6),看起来清楚一些Project中Create一个C#Script,编写一个拖动Cube旋转Cube的功能。见备注,先粘贴过来能运行即可。把脚本拖到Cube上(拖到Hierarchy中比较准确)。点击在模拟器中启动运行,再点击停止运行项目的保存和再次加载:一般打开unity场景文件。—高级软件人才实作培训专家8第一个例子解析Unity支持C#和JavaScript,国内用C#的占大多数。JavaScript不是标准语法,叫UnityScript更合适。使用Mono实现C#跨平台,C#编辑工具也是MonoDevlop。如果Unity提示代码编译错误,则到MonoDevelop中Build一下就能看到是什么错误。脚本要取有意义的名字,脚本的名字要和类名一致。Start、Update是系统预定义的一些方法,当相应事件发生的时候系统就会调用脚本的相应方法,后续还有OnMouseDown、OnGUI,为了简化这些方法不是override父类的用法,类似于Main的调用约定。脚本是依附于游戏对象的,事件和操作的对象也是当前脚本所在的游戏对象。脚本只能依附于游戏对象或者由其他脚本调用才会运行,一个脚本可以放到多个游戏对象上,是多个实例。一个脚本的多个实例和其他脚本之间互不干扰。—高级软件人才实作培训专家案例深入项目运行过程中的修改不会保存。其实相当于调试时改代码立即生效的功能,只是调试结束一切调试期的修改都消失抗锯齿:主菜单→Edit→ProjectSettings→Quality,AntiAliasing选为4x(越大越平滑但是越占资源)体验跨平台:File→BuildSettings,构建为exe、flash,如果有android、ios等开发环境还可以构建为手机软件。理解和美工的分工:在3dsmax中设计出3d模型、贴图出来(打开“希腊圣殿场景”),然后ribbon按钮→导出成FBX格式,FBX拖入Project,接着把模型拖入到Hierarchy,调整它的坐标。把旋转脚本拖到“圣殿”上这样圣殿也就跟着一起旋转了,把Cube的脚本去掉(Inspector中Remove掉Component即可)这样Cube就不旋转了。必须按照Unity3d标准要求设计的3dsmax才能正确导入,资源下载地址:等。项目路径和FBX文件名不要有中文—高级软件人才实作培训专家编辑器的使用的使用Scene:高效操作:按住鼠标右键拖放可以改变预览的时候看的方向;按住滚轮拖放可以横向改变看的部分;滚轮可以前进后退;Hierarchy中双击可以聚焦到元素,放大区域;点击按钮选中一个游戏对象拉着三个方向的箭头就可以在三个方向修改元素的位置。方向键可以更方便的在XZ方向漫游,按着Shift可以加快速度。Hierarchy中Create的时候会自动在当前坐标创建对象,方便建模;Inspector:暂时想禁用试一下的游戏对象可以在Inspector前的钩去掉暂时想禁用一下的组件也可以把钩去掉,永久删掉就“RemoveComponent”Unity多开:建一个快捷方式加上“-projectPath”参数即可。—高级软件人才实作培训专家脚本基础C#脚本不支持命名空间,脚本在Project中的显示名称不要加cs,类名要和cs名称一致,所有类继承自MonoBehaviour。跟具体游戏对象无关的脚本可以放到摄像机MainCamera中。不要不正确的给一个游戏对象设置多个脚本对象初始化不要放到构造函数中,而是放到Start()方法中。放到游戏对象中的脚本(实例化)可以在Inspector中修改属性,get/set写法属性不被识别,直接public字段就能当属性用,private或者不写修饰符就是私有字段。脚本中文问题:代码中有中文的话会有乱码问题。到资源管理器中打开项目的Assets文件夹(或点右键ShowInExplorer),用unity3d目录下的Editor\Data\Tools\UniSciTE下的UniSciTE.exe打开cs文件,File→Encoding改为UTF-8withBOM,敲个空格造成修改,然后保存即可(可以修改cs文件打开方式更简单)。最好一开始就修改编码,否则会很麻烦。—高级软件人才实作培训专家程序的调试程序的运行时调试消息输出:Debug.Log(),显示到Console视图(window→console打开)项目的断点调试:启动MonoDevelop,主菜单Tools→Options→Unity→Debugger的Editor选择Unity开发环境Unity.exe的程序的路径;然后MonoDevelop打开项目(注意Unity不要同时打开这个项目),然后主菜单Run→RunWith→UnityDebugger就可以启动调试了。建议使用Debug.Log()调试,优秀程序员的素质。—高级软件人才实作培训专家GUI概念无论摄像机拍到的图像时怎么变的,GUI永远是显示在屏幕上,不受变形、碰撞、光照的影响。—高级软件人才实作培训专家GUI基础GUI部分是每帧擦除重绘的,只应该在OnGUI中绘制GUI,按钮:GUILayout.Button(“Hello”);只读标签:GUILayout.Label()修改控件的颜色:GUI.backgroundColor=Color.red;设置背景色,GUI.color设置前景色,影响OnGUI中之后的控件直到下次修改颜色为止。—高级软件人才实作培训专家15OnGUI易错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(ClickedTest);}案例:实现登陆功能,显示登陆结果。演练一下。常见错误:OnGUI大小写;文件编码;运行提示“CompilerError”—高级软件人才实作培训专家GUILayout布局GUILayout布局默认会伸展控件的尺寸。Button等控件支持paramsGUILayoutOption[]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);增加若干像素的间隙。—高级软件人才实作培训专家常用GUI控件1密码框:pwd=GUILayout.PasswordField(pwd,‘*’),第二个参数为掩码字符,注意帧刷新的问题。Button只有鼠标抬起才会返回true,这样用Button做发射子弹就不能按下一直发射,可以使用RepeatButton,这样按下期间会一直返回true。案例:Button和RepeatButton实现游戏对象移动。Tab页:electedToolBarId=GUILayout.Toolbar(selectedToolBarId,newstring[]{“装备”,“经验”,“队友”});返回值为激活的按钮的序号。复选框:isMuted=GUILayout.Toggle(isMuted,“静音”);多行文本区:msgBody=GUILayout.TextArea(msgBody,GUILayout.Width(300),GUILayout.Height(300));—高级软件人才实作培训专家常用GUI控件2滑动条:纵向,sliderValue=GUILayout