3D游戏 unity 3d.docx

上传人:b****6 文档编号:5823754 上传时间:2023-01-01 格式:DOCX 页数:59 大小:2.91MB
下载 相关 举报
3D游戏 unity 3d.docx_第1页
第1页 / 共59页
3D游戏 unity 3d.docx_第2页
第2页 / 共59页
3D游戏 unity 3d.docx_第3页
第3页 / 共59页
3D游戏 unity 3d.docx_第4页
第4页 / 共59页
3D游戏 unity 3d.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

3D游戏 unity 3d.docx

《3D游戏 unity 3d.docx》由会员分享,可在线阅读,更多相关《3D游戏 unity 3d.docx(59页珍藏版)》请在冰豆网上搜索。

3D游戏 unity 3d.docx

3D游戏unity3d

1-1建立游戏项目基础架构

制作步骤:

1.建立新项目,制作Asset或汇入预制的Asset

2.决定游戏场景架构

3.设定主场景Level1的环境

建立新的项目

首先从主选单→「File」→「NewProject」建立一个新项目,并将项目命名为SpaceShooter2D。

建立新项目的过程中有的地方要特别注意一下,在下图的操作画面里有个「Importthefollowing

packages」方块,里面是Unity3D内建的asset套件,如果游戏项目会用到这些套件,就可以在此

处把它勾选起来,稍候在建立项目时系统就会把它汇入。

由于套件会影响项目占用磁盘的容量,

所以如果我们很在意项目的档案大小,那就不要汇入用不到的套件。

但是如果我们不知道那些套

件是必要的,那些套件又是用不到的,那就不妨勾选所有的套件,因为Unity3D很多功能都跟内

建asset有关,若在建立项目时汇入全部套件,在学习过程中可以避免因为缺少某个asset而误以

为某项功能不存在。

为了能让大家在学习过程中了解某些内建asset与汇入套件的关连性,我们在本文介绍实作游戏的

过程中,若是遇到必须事先汇入套件才能使用的asset时,都会特别提醒如果看不到这些asset,

表示它所属的套件并没有被汇入,这时候只要马上汇入所需的套件就可以使用这些asset了,也因

为套件随时可以在用到的时候才汇入,所以新建项目时是否要汇入全部的套件由您自己决定就可

以了。

2

预制Asset

游戏制作过程中通常会有许多必须由开发者自行制作的asset,这些asset必须事先以其它软件制

作,然后再在Unity3D的编辑环境中使用,这样的asset我们称为「预制asset」。

一般来说,游戏

开发会用到的asset大抵分为贴图材质、3D模型及音效等等,我们现在要制作的这个项目也不例

外,通常大型游戏开发案也会为所有的预制asset制作详细的规格书,再交由不同的小组团队分头

进行,以节省开发时程。

下表是我们整理好的太射击游戏所需要的asset一览表:

一、贴图材质

材质说明

Asteroid.tga陨石贴图

SimpleShip.psd蓝色战机贴图

SimpleShip0.tga红色战机贴图

SpaceShooter_Start0.psd玩家登入首页界面贴图

SpaceShooter首页界面贴图

SpaceShooter_Lose挑战失败接口贴图

SpaceShooter_Win挑战成功接口贴图

Stars_large00星空贴图(上半部)

Stars_large01星空贴图(下半部)

二、3D模型

模型说明

Asteroid.fbx陨石模型

SimpleShip.fbx战机模型

SimpleShip_MeshCollider.fbx战机碰撞器模型

Asteroid-lambert4.mat陨石材质

lambert1.mat战机碰撞器材质

lambert4.mat战机模型材质

SimpleShip_MeshCollider-lambert1.mat战机碰撞器材质

SimpleShip-lambert4.mat战机模型材质

三、音效

名称说明

Mortarexplosions迫击炮3声

Photongunshot光子枪0.02

如果没有时间预制这些asset,我们也可以到arcalet开发者网站的资源中心,在「Reference」选

单里找到「SpaceShooter」项目的参考文件,然后下载spacebag.zip,再解压缩成spacebag数据匣,

再把它从档案总管拖曳到Unity3D的Project窗口里,如此一来这些由我们预先为读者准备的asset

档案就全部进到我们的项目里了:

4

决定游戏场景架构

大部份类似的游戏都是这样设计的:

一开始会有个主画面,接着玩家按下「Play」或「Start」按

钮后游戏正式开始,这时候玩家进入所谓的第一关场景,接着是第二关、第三关、...,游戏中

如果玩家失败了,就会出现「GameOver」的画面,然后再回到主画面。

基于教学方便,我们要制作的游戏只有一个关卡,如果读者想要练习设计多关卡游戏,还是可以

应用本文的内容举一反三,自行完成多关卡的太空射击游戏。

现在我们要来决定游戏的场景架构,首先,游戏一开始的主画面就是第一个场景,这个场景我们

把它取名为MainMenu,游戏正式开始的场景则做为第二场景,名称叫Level1,游戏结束后要在

屏幕显示成功或失败,则分别由两个场景Win与Lose负责。

从档案总管里把spacebag数据匣整个拖曳到

Unity3D的Project窗口中。

5

决定好场景之后,我们先在项目里面建好这四个场景,由于新建项目已经有一个预设的空场景,

只是在尚未存盘之前Porject窗口是看不到它的,因此我们先把目前的空场景存档,存档时取名为

MainMenu,这样的动作连作四次,每次都存成不同的名字,完成后的Project窗口内就有这四个

场景档案了。

最后,为了档案分类管理方便,我们在Project窗口内建立一个名为Scenes的数据匣,

然后把这四个场景档案搬移过去,这样就完成了场景的预先建文件作业。

_6

Scenes档案建好之后,接下来我们要把场景加入到项目的「ScenesinBuild」窗体里,这样做的目

的是为了在脚本程序中可以用数字代号呼叫Application.LoadLevel()来切换场景。

从「Scenesin

Build」窗体里我们可以看到每个场景都会被系统指派一个专用的层级代号,将来我们就可以使用

这个代号呼叫Application.LoadLevel()函式来切换场景。

要注意的是,一旦我们决定使用层级

代号来切换场景,场景在「ScenesinBuild」表里的层级顺序就不要再任意变更,免得程序发生错

乱。

为了避免项目的场景无法弹性扩充,我们也可以直接使用场景名称进行切换,只要呼叫

Application.LoadLevel()的另一个多载(Overloading)函式,以场景名称的字符串参数取代场景层

级代号就可以了。

现在我们就开始操作,先从主选单→「File」→「BuildSettings」打开「BuildSetting」窗口,然后

再从Project窗口把场景拖曳到「ScenesinBuild」窗体里,并依下图调整层级顺序:

所有新建的场景都集中放到

「Scenes」数据匣中。

建立一个新的数据匣,并更名为Scenes。

7

设定主场景Level1的环境

设定前请先确定目前编辑中的场景是「Level1」,如果不是,请先双击Project窗口中的Level1场

景,等到进入主场景后再进行环境设定。

由于主场景中的物体只有MainCamera,所以环境设定

就是摄影机的属性调整,调整内容请依以下步骤进行:

1.Background属性设定为黑色

2.Projection属性设定为Orthographic,这是2D游戏所必须的

3.Size属性设为5

4.确认Transform的Postition和Rotation分别为(0,1,-10)

5.Game窗口的样貌设定为「FreeAspect」,让游戏画面可以填满整个Game窗口

把Scenes拖曳到BuildSettings

窗口的「ScenesinBuild」窗

体中,并且根据图中的顺序排

列。

8

接着进行光源设定,由于场景中没有任何其它的物体,就算把光源设定好了也看不出效果,因此

我们得在场景中加入一个物体,首先建立一个「立方体」:

「主选单」→「GameObject」→「CreateOther」→「Cube」

这个立方体稍候会被我们修改为太空战机,也就是玩家所操控的脚色,所以我们先把它命名为

Player,接着调整Transform属性,把Position设为(0,0,0)、Rotation设为(0,0,0)、Scale设为(1.5,

1.5,1.5)。

9

现在场景中已经有了可视物体,接着开始进行光源调整,首先点选「主选单」→「GameObject」

→「CreateOther」→「Directionallight」新增一个光源物体,光源类型为「Directionallight」。

光源出现后紧接着调整Transform属性,把Position设为(0,5,-15)、Rotation设为(50,-30,0)、Scale

设为(1,1,1):

主场景的环境设定到此告一段落。

10

1-2玩家角色

完整教程请至进行下载。

教程从「单机模式」改编成「Online」多人实时都有详细的教程,千万别错

玩家角色在RPG游戏中又称为Hero,在我们制作的游戏中指的就是由玩家操控的太空战机。

本文内容包括太空战机本体到武器系统的炮弹,还有玩家操控的脚本程序,最后还有为游戏

增添画龙点睛之效的炮弹音效等。

建造太空战机

1.目前场景有个名称为Player的物体,外型只是一个简单的立方体,所以我们要把它改造为太空战机,步骤如下:

一、修改Player的MeshFilter属性,把它从Cube改为polySurface1:

这个步骤完成后,如果原本的立方体从Game窗口消失不见,表示刚才修改MeshFilter属性

所套用的polySurface1模型太小了,从目前的摄影机看不到,此时就要进行下个步骤,把太

空战机模型尺度调整到合适的大小。

二、调整Player的模型尺度

2

步骤:

Project窗口→「spacebag」→「Models」→「SimpleShip」→「ScaleFactor」

把它的值从目前的0.01改为1,改完后点选「Apply」按钮。

由于3D模型在建模软件建造时都会有一定尺度大小,而游戏项目也会有自己的尺度大小,

两者如果不相等,就会让物体在游戏中显得太大或太小,所以我们得在Unity3D编辑器中调

整模型的尺度大小,让它以适当的大小呈现。

三、修改Player的碰撞模型(Collider)

(1)先移除目前的碰撞模型「BoxCollider」:

把0.01改为1,然后往下卷动

Inspector窗口,看到「Apply」按钮后点击即可完成设定。

3

下图是移除「BoxCollider」前后的对照图:

(2)加入新的碰撞模型「MeshCollider」

步骤:

主选单→「Component」→「Physics」→「MeshCollider」。

这个步骤是为了使用Unity3D内建碰撞侦测所做的准备,请注意,碰撞侦测以碰撞模型

为准,而非物体本身的外观模型。

4

(3)修改「MeshCollider」的「Mesh」属性,把它从目前的设定「polySurface1」,改为「pCube1」。

(4)修改「pCube1」的尺度大小

步骤:

Project窗口→「spacebag」→「Models」→「SimpleShip_MeshCollide」→「Scale

Factor」,目前的值是0.01,把它改为1,设定完成后记得按「Apply」按钮。

5

「pCube1」的尺度调整之后,Scene窗口里太空战机的碰撞模型参考线(绿线)就会出现,

还记得稍早还没改为「pCube1」之前的参考线是个绿色的立方体吧,现在出现的是像下

图的样子,如果没有出现,请将Inspector窗口的「MeshCollider」的核选方块取消然后

再勾选,这个动作就好像重新整理一般,做完后就会出现了。

把0.01改为1,然后往下卷动

Inspector窗口,看到「Apply」按钮后点击即可完成设定。

6

四、Player的表面贴图

现在太空战机的表面还是灰蒙蒙的,接着我们要贴上材质图像,让它变得好看,成为涂装过

的飞机。

材质图像我们已经事先放在Project窗口→「spacebag」→「太空图文件」里,只要把里面

「SimpleShip」图像文件拖曳到Hierarchy窗口中的Player里面,太空战机就从灰蒙蒙的外皮变成彩色的外表。

玩家操控

接着我们要让玩家开始可以操控太空战机,这就要靠脚本程序的帮忙了。

为了方便以后的项目管理,我们先在Project窗口里建立一个新的数据匣「Scripts」,日后所有的脚本程序都放在这里,接着建立一个新的C#脚本,并命名为「Player」,然后把它拖曳到Hierarchy窗口的「Player」里,再把脚本Player改为以下的内容:

//Player.cs

usingUnityEngine;

usingSystem.Collections;

publicclassPlayer:

MonoBehaviour{

publicfloatPlayerSpeed;

voidUpdate(){

floatoutToMove=Input.GetAxisRaw("Horizontal")*PlayerSpeed*Time.deltaTime;

transform.Translate(Vector3.right*outToMove);

}

}

紧接着把Inspector窗口中的公共变量「PlyerSpeed」的值设为5。

Player.cs脚本中使用Unity3D内建的键盘操控函式Input.GetAxisRaw("Horizontal")来操控太空

飞几,它会根据玩家按下键盘的「A」键或是「D」键传回1或-1,这个数字再和代表太空战机速

度的PlyerSpeed相乘,最后再乘以相邻两个frame执行的时间差,就会得到飞机从上个frame到

目前frame的位移量。

有了位移量之后再把它传给transform.Translate()函式就可以移动太空战机了,先前我们介绍

过水平移动使用的是(1,0,0),现在我们改用Vector3.right,这两者的值是一样的。

完成后开始执行游戏,果然太空战机已经可以让我们以键盘操控左右移动了,不过太空战机有点

太大,位置也不在画面的最下方,所以我们再做一点调整:

8

调整后再执行一次看看,相当完美,不过还有个小问题,每当我们把太空战机移动到游戏画面外

面时它就会消失不见,如果操控键一直按着,太空战机就会跑到离屏幕边缘很远的地方,要把它

移回来就得等很久的时间,所以我们要加上一些防呆设计来避免这种情形发生。

一般来说游戏不会让玩家角色从画面上消失,所以我们可以把太空战机设计成离开画面后立刻从

另外一边出现,为此我们加了一段判断式,当太空战机的x坐标超出画面最左边时,就把它的坐

标重置在画面的最右边,因为画面的边界大约是8.25f,所以这段判断式就像这样:

if(transform.position.x<=-8.25f)

transform.position=newVector3(8.25f,transform.position.y,transform.position.z);

同样的,当太空战机往右离开画面后,我们也以同样的判断式让它从画面左边出现:

if(transform.position.x>=8.25f)

transform.position=newVector3(-8.25f,transform.position.y,transform.position.z);

修改后的Player.cs完整内容如下:

//Player.cs

usingUnityEngine;

usingSystem.Collections;

publicclassPlayer:

MonoBehaviour{

publicfloatPlayerSpeed;

voidUpdate(){

floatoutToMove=Input.GetAxisRaw("Horizontal")*PlayerSpeed*Time.deltaTime;

transform.Translate(Vector3.right*outToMove);

if(transform.position.x<=-8.25f)

transform.position=newVector3(8.25f,transform.position.y,

transform.position.z);

elseif(transform.position.x>=8.25f)

transform.position=newVector3(-8.25f,transform.position.y,

transform.position.z);

}

}

制作炮弹

这个游戏的主角是太空战机,既然名为太空,它所配备的炮弹也得有科幻感,所以我们要为它打

造类似星际大战的绿光雷射炮。

首先我们新增一个胶囊体的GameObject,并且把它命名为「Projectile」,然后设定Scale属性为(0.2,0.2,0.2)。

接着从预制的spacebag中找到「M_Projectile」,然后把它拖曳到刚刚建立的胶囊体「Projectile」中。

接着调整炮弹的功能属性,步骤如下:

(1)为炮弹加上Rigidbody

点选主选单→「Component」→「Physics」→「Rigidbody」

(2)取消炮弹的Rigidbody属性「Gravity」

(3)勾选炮弹的Rigidbody属性「Kinematic」。

现在我们要写一段脚本来控制炮弹的行为,这段程序和炮弹发射无关,那是玩家操控的范围,这个脚本只要让炮弹能够一定的速度往上方飞去,直到离开游戏画面为止就可以了。

首先建立一个名为Projectile的脚本,同样把它放在Script数据匣里,以方便管理。

接着把Projectile脚本加到炮弹GameObject里,然后改写脚本内容:

//Projectile.cs

usingUnityEngine;

usingSystem.Collections;

publicclassProjectile:

MonoBehaviour{

publicfloatProjectileSpeed;

privateTransformmyTransform;

voidStart(){

myTransform=transform;

}

voidUpdate(){

floatoutToMove=ProjectileSpeed*Time.deltaTime;

myTransform.Translate(Vector3.up*outToMove);

if(myTransform.position.y>6.25f)

Destroy(gameObject);

}

}

脚本编修完成后,记得这里有个公共变量ProjectileSpeed,所以必须到Projectile的Inspection窗口

中设定此一公共变量ProjectileSpeed的值。

这个变量代表的是炮弹的移动速度,目前暂定为10。

现在炮弹的基本构成已经完成,不过大家一定觉得很奇怪,Unity3D的GameObject一定要在编辑阶段就把它建造出来吗?

当然不是,以目前的炮弹例子来说,当程序一开始执行,场景马上就会有个炮弹往上方飞去,这当然不是我们想要的结果,我们想要的效果是当玩家按下某个发射键后才将炮弹建造出来,所以我们得应用先前学过的「动态生成物体」的技巧。

「动态生成物体」就是把GameObject变成Prefab,方法很简单,现在我们要建立一个名称为ProjectilePrefab的Prefab,请依照下面的步骤操作:

(1)建立一个新的Prefab,然后更名为ProjectilePrefab炮弹离开画面后就可以把这个GameObject销毁炮弹往上方移动

方法:

点选Project窗口→Create→Prefab

(2)再建立一个新的数据匣,并更名为Prefab,然后再把ProjectilePrefab拖曳至此

(3)将Herarchy窗口内的Projectile拖曳到ProjectilePrefab里

(4)删除Herarchy窗口内的Projectile

发射炮弹

现在我们要把做好的炮弹装填到太空战机上面,也就是加一段控制太空战机发射炮弹的程序代码到Player脚本里。

为了让程序代码可以存取炮弹Prefab,我们先修改Player.cs的内容,定义一个新的公共变量

ProjectilePrefab:

//Player.cs

usingUnityEngine;

usingSystem.Collections;

publicclassPlayer:

MonoBehaviour{

publicfloatPlayerSpeed;

publicGameObjectProjectilePrefab;

...

}

然后指派它的初值,也就是从Unity3D编辑器里把刚做好的ProjectilePrefab拖曳它所对应的属性字段:

接着就要在脚本中加上程序代码来发射炮弹,做法是先取得目前太空战机的坐标:

Vector3position=Vector3(transform.position.x,transform.position.y+(transform.localScale.y/1));

然后呼叫Instantiate()函式在太空战机目前的坐标产生一颗炮弹:

Instantiate(ProjectilePrefab,position,Quaternion.identity);

最后再加上一个按键判断式,当玩家按下空格键时执行上面这两个动作:

if(Input.GetKeyDown("space")){...}

发射炮弹的脚本就完成了。

当炮弹被Instantiate()函式生成出来后,由于ProjectilePrefab已经带有一个控制自己飞行与消灭的脚本程序,所以我们在Player脚本中只把它生成出来即可,有点像真实世界的战斗机飞弹「射后不理」的能力,因为飞弹本身已经内建计算机程序,在飞行员锁定目标发射之后,飞弹上面的程序会控制飞弹的飞行路线直到击中目标为止。

以下是Player脚本加上发射炮弹程

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

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1