3D游戏 unity 3d.docx
- 文档编号:5823754
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:59
- 大小:2.91MB
3D游戏 unity 3d.docx
《3D游戏 unity 3d.docx》由会员分享,可在线阅读,更多相关《3D游戏 unity 3d.docx(59页珍藏版)》请在冰豆网上搜索。
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脚本加上发射炮弹程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 3D游戏 unity 3d 游戏