计算机游戏程序设计实验指导书67河北工业大学.docx
《计算机游戏程序设计实验指导书67河北工业大学.docx》由会员分享,可在线阅读,更多相关《计算机游戏程序设计实验指导书67河北工业大学.docx(16页珍藏版)》请在冰豆网上搜索。
计算机游戏程序设计实验指导书67河北工业大学
计算机游戏程序设计
实验指导书
河北工业大学
计算机科学与软件学院
实验6持久化数据和应用程序
一、实验目的与要求
1.熟悉并掌握数据的存储方法,包括轻量级数据存储和文件存储。
2.熟悉并掌握应用程序类的相关方法。
3.熟悉并掌握鼠标拖动模型的实现。
二、实验原理及知识点
喜欢玩游戏的朋友应该很清楚,很多游戏中都会出现与“存储进度”、“读取进度”相关的菜单项,玩家一般将其称为游戏存档功能。
他们用于保存玩家的游戏数据,并且还可以通过读取之前的游戏进度继续游戏,这就牵扯到数据存储。
一般情况下,系统只存储一些轻量级的数据,比如字符型、整型、浮点型数据等。
这是因为数据类型越简单,存储与读取就越迅速。
此外,所有数据的存储都是通过流的形式来完成的,系统使用流将数据写入文件或从文件读取至程序。
1PlayerPrefs类
Unity提供了一个用于本地持久化保存与读取数据的类——PlayerPrefs。
它的工作原理是以键值对的形式将数据保存在文件中,这就好比给需要保存的每一个数据赋予名称,在将其成功存入本地存档以后,程序就可以根据这个名称取出上次保存的数据。
1.1保存与读取数据
PlayerPrefs类可保存与读取3种基本的数据类型,它们是浮点型、整型和字符串型,涉及的方法如下。
□SetFloat():
保存浮点类型。
□SetInt():
保存整型。
□SetString():
保存字符串型。
□GetFloat():
获取浮点类型。
□GetInt():
获取整型。
□GetString():
获取字符串型。
这些函数的用法基本相同,使用Set进行保护,使用Get进行读取。
下面列举一个存储与读取整型数据的例子。
//保存整型
PlayerPrefs.SetInt("Teat",100);
//读取数据
inti=PlayerPrefs.GetInt("Test",888);
保存数据时,需要调用对应的Set方法,该方法的第一个参数表示存储数据的名称,第二个参数表示具体存储的数值:
读取数据时,需要调用对应的Get方法,其返回值就是读取后的数值,该方法的第一个参数表示读取数据的名称,第二个参数表示读取数据的默认值,即如果通过数据名称没有找到对应的值,那么就直接返回数据的默认值。
1.2删除数据
此外,PlayerPrefs类还提供了两种删除数据的方法:
第一种为删除某一项数据,第二种为删除所有数据。
为了安全起见,删除前还需判断系统中是否存有该数据。
删除数据的方法如下。
□DeleteAll():
将所有键对应的值数据统统删除。
□DeleteKey():
删除某一项数据,其参数为所删除数据的名称。
□HasKey():
判断是否存有这项数据,其参数为判断的数据名称。
2自定义文件
如果需要在程序中处理大量的数据,使用PlayerPrefs类就不太适合了,因为PlayerPrefs是轻量级的存储。
在存储电子小说这类文字资源非常海量的数据时,可以先将文字数据保存在本地文件中,再通过流去读取本地的资源数据,然后将其显示在屏幕中。
此外,使用流还可以在程序中动态地创建本地文本文件,也可以将字符串信息动态地写入本地文本文件。
2.1文件的创建与写入
文件的创建与写入都需要使用流来操作。
要创建与写入文件,首先需要3组相关信息:
创建文件的路径、名称以及写入文件的内容。
创建本地文件时,需要使用FileInfo类,在构造方法中写入文件的保存路径。
通过对FileInfo的对象使用CreateText()方法,可在本地创建一个文本文件,使用AppendText()方法可代开以创建的文本文件,最后调用WriteLine()方法可将字符串写入刚刚创建的文本文件中。
2.2文件的读取
文件的读取和写入一样,需要使用流来处理。
文本文件中的数据是逐行存储的,因此可以使用流将文本内容逐行读出。
读取文件时,首先需要获取文件流,然后以循环的方式通过sr.ReadLine()方法将文本文件中的内容全部按行读取出来,读取完毕后该方法将返回null。
3应用程序
应用程序是一项非常重要的属性,所有应用程序相关的方法都写在Application类中。
它可以获取或设置当前程序的一些属性,比如加载游戏关卡,获取资源文件路径,退出当前游戏程序,获取当前游戏平台等。
3.1创建关卡
游戏关卡也可以称为游戏场景。
任何一个完整的游戏都是由若干场景组成的,比如游戏菜单场景、游戏主界面场景、战斗场景、胜利场景和通关场景等。
通过这些场景的组合,可将整个游戏拆分成若干个模块,而在程序中可使用代码直接切换这些模块。
使用Unity创建一个新游戏项目,然后在导航菜单栏中选择“File”->“NewScene”菜单项创建一个新关卡(同一个游戏项目中可以存在任意数量的游戏关卡),然后系统默认会将主摄像机加入到场景中,随后可以在该场景中任意编写脚本或编辑地图,最后使用快捷键“Command+s”保存在对应场景中即可。
3.2切换关卡
如需使用代码切换关卡,首先需要在应用程序中授权该关卡。
在Unity菜单栏中选择“File”->“BuildSettings”菜单项,在打开的界面中点击右下角的“AddCurrent”按钮可为当前游戏关卡授权,上面方框内的内容就是授权过的关卡信息,右侧数字关卡的ID。
值得注意的是,ID为0的关卡表示程序运行时第一个进入的场景,选择某个关卡后,使用鼠标上下拖拽即可修改其ID。
选中某个关卡,按下键盘上的“delete”即可删除该关卡。
在代码中使用Application.LoadLevel()方法读取新关卡后立即切换,其参数为所读取的新关卡的名称。
4鼠标拖动模型
首先了解一下处理鼠标事件的六大方法,这些方法都是由脚本继承的父类MoveBehaviour实现的,只需要在脚本中监听其方法即可。
例子中创建了一个普通的立方体对象。
为了在脚本中监听鼠标的事件,需要将脚本绑定在该对象中,处理鼠标事件的代码如代码清单中所示。
本例主要实现了鼠标在屏幕中对模型的拖曳,所以需要监听鼠标点中该模型时的事件,这里OnMouseDrug()方法即可监听到鼠标点中立方体对象的事件,然后获取鼠标当前的x轴与y轴坐标并动态地修改立方体的位置,实现鼠标拖曳模型的效果。
三、实验内容及步骤
1.编写代码实现轻量级数据的存储和读取。
2.编写代码实现自定义文件的存储和读取。
编写脚本绑定到相机上
usingUnityEngine;
usingSystem.Collections;
usingSystem.IO;
usingSystem;
publicclassnewGUI:
MonoBehaviour{
voidStart(){
PlayerPrefs.SetString("122494","jiaquanye");
CreateFile(Application.dataPath,"FileName","贾全烨");
ArrayListarr=LoadFile(Application.dataPath,"FileName");
foreach(stringstrinarr)
{
Debug.Log(str);
}
}
voidCreateFile(stringpath,stringname,stringinfo)
{
StreamWritersw;
FileInfot=newFileInfo(path+"/"+name);
if(!
t.Exists)
{
sw=t.CreateText();
}
else{
sw=t.AppendText();
}
sw.WriteLine(info);
sw.Close();
sw.Dispose();
}
ArrayListLoadFile(stringpath,stringname)
{
StreamReadersr=null;
try{
sr=File.OpenText(path+"/"+name);
}
catch(Exceptione)
{
returnnull;
}
stringline;
ArrayListarr=newArrayList();
while((line=sr.ReadLine())!
=null)
{
arr.Add(line);
}
sr.Close();
sr.Dispose();
returnarr;
}
voidOnGUI(){
GUILayout.Label(PlayerPrefs.GetString("122494"));
}
}
3.编写代码实现鼠标拖动模型。
将代码绑定到相机上
usingUnityEngine;
usingSystem.Collections;
publicclassmove:
MonoBehaviour{
voidOnMouseDrag(){
Debug.Log("鼠标拖动");
}
voidOnMouseDown(){
Debug.Log("鼠标按下");
}
voidOnMouseUp(){
Debug.Log("鼠标抬起");
}
voidOnMouseEnter(){
Debug.Log("鼠标进入");
}
voidOnMouseExit(){
Debug.Log("鼠标离开");
}
voidOnMouseOver(){
Debug.Log("鼠标停留");
}
}
四、实验仪器与软件
1.PC计算机
2.Unity3D软件
五、实验报告要求
描述实验的基本步骤,给出各个步骤中取得的程序运行结果和源代码,并进行必要的讨论。
实验7游戏多媒体
一、实验目的与要求
1.熟悉并掌握音频的播放、暂停、停止,和音量等控制方法。
2.熟悉并掌握视频的播放、暂停、停止等控制方法。
二、实验原理及知识点
多媒体是游戏中必不可少的元素之一,而游戏中的多媒体主要包括音频和视频。
1游戏音频
游戏音频在游戏开发中占据着重要的地位,优秀的音乐与音效可以提升游戏的整体效果。
总的来说,音频可以分为两种,一种为游戏音乐,另一种为游戏音效,前者多为较长的音乐,入游戏背景音乐;而后者则多是较短的音效,如开枪或打怪物时“砰砰”的游戏音效。
1.1音频介绍
Unity3D游戏引擎共支持4种音乐格式的文件,具体如下:
■aiff:
适用于较短的音乐文件,可用作游戏音效
■wav:
适用于较短的音乐文件,可用作游戏音效
■mp3:
适用于较长的音乐文件,可用作游戏音乐
■ogg:
适用于较长的音乐文件,可用作游戏音乐
1.2添加音频
可以将一个音频文件拖拽到Project资源视图中,并将音乐文件放置在audio文件夹内,选择已绑定音频组件的游戏对象,此事右侧的Inspector视图中将出现该对象的音频组件信息。
此时,可以在右侧的Inspector视图中看到音频组件所包含的属性,通过调节这些属性可以使音乐文件更加完善。
下面简要列举其中各个属性的含义。
■AudioClip:
声音片段,可对其直接赋值或在代码中动态地截取音乐文件。
■Mute:
是否静音
■BypassEffects:
是否打开音频特效
■PlayOnAwake:
开机自动播放
■Loop:
循环播放
■Priority:
音频播放的优先级,0表示优先级最高,256表示优先级最低,默认数值为128。
■Volume:
音量大小,取值为0.0—1.0
■Pitch:
播放速度,取值范围在-3—3之间,设置为1表示正常播放,小于1表示慢速播放,大于1表示加速播放
需要注意的是,必须在MainCamera中勾选“AudioListener”组件。
默认情况下,该组件被绑定在主摄像机中。
此外,用户也可以创建一个游戏对象来绑定该组件,否则Unity将无法播放音频文件。
1.3播放音频
系统在播放音频时,需要使用AudioSource组件对象,具体的操作方法是在Hierarchy视图的编辑器中将已绑定音频组件的游戏对象拖拽赋值给脚本中的“AudioSource”对象。
在代码中,AudioSource对象可使用Play()、Stop()、Pause()方法直接控制音乐播放、停止或暂停。
。
2游戏视频
视频元素能够丰富游戏的效果,一般情况下,大型3D游戏都会选择游戏中的精彩视频作为开场动画吗,这回给首次进入游戏的玩家带来眼前一亮的感觉。
在Unity中,我们需要使用MovieTexture(电影纹理)来添加游戏视频。
MovieTexture对象继承自纹理对象,所以其用法与纹理基本一样。
Unity支持的视频格式包括.mov、.mpg、.mpeg、.mp4、.avi和.asf。
2.1创建视频
在播放视频之前,需要先创建电影纹理。
直接将视频文件拖入Project视图中,系统会自动生成对应的电影纹理。
然后在右侧的Inspector视图设置视频的相关属性,其中各个属性的含义如下。
■AnisoLevel:
播放等级,直接影响视频播放的效果。
■FilterMode:
视频播放模式。
■Loop:
是否循环播放。
■Quality:
视频原始资源压缩比例。
2.2播放视频
和音频组件一样,电影纹理也需要绑定在某个游戏对象上才能发挥其效果。
一般情况下,游戏视频都是以平面形式展现的,所以可以在游戏场景中创建一个“Plane”(面)对象。
播放视频时,应使主摄像机照射在面的中央。
由于默认情况下3D世界比较黑暗,所以可以在其中添加一些灯光。
具体实现参照教材的9.2.2节中例子。
2.3GUI播放视频
电影纹理不仅可以在对象中播放,也可以在GUI中播放,不过在GUI中播放的效率要比在游戏对象中低一些,但是在GUI中可随意修改视频的尺寸。
在代码中,使用GUI.DrawTexture()方法来绘制电影纹理该方法的第一个参数用于设置电影纹理的绘制区域,可比较灵活地控制视频的尺寸。
Plane对象属于网络模型,而网络模型的尺寸是无法轻易修改的,所以在播放视频时,它不如GUI灵活。
三、实验内容及步骤
1.编写代码实现音频的播放、暂停、停止,和音量等控制方法。
导入音频资源:
编写脚本:
usingUnityEngine;
usingSystem.Collections;
publicclassmusic:
MonoBehaviour{
publicAudioSourcemusic1;
publicfloatvol;
//Usethisforinitialization
voidStart(){
vol=0.5f;
}
//Updateiscalledonceperframe
voidUpdate(){
}
voidOnGUI(){
if(GUILayout.Button("Play")){
if(!
music1.isPlaying)
{
music1.Play();
}
}
if(GUILayout.Button("Stop")){
if(music1.isPlaying)
{
music1.Stop();
}
}
if(GUILayout.Button("Pause")){
music1.Pause();
}
vol=GUILayout.HorizontalSlider(vol,0f,1f);
music1.volume=vol;
}
}
界面
2.编写代码实现视频的播放、暂停、停止等控制方法。
将视频文件绑定在相机上,编写脚本:
usingUnityEngine;
usingSystem.Collections;
publicclassTest:
MonoBehaviour
{
//电影纹理
publicMovieTexturemovTexture;
voidStart()
{
//设置电影纹理播放模式为循环
movTexture.loop=true;
}
voidOnGUI()
{
//绘制电影纹理
GUI.DrawTexture(newRect(0,0,Screen.width,Screen.height),movTexture,ScaleMode.StretchToFill);
if(GUILayout.Button("播放/继续"))
{
//播放/继续播放视频
if(!
movTexture.isPlaying)
{
movTexture.Play();
}
}
if(GUILayout.Button("暂停播放"))
{
//暂停播放
movTexture.Pause();
}
if(GUILayout.Button("停止播放"))
{
//停止播放
movTexture.Stop();
}
}
}
四、实验仪器与软件
1.PC计算机
2.Unity3D软件
五、实验报告要求
描述实验的基本步骤,给出各个步骤中取得的程序运行结果和源代码,并进行必要的讨论。