Unity3D for iOS初级教程:Part 3/3(下)
Unity3D for iOS初级教程:Part 3/3(下)
消息不会自动消除
你基本的游戏功能已经完成了,但是显示一些关于游戏的信息当它首次加载的时候是一个好的亮点。你现在所有显示的是一个play按钮。用户不知道他们要做啥。 添加一些欢迎的文字和关于游戏的超级简短的介绍会让它更加用户友好.:]欢迎的文字会使用你导入变形金刚字体。对于介绍文字。你会使用和Unity一起打包的Arial字体。 创建一个空的游戏对象,命名它为Intro,然后设置 Transform Position为0,0,0. 选择GameObjectCreate Other3D Text来创建一个3D文字GameObject,然后命名它为Description Text。设置InspectorText MeshText属性为"Get to the finish line before time runs out".设置初始的Transform Position为-10, 1, 12. |
用Unity编辑器试玩游戏,然后调整物件的位置让它水平居中,让你可以看的清楚一些。 |
提示:你会不得不与x和z位置打交道:x用于中间对齐物件,z用于放大和缩小。
<a href="http://www.raywenderlich.com/wp-content/uploads/2012/11/part3_39b_desc_text_adjusted.png"><img title="Description text position adjustments." src="http://www.raywenderlich.com/wp-content/uploads/2012/11/part3_39b_desc_text_adjusted-700x297.png" alt="Description text position adjustments." width="700" height="297" /></a> 用Unity Remote检查游戏,确保文字在iOS设备上显示的出来。对一些必要的调整。 将Description Text放到Intro GameObject下。你这样做的目的是你可以通过简单的代码在后面显示或隐藏显示菜单信息。 |
创建第二个3D文字GameObject,然后命名它为Welcome Text。这个文字应该出现在描述文字的上面,所以设置初始的Transform Position为 -6,5,10.设置InspectorText MeshText属性为"Welcome". 通过拖动项目视图中的字体资源到Inspector中的Font属性来设置字体属性为Transformers Movie(或者通过点击Font边上带有小点的圆圈,然后选择字体从弹出的列表中): <a href="http://www.raywenderlich.com/wp-content/uploads/2012/11/part3_42b_welcome_text_transform_text_font.png"><img title="Welcome text transform and material modifications." src="http://www.raywenderlich.com/wp-content/uploads/2012/11/part3_42b_welcome_text_transform_text_font-244x500.png" alt="Welcome text transform and material modifications." width="244" height="500" /></a> 调整欢迎文字的位置,当你在Unity编辑器和Unity Remote中测试游戏的时候,让你可以看的清楚。 <a href="http://www.raywenderlich.com/wp-content/uploads/2012/11/part3_43b_welcome_text_adjusted.png"><img title="Welcome text position adjustments." src="http://www.raywenderlich.com/wp-content/uploads/2012/11/part3_43b_welcome_text_adjusted-700x315.png" alt="Welcome text position adjustments." width="700" height="315" /></a> 将Welcome Text物件放到Intro GameObject下面。 当游戏开始运行的时候,你想要隐藏IntroGameObject(和它的子物件)。打开GameController脚本,然后做下面的修改: |
var intro : Transform; ... function startGame() { ... // Turn off the intro text for (var child : Transform in intro ) { child.gameObject.renderer.enabled = false; } // Clean out any enemy objects ... |
这里你添加一个新的公共变量来得到Intro GameObject的句柄。然后你修改startGame()来让Intro GameObject不可见,通过关闭它的子GameObject的渲染。 现在通过选择主摄像头然后从Hierarchy视图中拖动Intro GameObject到InspectorGame ControllerIntro变量上来设置Intro变量。或者使用圆圈点图标,因为它更加容易.:] |
创建第二个3D文字GameObject,然后命名它为Welcome Text。这个文字应该出现在描述文字的上面,所以设置初始的Transform Position为 -6,5,10.设置InspectorText MeshText属性为”Welcome”.
通过拖动项目视图中的字体资源到Inspector中的Font属性来设置字体属性为Transformers Movie(或者通过点击Font边上带有小点的圆圈,然后选择字体从弹出的列表中):
调整欢迎文字的位置,当你在Unity编辑器和Unity Remote中测试游戏的时候,让你可以看的清楚。
将Welcome Text物件放到Intro GameObject下面。
当游戏开始运行的时候,你想要隐藏IntroGameObject(和它的子物件)。打开GameController脚本,然后做下面的修改:
var intro : Transform; ... function startGame() { ... // Turn off the intro text for (var child : Transform in intro ) { child.gameObject.renderer.enabled = false; } // Clean out any enemy objects ... |
这里你添加一个新的公共变量来得到Intro GameObject的句柄。然后你修改startGame()来让Intro GameObject不可见,通过关闭它的子GameObject的渲染。
现在通过选择主摄像头然后从Hierarchy视图中拖动Intro GameObject到InspectorGame ControllerIntro变量上来设置Intro变量。或者使用圆圈点图标,因为它更加容易.:]
试玩游戏来测试当play按钮被点击,游戏开始后文字隐藏起来了。
每个勇敢的小方块都需要一个音轨。
音乐在游戏的体验中扮演一个重要的角色,及提供感官的反馈也创造情绪。你将要添加音频来增强游戏性。
声音效果会被触发,当玩家按时通过终点线的时候,或者他们的任务失败,或者障碍物撞击到地上,或者碰到了任何东西。当然,游戏也需要一些背景音乐!:]
用Unity添加音频涉及关联一个Audio Source组件到一个GameObject上。这个Audio Source组件有一个Audio Clip属性让你可以分配你想要播放的声音。这个组件有其他附加的属性来控制声音是可以播放,也可以循环。支持音频格式包括.AIF, .WAV, .MP3, and .OGG.
下面两个网站提供免费的音乐,可以被用在这份教程中:
- http://incompetech.com/
- http://freesound.org/ (下载声音需要注册)
你先前下载的Resources.zip文件包括了所有你会用到的音频文件了。你可以自由创建你自己的音效来替代那些我提供给你的. :]
作为你的参考(并且为了找到原始的链接),在Resources.zip文件中包含的音频文件的原始链接如下:
- 胜利: 20784__wanna73__crowd-cheering-football-01.wav
- 失败: 83916__timbre__benboncan-sad-trombone-tweaked.wav
- 碰撞: 30668__hardpcm__hardbassdrum002.wav
- 背景: Gustav Sting.mp3
注意,在Resources.zip文件,为了清晰和简洁,文件已被重新命名。到你最初解压Resources.zip的文件夹下,然后通过拖动它们到你的Project ViewAssets文件夹下来导入音频文件。
当音频文件导入到Unity中,你可以指定是否压缩或保持现状,例如,自然的状态(但是注意MP3和Ogg Vorbis音频总是以压缩的格式导入的)
为什么会这样呢?压缩文件会更加小,但是它们需要在游戏运行的时候解压,会消耗CPU周期。你通常想要解压背景音乐。对于短的音效,自然状态会更好,并且可以提供更好的声音效果。
如果音频格式是压缩的,你可以选择是否通过硬件来处理解压,例如,Apple的硬件解码器,如果运行在iOS设备上。硬件会更快,但是硬件只能同时处理一个压缩的文件。
你也可以让声音有3D效果。意思是当播放声音的时候,效果会与GameObject的3D位置有相关性。举例来说,如果GameObject远离了你,声音会变得轻一些。
在项目视图中选择背景音乐,显示导入的设置。不要勾选3D Sound选项。选择 Hardware decoding。点击Apply来保存改变的设置。
另外一些音频文件是.WAV 文件,你不需要改变缺省的导入设置,也就是应该设置为3D和自然的音频格式。
对于被听到的声音,你的场景需要一个Audio Listener组件添加到一个GameObject中。场景里只有一个Audio Listener。这个收听者会从最靠近它的声音源捡起声音,然后把它发送到设备的喇叭上。
缺省情况下,Audio Listener关联到主摄像头。你可以把他放在那里或者关联它到一个不同的GameObject:例如,你的角色上。
在这个游戏中,你保留Audio Listener在主摄像头上,但是你可以体会一下不同的选择当你构建你自己的游戏的时候。
胜利和失败的音效
你打算关联音频到Goal GameObject上来模拟一个在终点线的观众欢呼或嘲笑。
在Hierarchy视图中选中Goal GameObject,然后通过选择ComponentAudioAudio Source来添加一个音频源。设置victory audio资源到InspectorAudio SourceAudio Clip属性。不要勾选在Awake播放的选项。
现在创建一个新的JavaScript资源用作播放一个胜利的声音或失败的声音。命名这个新的脚本为FanReaction。打开这个新的脚本,移除自动添加的函数,然后添加下面的代码:
var audioVictory : AudioClip; var audioDefeat : AudioClip; var volumeVictory : float = 2.0; var volumeDefeat : float = 2.0; function playSoundOfVictory(isVictory : boolean) { // Stop any current audio if (audio.isPlaying) audio.Stop(); // Play either the sound of victory or defeat. audio.clip = isVictory ? audioVictory : audioDefeat; audio.volume = isVictory ? volumeVictory : volumeDefeat; audio.Play(); } function resetGame() { // Reset to original state, stop any audio if (audio.isPlaying) audio.Stop(); } @script RequireComponent(AudioSource) |
这个脚本处理两段音频,一个是为胜利准备的,另一个是为失败准备的。playSoundOfVictory函数首先停止播放任何当前播放的声音,然后根据isVictory输入,播放需要的声音。
resetGame()函数会停止播放正在播放的任何声音。你会想起GameController在游戏每次重新开始的时候调用resetGame()。
关联这个新的脚本到Goal GameObject上。设置 victory audio资源到Audio Victory变量。设置defeat audio资源到Audio Defeat变量。
编辑GameController脚本,并做下面这些修改:
var fanReactionScript : FanReaction; ... function Update() { if (!gameRunning) return; // Keep track of time and display a countdown gameTimeRemaining -= Time.deltaTime; if (gameTimeRemaining <= 0) { timedOut = true; gameRunning = false; // Play the sound of defeat fanReactionScript.playSoundOfVictory(false); } } ... function MissionComplete() { if (!gameRunning) return; missionCompleted = true; gameRunning = false; // Play the sound of victory fanReactionScript.playSoundOfVictory(true); missionCompleteTime = gameTimeAllowed - gameTimeRemaining; } |
代码定义了一个新的公共变量来引用FanReaction脚本。你修改MissionComplete()来调用playSoundOfVictory,传递true来播放胜利的声音。你也要修改Update()来调用playSoundOfVictory(),传递false来播放失败的声音。
在主摄像头的GameController脚本组件的Goal GameObject带有一个变量来连接FanReaction脚本。在Inspector中选择主摄像头,然后点击GameController组件下面的fanReactionScript变量边上的圆圈点。在弹出的对话框下,选择Goal GameObject,然后关闭弹出的对话框。
要调用FanReaction中的resetGame(),选择主摄像头物件。在Inspector的Game Controller组件栏目,增加Game Object到Reset数组,从2到3.设置Goal GameObejct到Element 2.
试玩游戏,并且测试胜利和失败的场景,来确认游戏播放了正确的声音。检查声音是否停止,当你再次点击了Play按钮。
在3D环境下的轰的一声
当障碍物撞击到地面的时候,有某种声音也是不错的。要实现这点,你会关联一个音频源到Obstacle预制件,然后当障碍物落下或碰撞到任何其他东西的时候,你可以通过监测碰撞来播放碰撞的声音。
添加一个音频员组件到Obstacle预制件。分配impact audio到Audio Clip属性。
创建一个新的JavaScript脚本资源,然后命名它为ObjectCollision.编辑这个脚本,删除预先添加的函数,然后添加下面这些代码:
var impact : AudioClip; function OnCollisionEnter () { audio.PlayOneShot(impact); } @script RequireComponent(AudioSource) |
这段代码实现了预先定义的OnCollisionEnter事件函数,它调用audio.PlayOneShot()函数来播放撞击的音频。audio.PlayOneShot()展示了播放音频的另一种方式,允许你传递你想要播放的音频。
关联脚本到Obstacle预制件上。设置impact audio资源到脚本中的Impact变量。
试玩游戏,并检查当障碍物撞击地面或其他物件时你是否听到一个可喜的砰的一声。注意离障碍物玩家越近,声音越大。
小方块的音乐
你的游戏几乎完成了。但是那里还有一件事漏掉了 – 一些背景音乐。
对于游戏音乐制造了很多气氛。它可以让用户的肾上腺素流动,并且通过如鸟的声音或狼的嚎叫,帮助他们提供游戏环境的线索。所以添加一些音乐吧!
添加一个Audio Source组件到主摄像头。设置background audio资源到Audio Clip属性。
勾选Play on Awake和Loop属性。这些确保当游戏开始后背景音乐就开始播放,并会持续的播放。
调整volume从0.1直到它没有淹没了其他声音。如果你使用你自己的声音,根据你音乐缺省的音量级别微调音量级别来完成同样的目标。用户应该可以通道所有音效当背景音乐播放的时候。
在Unity编辑器里试玩这个项目。当完全满意后,部署这个项目到你的iOS设备上。你需要添加Level_3场景在 Build Settings中。
在你的iOS设备上测试整个游戏,直到你满意你添加的声音。
你英勇的小方块有了背景音乐来鼓舞它的士气。
向哪里进发?
恭喜,你已经到达到了Unity基础旋风演戏的结尾!你已经展示了你英勇小方块的活力和生机。这或许是Unity游戏精彩之旅的开始。
这里是这个系列教程的所有代码的源文件: Unity Project, Xcode Project.
相信或不相信,你只是知道了一些皮毛而已 – 那里还有很多东西要学。敬请关注马上就会来的中级教程系列,那带你到Unity一个下的级别。