感谢前辈写的文档,我来分享一手 成长曲线设计方法研究 问题的提出数值设计中经常遇到成长曲线的设计,比如主角MaxHP随等级的成长曲线。这类设计往往首先确定两个端点,如1级时1000HP,40级时3000HP,然后再在这两点之间拉出一条曲线来。根据设计需要,这条曲线可能凸也可能凹,可能平缓也可能陡峭,这就需要在设计时留下可方便调节的参数;进一步地,要求不同的成长曲线之间,能够对成长特征进行量化的比较。 根据这两点要求,整理出了常用的三种方法:双曲线、抛物线、指数线。为了增强设计的可阅读性和可操作性,在双曲线部分重点介绍了设计思路和过程,也建议其他同学在进行类似设计时,能够将一些参数和中间变量的意义解释清楚,方便后来的同学阅读和操作。 双曲线简化 首先,将问题“设计一条从(Xmin,Ymin)到(Xmax,Ymax)的成长曲线”,简化为“设计一条从(-1,-1)到(1,1)的成长曲线”,这样可以抛开具体数值的影响,而专注于曲线自身的特征。 函数 考虑双曲函数:,-1<p<1,-1<=x<=1。 1. 曲线经过(-1,-1)和(1,1)两点; 2. 当p=0时,曲线为线性函数;当-1<p<0时,曲线为下凸函数;当0<p<1时,曲线为上凸函数; 3. 曲线经过(0,p)点,换句话说,曲线的纵截距就是参数p的大小;因此: 4. 越大,曲线越陡峭;越小,曲线越平缓; 5. p的大小可以用来比较两条双曲线的成长特征; 映射 接下来,只要先把实际问题中的X映射到该函数中,得到x,再根据函数计算得到y,最后映射回实际问题中,就可以得到对应的Y了,即: 将X从(Xmin,Xmax)映射到(-1,1)中,结果为;令,,可以得到:; 根据函数和x值,计算出对应的y值; 将y从 (-1,1)映射到(Ymin,Ymax)中,结果为,整理后有:Y=y*Ydif+Ysum; 具体操作过程见EXCEL文档。 抛物线简化 与双曲线处理方法相同。 函数 考虑二次函数:,-0.5<=p<=0.5,-1<=x<=1。 1. 曲线经过(-1,-1)和(1,1)两点; 2. 当p=0时,曲线为线性函数;当-0.5<=p<0时,曲线为下凸函数;当0<p<=0.5时,曲线为上凸函数; 3. 曲线经过(0,p)点,换句话说,曲线的纵截距就是参数p的大小;因此: 4. 越大,曲线越陡峭;越小,曲线越平缓; 5. p的大小可以用来比较两条双曲线的成长特征; 映射 与双曲线处理方法相同。 具体操作过程见EXCEL文档。 指数线简化 与双曲线处理方法相同。 函数 考虑指数函数:,-1<p<0或0<p<1,-1<=x<=1。 1. 曲线经过(-1,-1)和(1,1)两点; 2. 当-1<p<0时,曲线为下凸函数;当0<p<1时,曲线为上凸函数;p不能取0; 3. 曲线经过(0,p)点,换句话说,曲线的纵截距就是参数p的大小;因此: 4. 越大,曲线越陡峭;越小,曲线越平缓; 5. p的大小可以用来比较两条双曲线的成长特征; 映射 与双曲线处理方法相同。 具体操作过程见EXCEL文档。 比较三条曲线都经过(0,p)点,越大,曲线越陡峭;越小,曲线越平缓;p的大小可以用来比较两条相同曲线的成长特征。 p=0时,双曲线和抛物线都退化为直线,指数线的p值不能取0; 0<<=0.5时,三条曲线的形状相差不大; 0.5<<1时,抛物线的单调性会发生变化,也就是对称轴会落到两个端点之间; 接近于1时,双曲线和指数线都趋近无限陡峭,双曲线变化地更快;这是抛物线做不到的,换句话说,由于单调性的限制,抛物线的最大陡峭程度在=0.5时取到,因此可能无法达到实际需要的陡峭程度。 用表格简单比较三种曲线: | 双曲线 | 抛物线 | 指数线 | 表达式 | | | | p取值 | (-1,1) | [-0.5,0.5] | (-1,0)或(0,1) | p=0时 | 退化为直线 | 退化为直线 | 不能为0,无法退化为直线 | 趋于1时 | 变化较快 | | 变化较慢 | 陡峭程度 | 无上限 | =0.5时达到上限 | 无上限 |
综合来看,抛物线的设计存在硬伤,是三者之中最差的方法;双曲线表达式简单,是三者之中最优的方法;而在设计某些比较陡峭的成长曲线时,可以考虑采用指数线,可调控的区间要相对大一些。 总结 上面分布讨论了双曲线、抛物线、指数线的设计方法,在熟练掌握之后,也可以使用其它中间变量作为参数;但是使用p作为统一调节参数的好处就在于,它可以作为曲线形状的量化指标;对于同样类型的曲线,可以根据需要很容易地设计不同的成长速度;如果采用其他参数,往往会受实际数值影响,而不能准确体现曲线的成长特征。 略去中间过程,双曲线的公式为:,直接引用可以使设计过程变得简洁。
该贴已经同步到 mentuosi的微博 |