英语原文共 8 页,剩余内容已隐藏,支付完成后下载完整资料
外文翻译 | 1401160230 | 徐畅
基于Unity 3D的卡牌游戏的设计与开发
Yucong Pana, Kun Wangb, Hanqi Shaoc, Zhenghe Chend, Wenli Donge, Xin Wangf
北京邮电大学 数字媒体与设计艺术学院,北京
作者邮箱略
关键词:Unity 3D; 协程; 角色扮演游戏; 卡牌游戏
摘要:纸牌游戏起源于两个或两个以上的人玩的桌上角色扮演牌游戏。玩家在游戏背景的范围内进行角色扮演,并使用基于回合制策略的纸牌玩游戏。纸牌游戏是中国手机游戏市场的主流,由于其非实时性,它们在编码方面与普通游戏有很大不同:很大一部分计算不是在Update()中完成的,而是使用Unity中的方便功能协程解决。此论文详细介绍了一款名为“命运之投”的纸牌游戏的开发过程,包括游戏设计,编程,界面设计,纸牌模型和映射等。 其中,编程是整个游戏的关键部分。 如何利用协作方便地实现游戏的许多功能是技术环节上的创新。
1、引言
命运之投是一款以纸牌为叙事核心的角色扮演游戏。每次您抓牌时,您都会遇到一个故事或遇到一些需要玩家参与的事件。有可能会遇到一定数量的敌人,也可能需要做出一些决定。抽出最后一张纸牌后,您将进入最后一战并知道故事的结局。此游戏一共有三个结局,这取决于您在游戏中所做的决定。如果您耗尽生命或被敌人击败,您将失败。游戏中的战斗和选择基本上是使用桌面上的六个骰子完成的。 每个骰子上都有三种不同的模式:剑,盾和闪电。他们分别代表攻击,防御和充能。为了防止结果过于依赖运气,我们为玩家设置了重置机制。完成第一个掷骰后,您可以锁定任意数量的所需骰子,并重投其他骰子。
2、游戏设计
2.1 战斗系统
命运之投的战斗系统基本上类似回合制游戏。为了赢得这场战斗,您需要审慎决定如何处理每次掷骰的结果。如前所述,每个骰子有三种不同的模式。以下详细介绍它们的功能。
(1)防御:如果您通过掷骰获得了一个盾牌,那么您将获得一个防御点。之后,您将获得一个吸收伤害盾牌,该盾牌等于您的护甲乘以防御点。每一回合开始时,防御点都会被清除。
(2)充能:骰子上显示的闪电代表一个充能点,当您在充能条上填充满10个充能点时,您可以使用独特的技能“正义之剑”,它将极大地伤害一个敌人并为您提供吸收伤害的盾牌。
(3)攻击:剑指的是攻击点,将您的骰子投下后,您就可以使用攻击点攻击敌人。 每次攻击将花费一个攻击点并造成特定敌人的伤害,您的攻击能力取决于您的攻击能力。
玩家回合结束后,将有一个敌人回合,每个敌人将攻击该玩家,其伤害也取决于他们的攻击力。如果可能的话,一些敌人将使用他们的特殊技能来严重伤害玩家。 然后又会有另一个玩家回合。
2.2 卡的内容
游戏的卡组总共包含约25张卡牌:
1.一套起始卡牌,旨在介绍游戏的故事和角色。
2.两套分集卡牌,其中包括一些选择,将对故事的结局产生重大影响。并且它也可能影响您角色的状态。
3.一套结局卡牌,其中列出了您所达到过的结局。故事的结局完全取决于您之前所做的选择。
4.剩下的卡称为基本卡牌,可以分为敌人卡,事件卡和藏宝卡:
“敌人卡”表示您遇到了一些必须击败的敌人。它将启动游戏的战斗系统。“事件卡”将触发特殊事件,这可能会为玩家提供一些选择。尽管无论您选择什么,它都不会影响您的结局,但可能会改变角色的状态,例如攻击力或健康状况,无论是正面还是负面。至于“藏宝卡”,它将为您提供打开宝藏盒的机会。但是,里面的宝藏也可能对您的角色产生某些有害影响。
玩家开始新游戏后,系统将自动生成一张纸牌序列,该序列确定您将抽出的纸牌顺序。因此,玩家进行一局和之前玩过的完全相同的游戏的可能性很小。
3. 代码设计
3.1 关于协程:
由于其特殊性,卡牌游戏与普通的实时格斗游戏有很大的不同。在实时战斗中,很大一部分计算是通过Update()完成的,但是对于卡牌游戏(如“回合制”游戏),我们需要在Unity中使用一个非常方便的功能:协程。
什么是协程? Unity中的协程是可以暂停执行,在暂停后立即返回并继续执行直到功能完成的函数。这就像一个子线程单独出现,以较少的消耗处理一些问题,但是MonoBehaviour提供的主线程中只能有一个正在运行的协程。
协程的特点是:
1.当协程程序遇到中断指令(yield return)时,它将暂停。
2.一旦协程的执行被挂起,它将立即返回到主要功能。然后,它在暂停后继续执行协程的其余功能。
3.中断指令完成后,协程将在中断指令的下一行继续执行。
4.在同一时间一个脚本实例可能具有多个挂起的协程,但只有一个正在运行的协程。
5.协程中的函数主体完成后,协程结束。
6.协程可以在一定数量的帧后轻松控制行为。
7.协程在性能上相比一般功能几乎没有更多的消耗。
3.2 如何建立一个协程
IEnumerator MethodName(object Parameter1,object Parameter2,...)
{
emsp;emsp;//to do sth
emsp;emsp;yield return YieldInstruction;
emsp;emsp;//to do sth else
}
图1. 如何建立一个协程
使用关键字IEnumerator来建立一个协程,然后使用StartCoroutine(IEnumerator惯例)。您也可以使用StopCoroutine()或是StopAllCoroutine()来终止协程。
3.3 关于中断指令
表1. 中断指令
使用说明 |
描述 |
实作 |
WaitForSeconds |
等待指定的秒数 |
Yield return new WaitForSeconds(2); |
WaitForFixedUpdate |
等待固定帧 |
Yield return new WaitForFixedUpdate(); |
WaitForEndOfFrame |
等待一帧的结束 |
Yield return new WaitForEndOfFrame(); |
StartCoroutine |
启动新的协程并等待其结束。 |
Yield return StartCoroutine(other coroutine); |
WWW |
等待加载完成 |
Yield return www; |
例如,如果使用yield return new WaitForSeconds(0.8f),协程将暂停0.8秒,然后继续执行。 如果您使用yield return StartCoroutine(OtherCoroutine()),则将启动新的协程,并且在完成新协程后将继续执行。 由于其灵活性,我们可以在游戏开发过程中简单地实现许多困难的目标。 这里有一个例子:
IEnmerator GameMainProcess()
{
emsp;emsp;//Wait for game to start
emsp;emsp;while (!gameStart)
emsp;emsp;{
emsp;emsp;emsp;emsp;yield return null;
emsp;emsp;}
emsp;emsp;//Main process
emsp;emsp;while(!gameEnd)
emsp;emsp;{
emsp;emsp;emsp;emsp;CanSelectCard = true;
emsp;emsp;emsp;emsp;AnimationManager.instance.CardHighlight(CanSelectCard);
emsp;emsp;emsp;emsp;isSelecting = true;
emsp;emsp;emsp;emsp;while (isSelecting)
emsp;emsp;emsp;emsp;{
emsp;emsp;emsp;emsp;emsp;emsp;yield return null;
emsp;emsp;emsp;emsp;}
emsp;emsp;emsp;emsp;yield return new WaitForSeconds(0.5f);
emsp;emsp;emsp;emsp;if(currentNum==1 || currentNum==5 || currentNum==7 || currentNum==14 || currentNum==15 || currentNum==20)
emsp;emsp;emsp;emsp;emsp;emsp;//Start the Coroutine to handle battle system
emsp;emsp;emsp;emsp;emsp;emsp;yield return StartCoroutine(Battle());
emsp;emsp;emsp;emsp;else if(currentNum==29 || currentNum==32 || currentNum==35)
emsp;emsp;emsp;emsp;{
emsp;emsp;emsp;emsp;emsp;emsp;GameEnd();
emsp;emsp;emsp;emsp;}
emsp;emsp;emsp;emsp;else
emsp;emsp;emsp;emsp;emsp;emsp;//Start the Coroutine to trigger an event
emsp;emsp;emsp;emsp;emsp;emsp;yield return StartCoroutine(GameEvent());
emsp;emsp;}
}
图2. 协程例子
3.4 服务器和数据库
图3.连接工作
为了实现云存储和服务器数据处理,我们使用Photon Server,Visual Studio和MySQL来构建服务器和数据库。
首先,我们应该设置Photon Server并确保配置了相应的Photon Server运行时环境。然后,我们可以使用Visual Studio构建服务器,以通过Unity游戏控制台实现其相应的连接和数据传输功能。在MySQL数据库建立之后,我们可以通过MySQL创建数据库列表,该列表存储用户登录信息,角色状态信息和等级信息。如此我们可以通过服务器读取它们。Photon Server和MySQL之间的数据传输通过NHibernate将数据库存储列表映射到服务器,然后通过服务器添加,删除和更改MySQL中存储的数据,然后实现相应的功能。Unity和Photon Server之间的网络连接和数据传输。在Unity游戏方面,通过访问服务器的IP地址来连接服务器,并实现两者之间的数据传输功能。
4. 美术
4.1 用户界面
由于龙是游戏的终极BOSS,因此我们选择与龙匹配的图片来匹配场景,同时增加神秘的氛围,调整色调,使整个背景更加统一。
图4.游戏背景
图5.按钮
图6. 登录界面
4.2 卡牌建模
卡牌建模是在MAYA中完成的。在早期,它是传统概念中的矩形薄游戏卡。为了追求逼真的效果并将其与整个游戏风格相匹配,我们尝试了四个卡角的倒角圆度、反复测试倒角的程度。最后,我们确定了下图所示的画像。
图7.卡牌3D模型
在MAYA中,我们应用卡片3D模型地图分割,将UI映射导出为PNG,然后在PhotoShop中进行绘制。这就是我们完成模型映射工作的方式。 下图显示了要测试的未映射的空白卡UI图像(左)和映射的卡UI图像(右)。
图8.卡牌纹理
4.
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[254221],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。