Unity3D游戏开发讲课稿_第1页
Unity3D游戏开发讲课稿_第2页
Unity3D游戏开发讲课稿_第3页
Unity3D游戏开发讲课稿_第4页
Unity3D游戏开发讲课稿_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

—高级软件人才实作培训专家北京传智播客教育Unity3D游戏开发讲师:杨中科—高级软件人才实作培训专家仙剑奇侠传OL调教三国小小忍者绝代双骄Unity3D开发的游戏明天讲win8开发,装了win8的同学注意也安装vs2012,win8开发用vs2012+win8才可以。如果没有win8也没关系,这三天学的东西用WPF或者silverlight开发环境也能学习。如果装了win8+vs2012,新建一个项目:Windows

应用商店→空白应用程序,按照提示获得开发者认证。获得开发者认证要联网—高级软件人才实作培训专家游戏开发和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?跨平台;费用便宜(非开源,有免费版)—高级软件人才实作培训专家游戏开发常识游戏术语:游(WebGame)Online,大型多人在线);RPG(虚拟人生,浪漫庄园)固定,不足够炫,但是不头晕,开发难度低,建模建3面即可)smartfoxserver、C#开发的Photon(底层C++)等;手游(新增长点);网游(捉迷藏OL,U3D);端游(需要下载客户端);页FPS(First

Person

Shoot/Frame

Per

second);MMO(

Massively

Multiplayer2.5D(用2D模拟出来的3D。中国2D网游占据8成市场);锁定视角3D(视角第三人称;第一人称;单机游戏;网络游戏:大公司使用自主引擎,中小公司使用Java开发的运营商、游戏代理、渠道商:开发商自己要处理推广、支付、打击盗版等,一般和渠道商合作分成。比如《捕鱼达人》android版90%收入来自渠道。

Android手机游戏开发的困境,渠道太多,N多打包;游戏公司分工:策划;美工;程序员;测试;客服等。黑话:主程、主美;1、安装方法:Unity3D不能装在中文路径下。win8下如果用户名是中文的,则Unity3D启动打软件会报错提示:Error

loading

page

Couldn"t

read

afile://file,改用英文用户名即可。2、破解方法,首先安装U3d,然后把破解补丁解压到Editor目录下,运行→Patch,会保存生成一个ulf文件。接着断开互联网,启动Unity,会提示无法连接认证服务器,是否手动激活,点击【Manual

Activation】手动激活,然后点击【LoadLicence】加载

ulf文件即可。2、void

Update

(){if(Input.GetKey(KeyCode.UpArrow)){transform.Rotate(Vector3.right*Time.deltaTime*10);}if(Input.GetKey(KeyCode.DownArrow)){transform.Rotate(Vector3.left*Time.deltaTime*10);}if(Input.GetKey(KeyCode.LeftArrow)){transform.Rotate(Vector3.up*Time.deltaTime*10);}if(Input.GetKey(KeyCode.RightArrow)){transform.Rotate(Vector3.down*Time.deltaTime*10);}}—高级软件人才实作培训专家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场景文件。—高级软件人才实作培训专家第一个例子解析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文件名不要有中文—高级软件人才实作培训专家编辑器的使用的使用Scene:·

高效操作:按住鼠标右键拖放可以改变预览的时候看的方向;按住滚轮拖放可以横向改变看的部分;滚轮可以前进后退;Hierarchy中双击可以聚焦到元素,放大区域;点击 按钮 选中一个游戏对象拉着三个方向的箭头就可以在三个方向修改元素的位置。方向键可以更方便的在XZ方向漫游,按着Shift可以加快速度。Hierarchy中Create的时候会自动在当前坐标创建对象,方便建模;Inspector:暂时想禁用试一下的游戏对象可以在Inspector前的钩去掉暂时想禁用一下的组件也可以把钩去掉,永久删掉就“RemoveComponent”Unity多开:建一个快捷方式加上“-projectPath”参数即可。—高级软件人才实作培训专家脚本基础C#脚本不支持命名空间,脚本在Project中的显示名称不要加cs,类名要和cs名称一致,所有类继承自MonoBehaviour。跟具体游戏对象无关的脚本可以放到摄像机MainCamera中。不要不正确的给一个游戏对象设置多个脚本对象初始化不要放到构造函数中,而是放到Start()方法中。放到游戏对象中的脚本(实例化)可以在Inspector中修改属性,get/set写法属性不被识别,直接public字段就能当属性用,private或者不写修饰符就是私有字段。脚本中文问题:代码中有中文的话会有乱码问题。到资源管理器中打开项目的Assets文件夹(或点右键Show

In

Explorer),用unity3d目录下的Editor\Data\Tools\UniSciTE下的UniSciTE.exe打开cs文件,File→

Encoding改为UTF-8

with

BOM,敲个空格造成修改,然后保存即可(可以修改cs文件打开方式更简单)。最好一开始就修改编码,否则会很麻烦。—高级软件人才实作培训专家程序的调试程序的运行时调试消息输出:Debug.Log(),显示到

Console视图(window→console打开)项目的断点调试:启动MonoDevelop,主菜单Tools→Options→Unity→Debugger的Editor选择Unity开发环境

Unity.exe的程序的路径;然后MonoDevelop打开项目(注意Unity不要同时打开这个项目),然后主菜单Run→RunWith→Unity

Debugger就可以启动调试了。建议使用

Debug.Log()调试,优秀程序员的素质。—高级软件人才实作培训专家GUI概念无论摄像机拍到的图像时怎么变的,GUI永远是显示在屏幕上,不受变形、碰撞、光照的影响。Note

that

you

should

not

rely

on

Time.deltaTime

from

inside

OnGUI

since

OnGUI

can

be

called

multiple

times

per

frame

and

deltaTime

wouldhold

the

same

value

each

call,

until

next

frame

where

it

would

be

updated

again.—高级软件人才实作培训专家GUI基础GUI部分是每帧擦除重绘的,只应该在OnGUI中绘制GUI,按钮:GUILayout.Button(“Hello”);只读标签:GUILayout.Label()修改控件的颜色:GUI.backgroundColor=Color.red;设置背景色,GUI.color设置前景色,影响OnGUI中之后的控件直到下次修改颜色为止。—高级软件人才实作培训专家OnGUI易错Hierarchy中的游戏对象不一样,OnGUI是每帧擦除重绘的(有可能一帧调用多次)。GUILayout.Button(“Hello”)应该理解为“画一个Button控件”而不是“创建一个Button控件”:if(tick%100>50)//每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大小写;文件编码;运行提示“Compiler

Error”—高级软件人才实作培训专家GUILayout布局GUILayout布局默认会伸展控件的尺寸。Button等控件支持

params

GUILayoutOption[]options可变参数数组,可以通过

GUILayout.Width(30)返回一个设置控件宽度的GUILayoutOption对象,Height()、MinWidth()、MinHeight()等同理。例子:GUILayout.Button("Test",GUILayout.Width(500),GUILayout.Hei

ght(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,new

string[]{“装备”,“经验”,“队友”});返回值为激活的按钮的序号。复选框:isMuted=GUILayout.Toggle(isMuted,“静音”);多行文本区:msgBody=GUILayout.TextArea(msgBody,GUILayout.Width(300),GUILayo

ut.Height(300));窗口拖拽:Rect

winRect;void

OnGUI(){winRect=GUILayout.Window(0,winRect,AddWindow1,"我的窗口");}void

AddWindow1(int

windowId){GUILayout.Button("hello3333333");GUILayout.Button("hello3333333333333333");GUILayout.Button("hello333333333333");GUI.DragWindow();}—高级软件人才实作培训专家常用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()中设定初始位置。案例:点击【显示装备】显示装备窗口,点击窗口中的【关闭】按钮则关闭—高级软件人才实作培训专家贴图材质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中的显示的名称,不用带后缀,这个名字和物理文件名可以不一样,可以改名。做项目是推荐定义publicTexture的做法,这样可以方便美工修改贴图,便于分工。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胶囊。—高级软件人才实作培训专家游戏对象移动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移动。if(Input.GetKey(KeyCode.UpArrow)){transform.Rotate(Vector3.right);}if(Input.GetKey(KeyCode.DownArrow)){transform.Rotate(Vector3.left);}if(Input.GetKey(KeyCode.LeftArrow)){transform.Rotate(Vector3.up);}if(Input.GetKey(KeyCode.RightArrow)){transform.Rotate(Vector3.down);}—高级软件人才实作培训专家游戏对象旋转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)元素围绕着摄像头运动。—高级软件人才实作培训专家世界坐标和本地坐标世界坐标系(world)与本地坐标系(local/self)。所有物体的世界坐标系都是相同的、不会改变。每个物体都有一个本地坐标

系,当物体旋转时,本地坐标系统也会跟着物体一起旋转。把Cube的Rotation改为(45,45,45),这样世界(world)坐标和本地

(local/self)坐标就不一样了。

transform.Translate(Vector3.forward)是向自己坐标前方,

transform.Translate(Vector3.forward,Space.World)是向世界坐标前方。—高级软件人才实作培训专家Update和FixedUpdate()Update()受当前渲染效率的影响,有时快有时慢,帧率会变化,

Update被调用的时间间隔就发生变化,Time.deltaTime获得自上次Update一来经历的时间,只应该在Update()中使用

deltaTime

,OnGUI等里面不要用。FixedUpdate()固定的时间间隔被调用,通过Edit->ProjectSetting->time设置。一般把控制运动的代码写到FixedUpdate()中,避免跳帧的感觉。

Time.fixedDeltaTime获得固定的时间间隔。OnGUI():一般是每帧刷新一次,每帧刷新多次。画GUI—高级软件人才实作培训专家地形Terrain,主菜单Terrain→Create

Terrain创建地形,Terrain→SetResolution设定尺寸、分辨率等。选中地形 来产生突起,Brushes中选择笔刷,往上拉;往下压地形; 设定地形的贴图,点击【Edit

Texture】→【Add

Texture

】增加地形,选择地形图片(先导入Unity内置的贴图,Assets→Import

Packages→Terrain

Assets),可以添加多个贴图到Textures中,选择不同的Texture然后刷地形,这样可以实现不同的块刷不同的地形;

用来生成树,先

Import

Packages→Tree

Creator导入资源,点击【Edit

Trees】→【AddTree】,选择材质,增加多个Tree到Trees中,然后刷就可以产生树; 用来产生草,用法和Tree差不多;水面:Import

Packages→Water;Plane和Terrain类似,不过没有山这些东西,就是平板。—高级软件人才实作培训专家SkyBox天空盒子天空盒子一共有六个面,可以单独设定贴图,可以导入一些内置的免费SkyBox。在Project上点右键,选择“Importpackage”→“SkyBoxes”。然后在主菜单选择“Edit”→“Render

Settings”,然后再Inspector面板中,修改Skyboxmaterial,选择导入的材质即可。—高级软件人才实作培训专家物理引擎物理引擎就是模拟真实世界中物体碰撞、跌落等反应的引擎,通过Ballance、愤怒的小鸟来理解什么是物理引擎。Unity的物理引擎使用的是NviDIA的PhysX。选中一个游戏对象,主菜单→Component→Physics→Rigidbody,这样就添加了刚体组件。一旦给一个GameObject添加刚体组件,它就会受

重力、碰撞等的反应,最典型的就是如果“脚下无地”就会坠落、和其他刚体碰撞会反弹、无法进入等。Rigidbody组件的属性:Mass:质量,一般不要大于10;Drag:摩擦力;UseGravity:是否受重力影响,比如飞船、昆虫等漂浮的刚体就要不勾选,这样还是受碰撞等物理引擎影响的;Freeze

Position:锁定位置,不会因为重力、碰撞等而变化位置,当然可以代码修改位置;FreezeRotation:锁定旋转,如果不希望旋转则勾选;材质:可以设定刚体是橡胶的还是木头还是冰,Import

Packages→Physic

Materials,修改**Collider的Material指向相应材料即可。案例:弹跳的小球。—高级软件人才实作培训专家案例1:第一人称摄像头画地形;放一个Cube,把MainCamera去掉,选中Cube,给Cube增加Camera组件(Component→Rendering),这样就是把摄像头装到了Cube上;编写脚本放到Cube上控制Cube前后左右移动;Cube会钻到地下去,给Cube增加刚体,但是会翻滚,因此Freeze

Rotation;想让它飘起来,因此去掉Use

Gravity。练习思考:如何实现按Shift键加速移动。备注1:void

FixedUpdate(){if(Input.GetKey(KeyCode.UpArrow)){int

speed

=

10;transform.Translate(Vector3.forward*Time.fixedDeltaTime*speed);}if(Input.GetKeyDown(KeyCode.DownArrow)){transform.Rotate(Vector3.up,180);}if(Input.GetKeyDown(KeyCode.LeftArrow)){transform.Rotate(Vector3.up,-90);}if(Input.GetKeyDown(KeyCode.RightArrow)){transform.Rotate(Vector3.up,90);}}—高级软件人才实作培训专家案例2:第三人称美女漫游Todo:把动画提前,运动过程中放动画。基础知识1:系统内置的第三人称摄像机控制脚本,Import

Package→scripts,把Smooth

Follow脚本添加到Camera上,设置脚本组件的Target属性为要监视的游戏对象;这样当对象移动的时候摄像头就一直看着它,可以查看修改脚本;基础知识2:在Hierarchy中可以把一个对象设置为一个对象的子对象,这样子对象会跟着父对象一起移动、旋转,子对象的Position、Rotation什么的也是相对于父对象的;导入FBX酒娘模型;酒娘显示的非常小,修改Scale放大300倍;让酒娘成为第三人称主角并且SmoothFollow。(项目路径不要有中文,fbx文件名不要有中文,否则可能会无法导入贴图)练习:人不会横着走,应该是按着向上箭头是前行,按住←→↓是转向。实现之!备注1。完善:人不应该能穿山!刚体?试试!因为非原始模型的碰撞处理比较麻烦,性能低,一般把自定义模型放到原始模型中,给原始模型添加刚体。—高级软件人才实作培训专家给“力”可以给游戏对象一个力,这样对象可以响应,比如愤怒的小鸟。注意添加了刚体组件才能给力,否则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.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(newVector3(0,0.5f,0),ForceMode.Impulse);就是让Cube围绕着Y轴中心旋转。—高级软件人才实作培训专家碰撞检测当碰撞开始void

OnCollisionEnter(Collision

col)方法调用,

col.gameObject可以拿到被碰撞的游戏对象;voidOnCollisionStay(Collision

col)方法在碰撞中每帧都会被调用;void

OnCollisionexit(Collision

col)是结束碰撞的时候调用。案例:随便放一些Cube,点击【炸弹】按钮给“炸弹

Sphere”产生力,被打中的Cube消失(Destroy);点击【缩小】按钮给“药丸Sphere”力,被打中的Cube缩小0.5。—高级软件人才实作培训专家射线Ray射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,他将停止发射。注意这条件是逻辑上的,界面上看不到。一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等。Ray

ray

=

Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit

hit;if(Physics.Raycast(ray,out

hit)//如果命中{//hit.collider.gameObject可以获得命中的游戏对象}(*)hysics.RaycastAll投射一条光线并返回所有碰撞练习1:人在场景中行走寻找,鼠标点中的Cube消失。开发打鸭子游戏,开发大炮打箱子—高级软件人才实作培训专家动态创建游戏对象使用CreatePrimitive方法创建对象,创建出的对象不需要Add之类的就可以显示出来:GameObject

cube

=

GameObject.CreatePrimitive(PrimitiveType.Cube);cube.AddComponent(typeof(Rigidbody));="cube1";//设定名字cube.renderer.material.color

=

Color.red;动态创建出来的对象运行时在Hierarchy中可以看到,可以帮助检查内存泄露。克隆游戏对象产生复制对象的效率高,比如游戏中产生大量子弹。调用Instantiate来生成对象,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对象上附加的脚本组件实例—高级软件人才实作培训专家练习:开发大炮打箱子游戏提前讲游戏对象的动态创建、复制—高级软件人才实作培训专家自定义鼠标指针

屏幕坐标系(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);using

UnityEngine;using

System.Collections;public

class

HeroController

:

MonoBehaviour

{private

enum

HeroState{Idle,Walking,Killed};private

HeroState

heroState;private

Vector3

targetPosition;//

Use

this

for

initializationvoid

Start

(){heroState

=

HeroState.Idle;}void

FixedUpdate(){if(heroState

==

HeroState.Walking){Move();}}//

Update

is

called

once

per

framevoid

Update

(){if(Input.GetMouseButtonDown(0)){Ray

ray

=Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit

rayHit;if(Physics.Raycast(ray,out

rayHit)){targetPosition=rayHit.point;//目标地点transform.LookAt(new

Vector3(targetPosition.x,transform.position.y,targetPosition.z));heroState

=

HeroState.Walking;}}}void

Move()—高级软件人才实作培训专家角色控制if(Mathf.Abs(Vector3.Distance(transform.position,targetPosition))>1){CharacterController

charCtrl

=gameObject.GetComponent<CharacterController>();transform.LookAt(newVector3(targetPosition.x,transform.position.y,targetPosition.z));float

speed

=

0.1f;Vector3

nextPos

=Vector3.ClampMagnitude(targetPosition-transform.position,speed);charCtrl.Move(nextPos);}选中地形则在地形的当前位置创建对象,选中其他对象则在它位置产生一个WalkToMouse

添加到地形上。public

class

WalkToMouse:

MonoBehaviour{public

GameObject

MoveObject;private

NavMeshAgent

navMeshAgent;private

Vector3

targetPosition;private

bool

isWalking;//

Use

this

for

initializationvoid

Start

()

{navMeshAgent

=

MoveObject.GetComponent<NavMeshAgent>();isWalking=

false;}//

Update

is

called

once

per

framevoid

Update

(){if(isWalking){navMeshAgent.SetDestination(targetPosition);}}void

onmousedown(){Ray

ray

=Camera.mainCamera.ScreenPointToRay(Input.mousePosition);RaycastHit

rayhit;if(Physics.Raycast(ray,out

rayhit)){targetPosition

=

rayhit.point;isWalking=

true;}}}—高级软件人才实作培训专家NavMesh寻找路径对于NPC可以采用NavMesh进行控制。打开主菜单Windows->Navigation。在Hierarchy中将所有障碍物选上,在Navigation窗口,将Navigation

Static打上勾,Navigation

Layer设置为not

walkable;Component->Navigation->NavMeshAgent给角色添加NavMeshAgent组件。在Navigation窗口中,点击【Bake】烘焙生成路径数据。脚本:

navmeshagent=gameObject.GetComponent<NavMeshAgent>();拿到组件对象

在Update中navmeshagent.SetDestination(position);刷新显示向position位置走。—高级软件人才实作培训专家粒子系统(Particle

System)它可以实现硝烟、火焰、雪花、水汽、爆炸等多种效果。在Hierarchy视图中Create→Particle

System。可以在

Inspector修改例子的半径、方向、产生例子的数量等参数非常强大。可以修改粒子系统的贴图显示多姿多彩的内容,首先引入内置的贴图,在Assets中Import

Package→Particles,选择倒入的粒子,然后在粒子系统组件的Inspector中选择

Material属性选择即可。—高级软件人才实作培训专家声音播放Unity支持格式:aiff和wav为短音效;mp3和ogg为长音乐。首先项目中要有一个AudioListener组件,扬声器播放的声音就是AudioListener组件所在的位置听到的声音。默认AudioListener是放到MainCamera上。没有AudioListener的话是听不到声音的。把音乐拖到Assets中,选中要播放音乐的游戏对象(如果是鸡叫、坦克爆炸之类的声音一般放到鸡、坦克这些游戏对象上,而背景音乐等则一般放到摄像机上),点击主菜单“Component”→“Audio”→“audio

source”增加Audio组件到GameObject上,然后把音乐文件拖到组件的Audio

Clip属性上即可。Mute设定是否静音,Play

On

Awake为是否自动播放,Loop为是否循环播放,Volumn为音量。—高级软件人才实作培训专家声音的3D特性AudioListener和AudioSource的空间距离决定了听到的声音的效果,比如第二人生或者浪漫庄园中离人物越远听到的声音越小就是这个原因向右前方越来越远的声音:把音乐组件放到cube上,MainCamera为AudioListener,给cube添加如下脚本:void

Update

()

{

transform.Translate(newVector3(1,0,1)*Time.deltaTime);}环绕声音,把上面的Update代码改成:transform.RotateAround(Camera.main.transform.posr3.up,1);—高级软件人才实作培训专家模型动画1在3dsmax、maya中设计模型和动画,导出fbx格式。有的3dsmax文件导出fbx会有问题,比如导出没有贴图、没有动画等,主要是制作不标准。将生成的fbx文件拖到Unity的Project的assets中,选中Project中的fbx文件(注意不是Hierarchy中的),在Inspector中的Animations页签中进行动画剪辑。美工给的动画是几个动作连续播放的,需要剪辑成单独的动作。点击加号增加动作片段(clip),输入开始帧(start)和结束帧(end),给这个片段的动作取一个名字,然后别忘了点击【Apply】按钮,这样就完成了一个片段的编辑。如果美工给了每个动画的起止帧最简单填上即可,如果是下载的别人的,不知道每个片段的起止帧,那只能start填上一个片段的end+1,end尝试输入结束帧的号码,微调后点击预览自己确定。—高级软件人才实作培训专家模型动画2片段切割完毕要把片段授权,否则运行的时候会提示没有legacy或者gameobject中没有animation组件。切换到Rig,Animation

Type选择“legacy”,Generation选择“Store

inRoot”,点击【apply】按钮。把fbx拖到Hierarchy或者Scene中这样就成为GameObject了5)播放动画:gameObject.animation.Play("walk");—高级软件人才实作培训专家配置信息保存PlayerPrefs提供了读写键值对配置信息的方法,只适合读写简单的数据。HasKey、Get***、Set***。复杂的数据要使用IO操作,就是普通的.NetIO操作,Application.dataPath取得为应用程序分配的数据文件夹的路径。—高级软件人才实作培训专家多场景File→NewScene来创建新的场景,Unity只能同时打开一个场景。新创建的场景需要手动添加到BuildSettings中,主菜单File→

Build

Settings,点击【AddCurrent】按钮就可以将当前场景添加进入,按delete键删除,通过鼠标拖动修改顺序。第二列为场景

的id,id为0的场景为程序的第一个场景通过Application.LoadLevel()来通过名字(不带.unity后缀)或者id加载场景(*)Application.LoadLevelAysnc()则可以异步加载场景。Application.loadedLevelName可以获得当前场景的名字。GameObject

obj

=

(GameObject)Resources.Load("jiuniang/jiuniang",typeof(GameObject));Debug.Log(obj);obj.transform.localScale

=

new

Vector3(300,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论