?游戏平衡很重要,然而,却往往得不到开发者的重视。或者,没有花时间仔细去做调整。
做过游戏开发的,都听说过一个词叫“数值爆炸”,实际上就是平衡没做好。
怎么样才能算是平衡呢?
玩家投入游戏的有两个,要么投入时间(提高熟练度),要么氪金(提高强度)。
让用户的投入,能通过某种方式体现出来,就是个好的平衡。
而作为开发者应该对玩家投入的时间,特别是首次、单次游戏的时间有所计划。
以前娱乐较少的时候,游戏首次、单词投入的时间能达到30分钟,而现在有个5分钟就不错。哪怕是3A大作,如果不能让玩家5分钟内上手,往后就难了。
现代游戏开发有个指标,策划让新玩家内测,他会希望 N% 的用户能够玩到 N 分钟。
比如2048游戏,希望80%的用户能合成到128,
比如Flepybird 游戏,希望80%的用户能飞10米。
比如羊了个羊 游戏,希望0.0001%的用户能通过第二关。
你必须要有类似这个目标,才能去调游戏数值。
这个题目很大,展开了都能开专题了。所以这里只是一个引子,希望大家重视。
回归本游戏,游戏平衡怎么做?
既然这是个非氪金游戏,那么就要让用户熟练度在游戏中有所体现。我们希望,80%用户能玩到5分钟,就很难再继续前进了。
首先第一个平衡是玩家火力和敌人的平衡。
敌人的总血量要考量几个因素:
-》单敌人单位的血量
-》敌人出现间隔
而玩家火力包括常规攻击方式和道具伤害。或者你可以理解为持续伤害和爆发伤害。
我们应该让他处于一种状态:玩家熟练度高时,可以干掉所有敌机,熟练度不足时,就要放过一部分敌机。简单做个乘除法就可以得到。
另一个平衡是玩家血量和敌机火力的平衡。
敌机火力于几个因素:
-》敌机生成密度
-》敌机开火密度
-》敌机子弹伤害
以上所有的这些东西,我们前面都是有数值控制的。
现在我们要做的是:
1、把这些数值都抽出来,放在统一的地方,以方便修改
。。。
#define PlayerMaxLife 12000
#define EnamyMaxLife 1000
#define EnemyBulletDam 400
#define EnemyRocketDam 2000
#define PlayerBulletDam 400
。。。
2、调整这些数值,看看每个数值对游戏影响,特别是确定每个数值的合理范围。这很重要,也很花时间。
3、用变量来代替这些数值,随着时间的进行,自动修改参数提高难度。
我们期望的效果是,在5分钟里我们让玩家:
1、前两分钟轻松打怪,积攒道具
2、中间两分钟有点扛不住,必须依靠道具才能继续
3、道具补充的速度赶不上消耗的速度,试图通过躲闪节省道具使用(通过这个阶段驱动玩家提高熟练度)
4、道具用完了,迅速崩溃
最终,我决定采用每分钟出现一次BOSS,出现BOSS时,缩小其他敌机出现的频率。
uint8_t EnemyManager::tick(uint32_t t) {
if (createTimer.tick(t)) {
EnemyBase *enemy = createEnemyObject();
enemy->init();
ListPushBack(enemyList, (LTDataType) enemy);
}
if (createBossTimer.tick(t)) {
createTimer.defaultSpan -= 200;
EnemyBase *enemy = new EnemyT3();
enemy->init();
ListPushBack(enemyList, (LTDataType) enemy);
}
for (ListNode *cur = enemyList->next; cur != enemyList; cur = cur->next) {
EnemyBase *enemy = ((EnemyBase*) (cur->data));
enemy->tick(t);
}
return 0;
}
这样,每过一分钟,敌机出现间隔少200ms。难度也随之增加了。