一个数值框架,让效率提升10倍!

发表于2016-08-24
评论10 1.97w浏览

刚入行的时候,我调整一版完整的数值需要将近一周的时间,几个EXCEL之间来回切换查看再汇总统计让我十分忙乱,按照新的规划重新计算大量的数值让我非常疲惫,填写几十份的配置表让我无比痛苦。后来我不断地优化自己的数值框架,把一些EXCELVBA能处理的问题全部在框架中一次性解决,现在我只需要用半天就能调整一版完整的数值,效率提升了10倍。我的数值框架将我从高级填表员的工作中解救出来,让我能够将更多的时间和精力放在数值体验上,我的工作效率和质量都提高了一个档次。

本文将分享一套以战斗为主的数值框架,讲述一下做数值框架的思路和方法,希望能对大家有所帮助。

前期工作

一般而言,我做数值框架会从确定属性种类和战斗公式开始。

属性种类

很多游戏喜欢将属性分为一级属性和二级属性,这样做最大的好处是方便做出“加点”的玩法,但一般需要辅助以比较多的属性说明,否则玩家会比较难理解,你能直接看懂下面这张图中的几个一级属性代表什么意思么?

因为我做的游戏都没有加点这个概念,所以我都是直接用生命、攻击、防御、暴击这些属性种类,自己做着方便,玩家也容易理解。

 

几乎所有游戏中的属性类型都由血攻防这样的基础属性和暴击格挡穿透之类的高级属性组成,个人建议再规划一个超级属性超级属性指的是对PVP有决定性影响且十分难升满的属性,超级属性可以承载大R玩家的追求和消费,比如《拳皇98OL》在传统卡牌的基础上将“先手值”独立出来作为“超级属性”,其中很多的大R玩家为了追求“先手值”这一项属性消费了几万甚至十几万。

 

战斗公式

战斗公式不是本文的重点,相关的文章也很多,不再细述,简单说几点自己的体会:

1.         没有最好的,只有最合适的:刚入行的时候觉得像《WOW》、《暗黑》之类的战斗公式才叫牛逼,第一次看到damage=atk^2/atk+def)的时候虽然看不懂,但是感觉简直屌爆了。当时最鄙视的就是减法公式,damage=atk-def,尼玛小学生都会算,一点都不高端。后来发现《放开那三国》用的是减法、《传奇》用的是减法、畅销榜恶霸《梦幻西游》用的也是减法,自己用了一次之后才深深地体会到了减法公式易做反馈、适合做小差距、适合做小数值的特点,拿来做MMORPG十分好用。但如果是做MOBA,需要计算大量的平衡关系,就最好选用damage=atk*(c/(def+c))这种公式,因为这种公式下确定一个英雄的强弱只需要这个英雄自身的属性就可以。

2.         关键在于怎么用: 同样是减法公式,《传奇》和《传奇xxx私服》的体验完全不同。合适的公式确实会让之后的工作舒爽一些,但最终的体验如何还是要看如何使用。

3.         多动手: 网上有很多战斗公式相关的文章,一般都是写一下公式,找个例子算一下,再做几个函数图,最后总结一下。我自己就看了很多这样的文章,收获不小,不过还是有很多疑惑没有解开。其实很多时候遇到公式上的疑惑,自己算一算,对比对比,在相关游戏中跑一跑,会获得更深入更透彻的理解。

 

数值框架中要明确地列出都有哪些属性和这些属性的详细说明,也要将详细的伤害判定流程和伤害计算公式写出来。这样既能防止自己不小心遗忘,也能方便以后的交接。下面这张图是个简单的展示:

职业设定

职业设定一般而言有三个基本的目的:

1.         职业之间相对平衡(或是循环克制)

2.         职业差异化:不同职业的作用和体验不同

3.         整体战斗体验好:战斗节奏好,战斗时长能够接受

在数值框架中职业设定主要包含两大模块:属性模型,技能设定。

 

属性模型主要是为了方便调整平衡、战斗时长和职业差异化,其本质就是各职业属性的比例关系,个人的习惯是将属性模型中加入【技能输出系数】和【技能生存系数】两个数值,分别代表算上技能之后输出会变为几倍和生存能力会变为几倍,然后在技能设定中根据这两个系数去调整具体的技能数值。

 

技能设定时,需要运算多种技能的实际数值影响。其中倍数伤害、属性类buff、眩晕等类型的技能是可以直接转换成有效输出的,相对比较好算,如果不会的话找个数值策划群问一下就可以。而类似于加速、位移、陷阱之类的技能难以量化,需要不断地实测调整。各种技能的具体处理方式不再展开描述。

一些游戏将不同职业的属性比例做的完全相同,然后通过技能设定达到平衡和差异化的目的,十分简单粗暴,各位可以尝试用一下。

 

属性分配

个人习惯用最大模型和系统分配比例来做不同系统间的属性分配,再在各个系统内细调,这样做的好处是大的改动比较快,细节体验也能调。

系统间分配

为了方便说明,我们假设不同职业的属性比例现在完全相同,这样我们只需要做一套最大模型。将最大属性模型中的每一项属性与对应的各个比例相乘即可得到每个系统应分配的具体属性。大致结构如同下表:

说是“最大”属性模型,但往往扩展系统时会发现属性不够大,因此到后期属性比例中一些属性的比例总和会超过100%

最大属性模型一般都是通过将职业直接放大得到,但要注意一些公式将各职业属性等比放大后会破坏平衡,比如damage=atk*(c/(def+c))

 

系统内分配

某个系统的的属性分配主要包含4个模块:

1.         可分配属性:对应系统间分配出来的属性、

2.         分配思路:文字描述,记录自己在这个养成系统是用怎样的思路分配每级的属性的,否则到后面自己都会忘记为何这样分配,如果有特殊的计算公式的话我也会记录在这里。

3.         分配参数:即使是几百上千级的成长,也可根据几个参数和公式来调控。

4.         最终属性表:通过上面三个模块计算得出的最终结果,如下图

 

经济关联

做经济系统时,我会将每天把消费产出全部拿完的玩家定为标准玩家,然后可以通过产出和消耗预算出标准玩家的成长情况。因为没有办法确定玩家具体会进行什么样的操作,所以这里的一切计算都是估算,比如玩家可能优先把材料全用来升武器,也可能材料全都放背包里不用,没有办法确定,所以我就按照玩家将所有材料平均分配到每一件装备上培养来估算玩家的装备培养等级。

所有系统的经济做完后,我们可以得到一张表,里面有玩家在每个等级时各个养成系统的等级和玩家的总属性,类似下图:

 

怪物属性

有了通过经济关联算出的玩家属性,我们可以很轻松地得出各个等级对应的每种怪物属性。为了调整方便,我用怪物被玩家打时的生存时间和怪物打死玩家要用的时间来做参数。最终会得到一个类似于下图的表:

如果没有特殊需求的话,所有怪物都可以从这个表中直接取值。

做怪物数值时需要注意的点:

1.         上图中的表格没有技能,实际使用时需要注意技能的计算

2.         没有特殊需求的话,就将所有种类怪物的防御统一为一个值,比如玩家攻击的80%或是直接用0

3.         表中是以格斗家为标准做的怪物数值,在一些职业特性比较强的游戏中需要注意各个职业的战斗体验,否则可能出现治疗职业半分钟杀一个小怪之类的问题

配置导出

将计算结果按照配置的形式关联到另一张表,然后通过VBA导出配置表,并不是很难,一会提供代码,先简单说下使用我的导出需要注意的地方:

1.         要在b1单元格填入导出后的表名

2.         需要导出的工作表的命名中需要有“-3”

3.         代码的本质是将第六行以下所有有内容的单元格复制到另一个EXCEL中,并将该EXCEL重命名存在与数值框架相同路径下的output文件夹中

4.         用这种方式导出的表需要另建一个文档写相关的配置说明

5.         需要注意一些美术资源的配置

6.         要养成在数值框架中改表导出的习惯

这个导表VBA并不是很强大,使用不熟练时很容易出错,但一旦用顺手之后效率会提升很多倍。

 

VBA代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
Sub 单表导出()
 
    If Dir(ThisWorkbook.Path & "output", vbDirectory) = "" Then
 
        MkDir (ThisWorkbook.Path & "output")
 
    End If
 
    
 
    If ActiveSheet.Name Like "*-3*" Then
 
        With ActiveSheet
 
            a = .Range("a65535").End(3).Row
 
            b = .Range("IV6").End(1).Column
 
            arr1 = .Range(.Cells(6, 1), .Cells(a, b))
 
            
 
            Filename = .Range("b1")
 
        End With
 
        If Filename = "" Then
 
            MsgBox (Sheets(i).Name & "中的表名为空")
 
            i = Sheets.Count
 
        End If
 
        
 
        For Each xls In Workbooks
 
            If xls.Name = Filename & ".xlsx" Then
 
                xls.Close
 
            End If
 
            
 
        Next
 
                
 
                Dim wb As Workbook
 
        Set wb = Workbooks.Add
 
        wb.ActiveSheet.Range(Cells(1, 1), Cells(a - 5, b)) = arr1
 
        
 
        Application.DisplayAlerts = False
 
        wb.SaveAs ThisWorkbook.Path & "output" & Filename & ".xlsx"
 
        Application.DisplayAlerts = True
 
    
 
        wb.Close
 
    End If
 
End Sub
 
  
 
Sub 导出()
 
    If Dir(ThisWorkbook.Path & "output", vbDirectory) = "" Then
 
        MkDir (ThisWorkbook.Path & "output")
 
    End If
 
    
 
    For i = 1 To Sheets.Count
 
        If Sheets(i).Name Like "*-3*" Then
 
            With Sheets(i)
 
                a = .Range("a65535").End(3).Row
 
                b = .Range("IV6").End(1).Column
 
                Filename = .Range("b1")
 
                arr1 = .Range(.Cells(6, 1), .Cells(a, b))
 
            End With
 
            If Filename = "" Then
 
                MsgBox (Sheets(i).Name & "中的表名为空")
 
                i = Sheets.Count
 
            End If
 
            
 
            For Each xls In Workbooks
 
                If xls.Name = Filename & ".xlsx" Then
 
                    xls.Close
 
                End If
 
                
 
            Next
 
                    
 
            
 
            Dim wb As Workbook
 
            Set wb = Workbooks.Add
 
            wb.ActiveSheet.Range(Cells(1, 1), Cells(a - 5, b)) = arr1
 
            
 
            Application.DisplayAlerts = False
 
            wb.SaveAs ThisWorkbook.Path & "output" & Filename & ".xlsx"
 
            Application.DisplayAlerts = True
 
        
 
            wb.Close
 
        End If
 
    Next i
 
    
 
End Sub


其他

1.         数值框架中包含游戏中所有的数值,后期框架中将有很多个工作表,建议做一个目录

2.         根据自己的需求去设计框架结构,少做无用功。我曾经为了结果准确,做了个很复杂的战斗模拟器,做完时程序的战斗模块已经做完了,之后我再全都是配到游戏中直接体验,再也没有用过这个模拟器。

3.         用颜色区分一下内容的类型,但不要用太多的颜色。

4.         实际应用时记得在框架中体现出不同层次玩家的数据,这样可以帮助你猜想各类玩家的体验

 

结语

文章中的截图是我临时做的一个简化框架,其中只做了格斗家一个职业的详细数值,但功能基本是完整的。仅供各位参考,欢迎各种交流~

简化框架见附件(GAD不能上传xlsm,xls格式可能有些问题),如果我的分享对你有所帮助,希望给我投上一票,投票链接:http://gad.qq.com/megagame/index/53


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引