一、关于游戏里面相关的配置表
游戏里面的任务、物品、装备的各种属性信息都是用xml表的形式先存储起来,策划和测试可以通过直接修改xml表,来对游戏里面相关的环节进行测试,查看效果。
这些表里面的信息要导入到代码中,需要一个导表的程序,在E:\p27\table\start.bat,运行后可以选择要导的表,导入成功后,客户端lua里面的相关Table后缀的文件以及服务端相关xl_.cfg后缀的文件就被更新了,
在git提交代码的时候记得要revert掉这些测试时候修改的表文件。
导表相关的五个文件,以邮件表为例:
1.E:\p27\table\format\email\email.jason00
2.E:\p27\table\template\email\email_client.json
3.E:\p27\table\cfg_map.json
可以查看客户端的lua和服务端的cfg文件是由哪张xml表导出的,一般客户端的XXXtable.lua都是xml文件导出的,而服务端的xml_.cfg都是xml文件导出的,运行导表的那个start.bat会同时导表信息到客户端和服务端。
4.E:\p27\table\邮件表.xml,这是存储源表信息的文件
5.E:\p27\table\start.bat,这是导表时候要运行的程序
二、关于游戏里面导入新资源后相关文件的变化
新资源导入到Unity中后以下四个文件会自动发生变化,在加入新资源提交到git上的时候,记得要把这四个文件revert掉,不然直接pull可能会冲突,然后pull最新的代码,再导入资源,再提交
bind_pos_map.lua
res_name_map.lua
resBundle.txt
resEditor.txt
三、关于服务端的修改
服务器在erl文件在变更后要重新执行build.bat文件编译,然后如果是日志相关的要重启服务器,如果是其他的不需要重启,客户端都要重启。
四、关于Git的操作
要commit提交、push上传或者pull拉取runserver文件夹的变更代码,要先把本地的runserver中的beam中间编译文件revert还原掉,不然会冲突,所谓冲突就是本地的这个文件和服务端的这个文件以及对我这个文件的修改这三者都不一致,或者都有修改,就会在做一些操作的时候冲突,正常情况下,提交的时候本地和服务端的要一致,然后把自己修改的部分提交上去,是正常的迭代上去。拉取的时候,拉取的文件不是自己正在修改的才正常,如果有冲突,就要处理冲突。server的erl文件push到服务端后会在服务端自动编译,所以不需要提交任何beam文件。
每次commit和push前如果发现不是自己修改的文件被修改了要revert掉,再提交和上传,因为每次pull的时候总会出现有些莫名其妙的资源文件显示自己在自己电脑上修改了,但是自己并没有修改,这些文件要revert掉
五、关于Lua客户端代码
1.一些Lua文件,如UIView界面Lua,里面方法都是有关联的,里面的逻辑都是它自己的,就像一个类里面的函数一样,一般不能被单独拿出来用,因为会用到它自己的一些属性,直接引用会导致一些属性的值为nil。
2.一些工具lua,要这样写和调用
第一种定义
function TitleCtrl() local module = {}; function module.on_login1(msg) end function module.on_login2(msg) end return module; end client.title = TitleCtrl();//或者直接赋值为title = TitleCtrl();
第二种定义
title ={};
title.on_login(msg)
end
第一种使用
client.title.on_login(title_info);
第二种使用
title.on_login(msg)
第一种一般是把一些比较紧密的函数写在一起,比如一个页面Lua的里面的函数,start函数等,都写在一个函数里,用第一种方式,第二种是比较分散的功能,有点像C++里面的静态函数
六、客户端获得字符串的字节
Util.StringLength(text);用这个每个汉字是2个字节
#titleTempTextIn用这个Lua自带的运算符得到的每个汉字是3个字节
七、Excel快捷键的使用
alt+w+f冻结excel表,可以冻结表头或者任意一行。
八、关于Lua客户端事件机制
1.事件的绑定
EventManager.bind(this.gameObject,Event.ON_EXP_CHANGE,MainUI.showExp);
2.抛出事件
EventManager.onEvent(Event.ON_EXP_CHANGE);
3.当有事件抛出之后,就会调用绑定的对应的事件函数,这里是MainUI.showExp函数
九、播放特效的接口
promote_root_p_effect:PlayUIEffectForever(this.gameObject, "jinsheng");
第一个参数是要特效播放所在的节点,第二个参数播放的特效的资源名字
十、显示新界面
第一种是显示全屏界面
PanelManager:CreateFullScreenPanel(‘UIPromote‘, UIExtendType.BLACKMASK, function () end, {next_sid_trans=next_sid})
UIExtendType.BLACKMASK为压暗屏幕,这是一个定义好的常量
第二种是显示常规界面
PanelManager:CreateConstPanel(‘UIPromote‘, UIExtendType.BLACKMASK, {next_sid_trans=next_sid})
新界面做好的时候要让策划和美术看一下效果
十一、定时器
DelayTimer(nil,1.0, function() UIUseItem.clickOK(); end);
在1秒之后调用函数clickOK,如果想突然中断这个定时器,可以在执行这个函数里面的语句之前,也就是已经经过了1秒,已经调用这个函数了,在执行函数语句第一句之前判断一下,如果满足停止条件就直接函数返回。
一般会用一个标记来当作返回的条件。
十二、客户端和服务的交互
1.让这个消息和这个函数关联起来
-- 消息处理 SetPort("force_logout_game", SceneManager.ForceLogout);自动传递参数
2.客户端收到服务端发送的force_logout_game就调用客户端的SceneManager.ForceLogout函数
3.客户端的函数
t.ForceLogout = function (msg) end --msg是服务端传递过来的参数
十三、相关代码写在服务端的重要性
比如领取奖励,如果只在客户端处理,那如果我领完奖励然后把游戏关了,再开游戏,如果是已领取奖励的标记是保存在临时变量里这时候就又可以再领取。
如果是存储在本地数据库,也不行,因为没有在服务端记录这个角色已经领取这个奖励,只写在客户端还可能被外挂修改数据,少了服务端的验证,服务端并不知道玩家的这个信息是不是真实的。
十四、服务端
dbdef.cfg,dbdef.erl里面是表的一些信息,对应的目录,名称,和表的各个属性
E:\p27\patch\table\code里面的数据库列表.csv是一些对数据库表的文字声明
template.cfg里面是DB表名配置模板
1.先在代码中找到想查询的表的名字,然后查询在对应的dbdef.erl里面的表名字和表的存储位置
bag_item_bag_table ->E:\p27\patch\run_server\db\p27\bag\item_bag_table\00001
2.在XML文件数据库列表.csv中理解这个表的用途和说明RoleItemBagTable和bag item_bag_table
3.在dbdef.cfg里面是对应表的配置名和存储位置
RoleItemBagTable ->E:\p27\patch\run_server\db\p27\bag\item_bag_table\00001
注:
public_kit_db.erl里面是数据库表的一些像增删改查之类的操作
十五、关于游戏物品的扣除判断
在处理玩家的游戏道具,装备的处理的时候,要格外小心,因为这关系到玩家的财产,如果没处理好,很可能导致一个游戏的衰败,
判断扣除道具是否成功,判断和返回的数据要根据从简单到复杂,从有意义到没意义,比如先判断等级够不够,有没有领取过,背包空间够不够,最后一步才是发奖励,循环比较多的逻辑要放到最后,这样效率高。
十六、关于Lua的or和and
Lua中的or和and,用的结果和C是一样的,不过Lua的or有可能只计算第一个表达式,and也有可能只计算第一个表达式,所以和C的or和and的过程是不一样的
当Lua的or的第一个表达式为true,就直接取这个表达式的值,为false就取第二个表达式的值,不管第二个表达式是true或者false
当Lua的and的第一个表达式为false,就直接取这个表达式的值,为true就取第二个表达式的值,不管第二个是true或者false
Lua的这种处理可以少计算一些逻辑语句,提升了一点运行效率
十七、对xml表格修改后提交时候的注意事项
要先运行这个E:\p27\patch\table\hooks下的hooks.sh,再提交,不然格式会和大家的不一样。
十八、一些erl文件总结
err.erl是定义一些错误信息,等到运行的时候如果出错了,打印输出这个错误,可以知道哪里错了
一般一个模块有这些文件,比如血脉模块
bloodvessel_port.erl和客户端通信的函数方法,就是接受到对应的客户端消息后会调用的对应函数
bloodvessel_port.cfg和客户端通信的配置文件,设置了客户端对应消息和服务端的函数的对应关系
bloodvessel_lib.erl扩展的逻辑代码,里面定义一些函数接口用于第一个文件里面调用
bloodvessel.hrl要用到的相关常量的定义,一般也是在第一个和第三个文件里面引用
xls_bloodvessel.cfg是从表导出的配置信息,和客户端的table的原理是一样的,客户端也有存一样的内容在XXTable.lua里面,在导表之后会自动改变
十九、命令窗口的设置以及环境变量的设置
命令窗口右键设置为快速编辑模式,可以右键直接粘贴从外面复制的内容
设置了环境变量,可以在命令行的任何目录下找到我们输入的这个名字的运行文件,就可以直接在命令窗口输入要执行程序的名字,可以被找到
配置环境变量可以单独创建一个变量,然后用%home%,在Path里去引用它,这样,下次如果改变路径只要改那个创建出来的新变量就好了,而删除就只要删除Path里面的%home%就可以了
二十、关于erlang的逗号,分号,句号
分号是有多种并列的情况下的时候用
逗号是话讲到一半还没讲完,就像C语言里面的分号一样
句号是一句话讲完了
句号前的最后一个分号或者逗号不写,直接空着
erlang的这三个符号的使用和中文的里面这三个符号的意义很像
二十一、关于erlang变量的定义
erlang没有定义变量的关键字,一般新的变量引进会绑定一个初始值,有些变量突然冒出来,一般是函数参数传进来的
执行过程中,如果系统发现有变量没有绑定值就把自己的值绑定给别的变量,就会报错
二十二、关于erlang语法
when关键字相当于C语言里面的if,后面跟逻辑代码