资源描述
《Anonia》游戏详细设计阐明书
2024年9月
开发团队:Chem Block
学校:大连理工大学
重要开发人:鄢世阳
目录
1 引言 2
1.1 编写目 2
1.2 项目背景 2
1.3 定义 3
1.4 参照资料 4
2 总体设计 4
2.1 游戏剧情概述 4
2.2 软件构造 4
3 程序描述 5
3.1 界面模块 5
3.2 角色创立模块 30
3.3 交易模块 39
3.4 NPC模块 40
3.5 敌人模块 59
3.6 保存模块 89
3.7 音乐系统模块 91
3.8 测试要点 93
3.8.1 测试范畴 93
3.8.2 测试办法 93
文档名称:《Anonia》游戏详细设计阐明书
项目名称:Anonia艾诺尼亚历险记
项目负责人:鄢世阳
编写鄢世阳8月30日
校对所有小构成员9月1日
审核所有小构成员9月2日
批准刘苑星9月3日
开发单位:大连理工大学Chem Block团队
成员: 鄢世阳何达威刘苑星刘佳鑫李旭
1 引言
1.1 编写目
《Anonia》是一款开放式动作RPG游戏,它融合东西方奇幻世界背景,突破单一世界设定。本游戏以清新亮丽唯美风格为游戏画面,以国家之间冲突为游戏基调,强调创造一种让玩家互动生活虚拟世界,勉励玩家之间交流、对抗,实现以玩家为游戏真正创造者目。《Anonia》游戏设计初衷在于为青少年高压快节奏生活提供一种放松平台,这个阶段重要任务是在概要《Anonia》游戏设计书基本上,对概要设计中产生功能模块进行过程描述,设计功能模块内部细节,涉及算法和详细数据构造,为编写源代码提供必要阐明。
概要设计解决了《Anonia》游戏总体构造设计问题,涉及整个游戏构造、模块划分、模块功能和模块间联系等。详细设计则要解决如何实现各个模块内部功能,即模块设计。详细说,模块设计就是要为已经设定游戏模块各子系统设计详细算法,对实现细节作精准描述。将模块划分为界面、魔法、交易、战争等各种模块用算法和数据构造建立模块间联系,保证了游戏整体感。
1.2 项目背景
《Anonia》这款游戏是卡通渲染方式展示一种爱恨交织虚拟世界,她可以推动国内动漫游戏产业发展。国际动漫当前已形成了成熟产业链,它一方面通过卖动画票房和电视播出收入作为第一块收入,图书和音像收入为第二块,除了图书和音像制品以外,尚有大量衍生产品,重要体当前玩具、直销、商品和主题公园几大块。动漫作为一种新兴文化产业,从诞生之初就和高科技联系在一起,是高新技术发展产物。当今欧美、日、韩以强大品牌力量,高水准制作技术和健全市场运作成为动漫产业强国。美国、日本和英国动漫及其衍生产品已经成为国民经济中支柱性产业,韩国以超常速度发展动漫产业,规模仅次于美日。 年,全球数字内容产业产值预测将达 2228 亿美元,其中网络游戏业产值达800 亿美元,动画业产值达450 亿美元,与游戏、动漫业有关周边衍生产品产值则在5000 亿美元以上。 1)美国动漫产业。美国动画片通过长期发展,形成鲜明特点,在动画艺术上获得了辉煌成就,也是最初把动画片推向市场,并且形成产业规模国家。迪斯尼公司最具代表性,到 年已经制作了第44 部动画片,同步销售有关产品,形成一条完整动漫产业链。迪斯尼公司在海外也不断扩张,香港迪斯尼乐园已是全球第 11 个主题乐园。美国有 8 大动漫公司,是全世界最大动漫国家,这个行业每年收入超过 1000 亿美元。 2)日本动漫产业。日本动画片在欧美、东南亚以及国内均占有较大市场。当前全球播放动画节目约有60%是日本制作,漫画杂志和单行本发行量已占杂志和图书发行总量45%,动漫画互相渗入,日本电子游戏产品也得到了飞速发展,由此衍生出动画电影、玩具等产品,创下近1 万亿日元产业规模,同步也扩大了日本文化在世界影响力。 3)韩国动漫产业。韩国动漫产业在全球市场份额中不大,但发展势头强劲, 年产业规模仅为3200 亿韩元, 年将实现17000亿韩元目的。手机游戏被列入国家863筹划,中华人民共和国手机游戏市场规模为3.07亿元,全年手机游戏市场实现8.84亿元产值.诺达征询预测,随着WAP和JAVA/BREW等游戏业务进一步成熟,国内手机游戏市场规模达到13.28亿元,比增长56.7%,手机游戏市场将达到22.84亿元,比增长71.9%。,全球数字动漫产业产值已达2228亿美元,与动漫产业有关周边衍生产品产值则在5000亿美元以上,英国数字娱乐产业年产值占GDP7.9%,成为该国第一大产业。美国网络游戏业已持续4年超过好莱坞电影业,成为全美最大娱乐产业。日本游戏市场每年创造2万亿日元市值规模,动画产品出口值远远高于钢铁出口值。韩国动漫业产值占全球30%,已成为韩国国民经济六大支柱产业之一。从全球及重要国家来看,动漫产业已经成为一种庞大产业。 国内动漫总创收达117亿元人民币,国内动画片生产总量只有2.9万分钟,市场需求却在26.8万分钟,实际需求缺口达23万分钟,电视台严重感到动画资源局限性。在中华人民共和国青少年最爱慕动漫作品中,日本动漫占60%,欧美动漫占29%,而中华人民共和国原创动漫,涉及港台地区比例只有11%,明显落后于国外动漫产业发展步伐,整个中华人民共和国动漫产业仅处在初级发展阶段。在上半年,各地兴起了建设动漫产业基地,在有关扶持政策勉励下,投资动漫产业高潮。
1.3 定义
•Mysql:数据库管理软件
•Unity3D:跨平台游戏开发工具
•Android:运营环境
•C#:软件开发语言
•Visual Studio :编译工具
1.4 参照资料
《Unity3D\2D手机游戏开发》金玺曾著
2 总体设计
2.1 游戏剧情概述
主人公从高处坠落,醒来时发现自己身处在一种被白雪覆盖小镇,而自己是谁也不记得了。就这样,主人公为了找回自己失去记忆开始了一段奇妙旅行。
2.2 软件构造
软件使用Unity3D进行开发,运营平台是Android,并支持跨平台到其她各种系统平台。软件在PC端构架是.Net Framework 4.5。软件是以scence为基本,model上附着刚体性质,并与script想链接构成Prefab。
3 程序描述
3.1 界面模块
3.1.1底部物品栏
底部物品栏是手机RPG游戏必备要素,咱们使用Unity3DGUITexture功能进行编写。代码如下:
using UnityEngine;
using System.Collections;
public class BottomBar :MonoBehaviour {
private Vector2 defaultScreenRes;//Screen Resolution
[System.Serializable]
public class GUISetting
{
public Vector2 position;
public Vector2 size;
public Texture2D[] texture;
}
[System.Serializable]
public class LabelSetting
{
public Vector2 position;
public GUIStyle labelStyle;
}
[HideInInspector]
public float currentCastTime;
[HideInInspector]
public float castTime;
[HideInInspector]
public bool showCastBar;
public GUISetting expBar;//exp bar setting
public LabelSetting expText;//exp text setting
public GUISetting castBar;//cast bar setting
private PlayerStatus playerStatus;
// Use this for initialization
void Start () {
defaultScreenRes.x = 1920;//declare max screen ratio
defaultScreenRes.y = 1080;//declare max screen ratio
GameObject go = GameObject.FindGameObjectWithTag("Player"); //Find player
playerStatus = go.GetComponent<PlayerStatus>();
}
void OnGUI () {
// Resize GUI Matrix according to screen size
ResizeGUIMatrix();
if(!MessageBox.showMessageBox)
{
//Cast bar
if(showCastBar)
{
GUI.BeginGroup(new Rect(castBar.position.x,castBar.position.y,castBar.size.x,castBar.size.y));
GUI.DrawTexture(new Rect(0,0,castBar.size.x ,castBar.size.y),castBar.texture[0]);
GUI.BeginGroup(newRect(0,0,Convert(castBar.size.x,castTime,currentCastTime),castBar.size.y));
GUI.DrawTexture(new Rect(0,0,castBar.size.x,castBar.size.y),castBar.texture[1]);
GUI.EndGroup();
GUI.EndGroup();
}
//Exp bar
GUI.BeginGroup(new Rect(expBar.position.x,expBar.position.y,expBar.size.x,expBar.size.y));
GUI.DrawTexture(new Rect(0,0,expBar.size.x ,expBar.size.y),expBar.texture[0]);
GUI.BeginGroup(new Rect(0,0,Convert(expBar.size.x,playerStatus.expMax,playerStatus.status.exp),expBar.size.y));
GUI.DrawTexture(new Rect(0,0,expBar.size.x,expBar.size.y),expBar.texture[1]);
GUI.EndGroup();
GUI.EndGroup();
//Exp text
TextFilter.DrawOutline(new Rect(expText.position.x ,expText.position.y,1000 ,1000)
,Mathf.FloorToInt(playerStatus.status.exp).ToString() + "/" + Mathf.FloorToInt(playerStatus.expMax).ToString(),expText.labelStyle,Color.black,Color.white,2f);
}
// Reset matrix after finish
GUI.matrix = Matrix4x4.identity;
}
void ResizeGUIMatrix()
{
// Set matrix
Vector2 ratio = new Vector2(Screen.width/defaultScreenRes.x ,Screen.height/defaultScreenRes.y );
Matrix4x4 guiMatrix = Matrix4x4.identity;
guiMatrix.SetTRS(new Vector3(1,1,1),Quaternion.identity,new Vector3(ratio.x,ratio.y,1));
GUI.matrix = guiMatrix;
}
float Convert(float maxWidthGUI,float maxValue,float curValue) //Calculate hp bar-mp bar
{
float val = maxWidthGUI/maxValue;
float load = curValue*val;
return load;
}
}
3.1.2命令菜单
命令菜单制作也是用了Unity3DOnGUI函数。
代码如下:
using UnityEngine;
using System.Collections;
public class CommandMenu :MonoBehaviour {
private Vector2 defaultScreenRes;//Screen Resolution
[System.Serializable]
public class ButtonSetting
{
public Vector2 position;
public Vector2 size;
public GUIStyle buttonStlye;
}
public ButtonSetting status,bag,equip,skill;//button setting
// Use this for initialization
void Start () {
defaultScreenRes.x = 1920;//declare max screen ratio
defaultScreenRes.y = 1080;//declare max screen ratio
}
// Update is called once per frame
void OnGUI () {
// Resize GUI Matrix according to screen size
ResizeGUIMatrix();
if(!MessageBox.showMessageBox)
{
//when click button status
if(GUI.Button(new Rect(status.position.x,status.position.y,status.size.x,status.size.y),"",status.buttonStlye))
{
GUI_Menu.instance.OpenShortcutMenu("Status");
}
//when click button inventory
if(GUI.Button(new Rect(bag.position.x,bag.position.y,bag.size.x,bag.size.y),"",bag.buttonStlye))
{
GUI_Menu.instance.OpenShortcutMenu("Inventory");
}
//when click button equipment
if(GUI.Button(new Rect(equip.position.x,equip.position.y,equip.size.x,equip.size.y),"",equip.buttonStlye))
{
GUI_Menu.instance.OpenShortcutMenu("Equipment");
}
//when click button skill
if(GUI.Button(new Rect(skill.position.x,skill.position.y,skill.size.x,skill.size.y),"",skill.buttonStlye))
{
GUI_Menu.instance.OpenShortcutMenu("Skill");
}
}
// Reset matrix after finish
GUI.matrix = Matrix4x4.identity;
}
void ResizeGUIMatrix()
{
// Set matrix
Vector2 ratio = new Vector2(Screen.width/defaultScreenRes.x ,Screen.height/defaultScreenRes.y );
Matrix4x4 guiMatrix = Matrix4x4.identity;
guiMatrix.SetTRS(new Vector3(1,1,1),Quaternion.identity,new Vector3(ratio.x,ratio.y,1));
GUI.matrix = guiMatrix;
}
}
3.1.3死亡窗口
角色死亡时会显示死亡窗口,代码如下:
using UnityEngine;
using System.Collections;
public class DeadWindow :MonoBehaviour {
[System.Serializable]
public class GUISetting
{
public Vector2 position;
public Vector2 size;
public Texture2D texture;
}
[System.Serializable]
public class ButtonSetting
{
public Vector2 position;
public Vector2 size;
public GUIStyle buttonStlye;
}
private Vector2 defaultScreenRes;//Screen Resolution
public GUISetting cautionWindow;//window setting
public ButtonSetting buttonReturn,buttonQuit;//button setting
public string sceneQuitGame;//name scene quit when you select quit button
//Private variable
private HeroController controller;
public static bool enableWindow;//check enable disable window
// Use this for initialization
void Start () {
defaultScreenRes.x = 1920;//declare max screen ratio
defaultScreenRes.y = 1080;//declare max screen ratio
GameObject go = GameObject.FindGameObjectWithTag("Player"); //Find player
controller = go.GetComponent<HeroController>();
}
void OnGUI()
{
// Resize GUI Matrix according to screen size
ResizeGUIMatrix();
if(enableWindow)
{
//draw window
GUI.DrawTexture(new Rect(cautionWindow.position.x,cautionWindow.position.y,cautionWindow.size.x,cautionWindow.size.y),cautionWindow.texture);
//when click return
if(GUI.Button(new Rect(buttonReturn.position.x,buttonReturn.position.y,buttonReturn.size.x,buttonReturn.size.y),"",buttonReturn.buttonStlye))
{
controller.Reborn();
}
//when click quit game
if(GUI.Button(new Rect(buttonQuit.position.x,buttonQuit.position.y,buttonQuit.size.x,buttonQuit.size.y),"",buttonQuit.buttonStlye))
{
Invoke("LoadScene",0.3f);
}
}
// Reset matrix after finish
GUI.matrix = Matrix4x4.identity;
}
void ResizeGUIMatrix()
{
// Set matrix
Vector2 ratio = new Vector2(Screen.width/defaultScreenRes.x ,Screen.height/defaultScreenRes.y );
Matrix4x4 guiMatrix = Matrix4x4.identity;
guiMatrix.SetTRS(new Vector3(1,1,1),Quaternion.identity,new Vector3(ratio.x,ratio.y,1));
GUI.matrix = guiMatrix;
}
void LoadScene()
{
Application.LoadLevel(sceneQuitGame);
enableWindow = false;
}
}
3.1.4任务系统界面
作为rpg游戏里必要有任务系统,代码如下:
using UnityEngine;
using System.Collections;
public class QuestWindow :MonoBehaviour {
[System.Serializable]
public class GUISetting
{
public Vector2 position;
public Vector2 size;
public Texture2D texture;
}
[System.Serializable]
public class ButtonSetting
{
public Vector2 position;
public Vector2 size;
public GUIStyle buttonStlye;
}
[System.Serializable]
public class LabelSetting
{
public Vector2 position;
public GUIStyle style;
public bool enableStroke;
public Color strokeColor;
}
private Vector2 defaultScreenRes;//Screen Resolution
public GUISetting questWindow;//window setting
public ButtonSetting buttonAccept,buttonCancel;//button setting
public LabelSetting titleFont,detailFont,rewardLabel,itemNameFont,targetLabel,targetFont;
[HideInInspector]
public HeroController controller;//script controller
public static bool enableWindow;//check enable/disable window
public static bool enableButtonAccept;// check enable/disable accept button
private Quest_Data questData;
private Item_Data itemData;
private Monster_Data monsterData;
[Multiline]
public static string detailQuest;
public static string titleQuest;
public static Vector2 condition;
public static Vector2 reward;
private int questID;
private string itemRewardName;
private string conditionName;
// Use this for initialization
void Start () {
enableWindow = false;
defaultScreenRes.x = 1920;//declare max screen ratio
defaultScreenRes.y = 1080;//declare max screen ratio
GameObject go = GameObject.FindGameObjectWithTag("Player"); //Find player
controller = go.GetComponent<HeroController>();
questData = GameObject.Find("QuestData").GetComponent<Quest_Data>();
itemData = GameObject.Find("Item_Data").GetComponent<Item_Data>();
monsterData = GameObject.Find("MonsterData").GetComponent<Monster_Data>();
}
void OnGUI()
{
// Resize GUI Matrix according to screen size
ResizeGUIMatrix();
if(enableWindow)
{
if(!controller.dontMove)
controller.dontMove = true;
//Draw window
GUI.DrawTexture(new Rect(questWindow.position.x,questWindow.position.y,questWindow.size.x,questWindow.size.y),questWindow.texture);
if(enableButtonAccept)
{
//Draw accept button
if(GUI.Button(new Rect(buttonAccept.position.x,buttonAccept.position.y,buttonAccept.size.x,buttonAccept.size.y),"",buttonAccept.buttonStlye))
{
SoundManager.instance.PlayingSound("Accept_Quest");
NpcSetup.resetMessageBox = true;
NpcSetup.disableNext = false;
MessageBox.showMessageBox = false;
MessageBox.showNameTag = false;
MessageBox.showFace = false;
questData.StartQuest(questID);
controller.dontMove = false;
controller.dontClick = false;
enableButtonAccept = false;
enableWindow = false;
}
//Draw cancel button
if(GUI.Button(new Rect(buttonCancel.position.x,buttonCancel.position.y,buttonCancel.size.x,buttonCancel.size.y),"",buttonCancel.buttonStlye))
{
NpcSetup.resetMessageBox = true;
MessageBox.showMessageBox = false;
MessageBox.showNameTag = false;
MessageBox.showFace = false;
NpcSetup.disableNext = false;
controller.dontMove = false;
enableButtonAccept = false;
enableWindow = false;
}
}
//Title Quest
if(titleFont.enableStroke)
TextFilter.DrawOutline(new Rect(titleFont.position.x ,titleFont.position.y,1000 ,1000)
,titleQuest,titleFont.style,titleFont.strokeColor,titleFont.style.normal.textColor,2f);
else
GUI.Label(new Rect(titleFont.position.x ,titleFont.position.y,1000 ,1000),titleQuest,titleFont.style);
//Detail Quest
if(detailFont.enableStroke)
TextFilter.DrawOutline(new Rect(detailFont.position.x ,detailFont.position.y,1000 ,1000)
,detailQuest,detailFont.style,detailFont.strokeColor,detailFont.style.normal.textColor,2f);
else
GUI.Label(new Rect(detailFont.position.x ,detailFont.position.y,1000 ,1000),detailQuest,detailFont.style);
//Target Label
if(targetLabel.enableStroke)
TextFilter.DrawOutline(new Rect(targetLabel.position.x ,targetLabel.position.y,1000 ,1000)
,"Target",targetLabel.style,targetLabel.strokeColor,targetLabel.style.normal.textColor,2f);
else
GUI.Label(new Rect(targetLabel.position.x ,targetLabel.position.y,1000 ,1000),"Target",targetLabel.style);
//Target
if(targetFont.enableStroke)
TextFilter.DrawOutline(new Rect(targetFon
展开阅读全文