好久不见。

这回拖的有点久,一方面是因为很忙(懒),另一方面是写到一半的时候推翻了一次,所以没控制好时间...

闲话少叙,书接上文吧。

在上一回中,我们完成了:

1、创建项目。

2、添加世界管理器。

3、通过世界管理器生成及管理城市和野外。

好像大概是这个样子:

本回目标:

1、加入英雄。

2、英雄可与周围的城市、野外进行互动。

3、建立简单的数值系统,驱动英雄决策。

上回中,为了快速看到效果,我们将城市和野外全部写到了世界管理器中,但这似乎不是一个很好的解决方法,这是因为:

随着项目的发展,每当需要为城市、野外添加更多功能时(如:城市建设、野外刷新等),都无法从它们自身(城市、野外)出发去做处理,都需要通过世界管理器去配置数据,再通过逻辑将他们组合成城市、野外的样子。

长此以往,世界管理器将储存更多与其本身职责定位无关的数据(如:野外剩余资源量、英雄探索野外的进度数据等)。换位思考,如果你是世界管理器,你不烦么?你肯定会想:“介跟我有嘛关系?我只要管你们(城市、野外)就行了,你们自己的事儿难道自己不会管么?讨厌!死鬼!

我敢打赌,如果坚持这么做,过不了多久,世界管理器就会庞大、复杂到你再也不想打开它的程度,这也就是所谓的:一胖毁所有。

无论你是否单身,在Unity的世界里,你都不愁找不到对象,因为一切都是对象。

因此,在我们要加入英雄之前,先用对象的概念来稍稍调整一下项目,将城市、野外的逻辑从世界管理器中独立出来。

重构城市、野外

介于目前对于城市、野外的功能需求还是很简单,我们就先弄成这样吧:

建立脚本

修改City、Field的Prefab

简而言之就是将曾经属于城市的功能(创建周围的野外)放到了City中去做,而世界管理器仅生成城市并随机位置。

加入英雄

首先,让我们先脑补一下英雄应该是什么样子:

1、爱野外,不探索,毋宁死。

2、会自主选择野外前往并进行探索。

3、探索结束后根据情况考虑返回城市恢复战斗力。

4、恢复后开始一个新的探索。

让我们用一个简单的状态机来描述一下:

让我们先把工作简单分成两部分:

1、快速实现状态机,跑通流程。

2、设置一个简单的数值体系:英雄数值,野外数值。

快速实现状态机

先定下一些简单的规则:

1、生成的野外都有一定的资源量用于英雄探索。

2、野外的资源量被探索到0后,将消失。

3、英雄探索中会损失生命值。

4、英雄生命值减少为0后会选择距离最近的城市进行恢复。

5、英雄生命值恢复后会继续探索野外。

为了快速跑通流程,我们先将麻烦的部分简单处理,如:二手手游账号购买英雄随机选择下一个探索的野外;每个野外的资源量设置为固定值等。

英雄确定目的地

英雄向目的地移动

探索野外

恢复生命值

疲于奔命的英雄

为了能更好的看到野外剩余资源量和英雄的血量,我们分别为它们添加两个血条意思一下,并用脚本控制。

用个圆柱体冒充一下血条吧

疲于奔命的带血条的英雄

好了,我们已经有一个可以毫无原则,像没头苍蝇一样探索世界的英雄了。

虽然很多时候在现实中我们做事就是如此,但是游戏与现实毕竟是不同的,所以我们要为它们(英雄、野外等)添加一套简单的数值体系,来让英雄的探索更有逻辑性一些。

设置一个简单的数值体系

我们先把上面提到的规则稍微细化一下:

1、野外的数据包含资源量、经验值、金钱、声望。

2、英雄的数据包括等级、经验、力量、力量成长系数、生命值、金钱、声望、金钱向和声望向。

3、每个被创建的野外随机[10. 30]的资源量,每个被探索完的野外将在若干秒后重置成新的随机野外。

4、每个野外都有难度系数,难度系数的范围在[1, 5],系数升序难度递增。

5、每个难度对应一个探索最低力量值,英雄等于此力量值时,探索花费的时间等于资源量,低于此力量会延长探索时间,高于则会缩短探索时间。

6、英雄探索野外会获得经验值、金钱、声望,英雄得到足够的经验值会升级,升级会根据力量成长系数来增加力量,英雄的最高等级为30级。

7、英雄每花费1秒钟探索野外,将消耗1点生命值,每个英雄都有100点生命值,不会随等级提升而提升,英雄生命值消耗到0时将前往最近的城市进行恢复 。

8、每个难度对应一个英雄等级,高于此等级的探索会得到较少的经验和声望,反之亦然。

9、英雄可创建多个,且它们的初始等级、力量成长系数会有一些差别。

10、英雄会结合自身情况及野外情况,根据收益最大化原则确定下一个要探索的野外,而非简单的随机。

11、收益由野外的资源量、经验值、金钱、声望、探索时间、前往野外的路途时间共同决定。

12、英雄的金钱向、声望向影响英雄对野外的行动策略,金钱向较高的英雄会对产金币更高的野外抱有更大兴趣;声望同理。

做这样一个简单的数值系统并不麻烦,虽然我没有数值策划的经验,可是我有Excel啊。

英雄升级所需经验及力量提升表

野外难度对应英雄等级及力量表

探索野外时等级、力量差距对应的经验、声望及探索时间倍数关系表

因为数据量并不大,数据的维度也不复杂,我们用Excel搭建一个小工具来模拟一下这套数值系统。

可以看到,随着野外难度的提升,对应的收益最大等级也在增加。

为了保证收益最大化,英雄会选择适合自己等级的野外来探索。

我们的目的是:

1、英雄随着等级的提升,逐步抛弃低收益的低难度野外,选择更高级的野外进行探索。

2、世界管理器则根据英雄平均等级的提升,调整新野外的平均等级。

我们希望看到的是:

1、多个英雄时,英雄们自主选择探索目标、自由探索并提升等级。

2、由于初始等级、力量成长系数不同,英雄间会拉开差距。

3、随着英雄平均等级的增长,世界管理器将维护出更多更高级的野外。

让我们奔着这个目标开始吧。

实现数值体系对世界的影响

先确定一下英雄属性、野外属性的数据结构:

替换英雄原来的随机计算权重方式,变换为由一个计算器统一计算:

当然,具体计算的公式是参考上面Excel结果写的。

为了能快点看到效果,就偷懒的使用.csv这种方式读取吧。

为了更直观的在地图上区别出不同难度的野外,我们为每个难度设置了不同颜色。

这时我们再设置随机难度的野外时,地图会变成这样:

再调整一下世界管理器,因为一个野外被探索完毕时,在一定时间后会重置;而重置出的野外,需要根据世界所有英雄、野外的情况来动态调整其难度。而世界管理器作为唯一对所有对象情况都有了解的家伙,需要承担这个“主持大局”的责任。

最后,我们为其他对象补充上应该具有的一些功能,就差不多了:

英雄的金钱、声望向需要随机设置

野外产生金币、声望的比例也要随机浮动

英雄获取经验并提升等级

野外自动重置并获取新的数据

看看效果吧:

加入很多英雄后,我们的世界变成了这个样子

验证

如果你能看到这里,应该也会发现一个问题:我们如何验证这个数值系统是否存在问题呢?

如:

1、英雄是否根据自己的喜好(金币,声望)去选择对应产量不同野外探索?

2、不同的力量成长是否会拉开英雄之间的距离?

巧了,我也不知道。

能很快想到的办法就是:让世界运转一段时间,然后收集英雄们的数据来看一下与预期是否相同。

简单的数据收集系统

用多倍速运行一段时间后,我们得到了一份英雄成长记录,用excel简单处理一下后,让我们使用公式来验证一下:

1、声望向/金币向高意味着英雄更看重声望的获取,因此它选择探索的野外通常具有较高的声望回报率。

2、相反的,金币向高的英雄更看重金币获取,因此它选择探索的野外通常具有较高的金币回报率。

3、当英雄的声望向与金币向基本相同时,所探索野外的金币回报率也会高于声望回报率,是因为声望获取是随英雄等级提升而减少的,而金币则不会。

总体而言,较高的力量成长系数提高了英雄的经验获取速率,因为较高的力量成长系数影响英雄的绝对力量值,而力量值影响野外探索时间。

嗯,貌似还差不太多呢,有bug也就先这样吧。

下回,将添加一个简单的UI界面,用以实时观察英雄和野外的情况。

从零点五开始,做半个不能玩的小游戏(二)相关推荐

  1. 使用Unity从零点五开始,做半个不能玩的小游戏(完)

    在上一回<从零点五开始做半个不能玩的小游戏(二)>中,我们完成了下列事情: 1.重构野外.城市及英雄代码. 2.为英雄添加了简单的状态机,使其可以在世界中玩耍. 3.搭建了简单的数值体系, ...

  2. 从零点五开始用Unity做半个2D战棋小游戏(完)

    好久不见. 这是第29篇与游戏开发有关的文章. | 写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动 ...

  3. 用Unity做半个2D战棋小游戏

    写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动攻击,先消灭掉所有敌人的一方将获得胜利. 今天我们来 ...

  4. 从零点五开始用Unity做半个2D战棋小游戏(一)

    好久不见. 这是第17篇与游戏开发有关的文章. 也是"从零点五开始系列"第二辑的开始. | 写在最前 这次想要做的一个小游戏,或者说一个小Demo,其实是一个简单且传统的战棋战斗场 ...

  5. 从零点五开始用Unity做半个2D战棋小游戏(二)

    好久不见. 这是第18篇与游戏开发有关的文章. | 写在最前 这次想要一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方 ...

  6. 从零点五开始用Unity做半个2D战棋小游戏(十一)

    好久不见. 这是第28篇与游戏开发有关的文章. | 写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动 ...

  7. 从零点五开始用Unity做半个2D战棋小游戏(十)

    好久不见. 这是第27篇与游戏开发有关的文章. | 写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动 ...

  8. 从零点五开始用Unity做半个2D战棋小游戏(九)

    写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动攻击,先消灭掉所有敌人的一方将获得胜利. 预计将分为 ...

  9. 从零点五开始用Unity做半个2D战棋小游戏(八)

    写在最前 这次想要一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动攻击,先消灭掉所有敌人的一方将获得胜利. 预计将分为以 ...

最新文章

  1. linux下安装nginx、python、django
  2. 《树莓派用户指南(第3版)》——2.1 连接显示器
  3. Oracle 左外连接的一些測试
  4. 从另一个角度理解分布式系统与CAP定理
  5. 除了PS,原来这个也可以轻松实现图像处理!
  6. html5 地图效果,html5 echarts图表插件炫光的分布地图动画特效
  7. 单元测试中使用Mockito模拟对象
  8. linux系统中存放用户账号信息的文件是,信息安全技术题库:Linux系统中,用户登录密码的hash是存放在()文件中的。...
  9. 【Java学习笔记之三】java中的变量和常量
  10. linux服务器怎么安装360杀毒软件,360主机卫士Linux版使用安装教程
  11. ps快捷键常用表,ps快捷键大全!最全面的PS快捷键使用指南(图文演示)
  12. 怎么设置计算机键盘数字键,电脑右边的数字键不能用怎么办_电脑右边数字键盘用不了的修复方法...
  13. 法国奢侈品牌VILEBREQUIN限时精品店登陆北京老佛爷百货
  14. 吃瓜教程(2021.07)task1(1-2章)
  15. autojs之大柒侧滑栏详解
  16. python,全自动获取图片,并下载你喜欢的美女图片
  17. 重拾MFC小细节之动态更新对话框背景图片
  18. IM群聊头像九宫格实现方式
  19. java之getResource方法
  20. STM32(Cortex-M3)中的优先级概念

热门文章

  1. aes解压命令 linux,Linux使用tar和openssl加密和解密文件
  2. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码
  3. VIM_shortcut_Cheat_sheet
  4. 高斯分布 (Gaussian distribution)
  5. [小程序]小程序框架的简单页面布局
  6. linux 网络的一些书籍
  7. Cassandra--启用用户认证和用户管理
  8. Notepad++ 删除空白行的方法(转)
  9. 会话技术(session/cookie)
  10. 【转】MySQL innodb_autoinc_lock_mode 详解 ,并发插入时主键冲突的解决方案