游戏开发中需要很多的配置,这些配置往往由程序提供固定格式的excel,由策划配置。借助于excel强大的功能可以很方便的进行很多配置。
但并不是所有配置都适合用表格,比如一套复杂的技能,可能是有很多参数,技能还可以有子技能。越是灵活性越强大的程序实现,对配置
的要求就越高。策划可能会被一大堆id在表里索引引来索引去,搞得晕头转向,毕竟人不是机器。
我们游戏中为了降低配置复杂度,部分配置采用lua文件(策划有脚本能力),很多地方策划还没想好,不能给出特定的需求。这就诞生了让
策划可以自己配置公式的需求
下边是我lua实现的一个简单原型:
-- 表达式计算 -- 2015年1月28日 Expresion = Expresion or {} Expresion.__index = Expresion function Expresion.new( cfg ) local t = {} for _, v in ipairs( cfg ) do t[v.var] = v.value end local function replaceExp( str ) local temp = { cfg.result } for k, v in pairs( t ) do local splitT = {} for i, str in ipairs( temp ) do repeat local b, e = string.find( str, k ) if b then table.insert( splitT, string.sub( str, 1, b - 1) ) table.insert( splitT, tostring( v ) ) str = string.sub( str, e + 1, -1 ) else table.insert( splitT, str ) break end until false end temp = splitT end local resultStr = "" for _, v in ipairs( temp ) do resultStr = resultStr .. v end return resultStr end t.result = replaceExp( cfg.result ) setmetatable( t, Expresion ) return t end function Expresion:run( ) local r = loadstring( self.result ) return r() end -- ========================================================== -- 单元测试 config = { { var = "A", value = 100 }, { var = "B", value = 8 }, { var = "C", value = true }, -- result = " c = A ^ ( 1 / 2 ); return c, c + B ", result = [[ if C == true then print( A ) else print( B ) end return true ]] } local exp1 = Expresion.new( config ) print( exp1:run( ) )
运用于游戏的时候 配置可更具需求变更,比如 变量 可以是某个英雄的某个属性值,可以是外部传入的参数。
策划,可以更具需求,想定义一堆变量。然后做一些逻辑,最终返回一个数值,比如 伤害计算之类的。
不好的地方是:字符串替换开销挺大的,不适合在频繁调用的地方用
好处:最大化策划配置的灵活性,可以不通过程序而自己改很多东西
时间: 2024-10-25 02:46:34