饥荒游戏吧 关注:204,219贴子:2,999,751

17-03-03【MOD制作】mod制作整体思想和系统

只看楼主收藏回复

还记得我几天前在这吧发的那个投票贴么。。


1楼2017-03-03 20:17回复
    二楼备用


    2楼2017-03-03 20:18
    收起回复
      一个mod文件的结构树状图绿色表示图片,蓝色表示代码。灰色表示最高层文件


      3楼2017-03-03 20:18
      回复
        一个可执行的mod必须要有的是灰色部分。
        modmain和modinfo想必大家非常熟悉。
        蓝色部分均为lua文件(lua文件不只有蓝色部分)
        prefabs中的文件都需要在modmain中注册才能发挥作用。
        而scripts里面的其他代码均不需要modmain中特别注明就可以使用
        绿色部分可分为动画部分和贴图部分
        动画部分:anim文件+exported文件。exported文件夹里面的动画会在下载了don't starve mod tools的steam版饥荒运行时自动转化为anim文件,但可能会因为各种各样的原因转化失败。下述。
        贴图部分:只需要在里面放入png原图。系统会自动转化成tex+xml文件。但png文件的长宽需要是2的倍数


        4楼2017-03-03 20:19
        回复
          name = "Cuckoo Birds"
          description = "~~~"
          author = "XWJ249"
          version = "1.0.0"
          forumthread = ""
          api_version = 6
          dont_starve_compatible = true
          reign_of_giants_compatible = true
          dst_compatible = false
          shipwrecked_compatible = true
          icon_atlas = "modicon.xml"
          icon = "modicon.tex"
          configuration_options =
          {
          {
          name = "Meatmaker",
          label = "Meatmaker",
          hover = "reborn",
          options = {
          { description = "open", data = true },
          { description = "close", data = false },
          },
          default = 0,
          },
          }
          这里以我的一个未发布的mod的modinfo为例子。
          name,description,author,version
          这些一眼可以看懂的我就不多说了。注意一下version在每次上传到创意工坊时需要有一定的改动。
          forumthread是指论坛中的地址。可有可无,但要注意的是就算你不填写,你也必须要留空(留一个"")
          否则mod无法启用。
          api_version指的是你的mod文件的lua语言版本。如果低于饥荒游戏的lua版本会在mod界面提示过期。
          联机版填10,单机版填6最好。另外api_version_dst是联机版的lua语言版本。使用联机版且没有这个时系统使用api_version未lua语言版本
          dont_starve_compatible
          reign_of_giants_compatible
          dst_compatible
          shipwrecked_compatible
          这些指的是是否兼容原版,ROG,联机,SW。需要注意的是如果你没有写SW或DST的兼容,他会默认为不兼容。
          而原版和ROG他默认的是未知。如果你填写的是不兼容,那么在进入对应DLC的时候,这个mod不会启用。
          icon_atlas,icon是mod的图标。你需要在MOD文件夹里放置对应文件。我的建议是:直接丢一个叫modicon的png图片,自己让他转化。png文件应当是32*32像素。如果没有对应文件,系统会塞一个默认图片。
          划重点↓
          configuration_options是配置信息,也就是mod界面给你调的。其中
          每一个配置信息应当是一个表。
          name是代码中的名字,而不是显示的名字
          label显示的名字
          hover介绍,也就是鼠标移到上面显示的字。
          options总共的选项。其中
          description是选择时提示的信息。data是选完之后这个选项对应的值
          default是这个选项默认的值。options中应当有一个选项的data与这个值相符合
          这里的配置可以在modmain中使用GetModConfigData(上面的name)来获取。获取的值也就是选择的data对应的值
          priority优先级,我的代码中没有出现。代表的是不同mod的同名文件出现时覆盖的优先级。如果你的mod里面有文件名比较大众化,建议调一下优先级。(关于优先级高的覆盖还是低的覆盖,我这边暂未测试)


          5楼2017-03-03 20:19
          回复
            modmain
            这个modmain用处大了。当进入游戏时,modmain的文件就会被执行。
            这里只写出一些modmain专用的,系统专门检查的代码。
            Assets = {}加载的资源表。里面加载的每一个资源应当用
            Asset("资源类型", "具体路径"),为格式加载
            PrefabFiles = {}所有prefabs里出现的文件都应当在这里注册,否则无效。
            API系列
            例如AddPrefabPostInit。给游戏中原有的文件添加代码。
            这些函数的列表以及用法在modutil里。
            modimport("路径")把对应路径的文件加载为modmain的一部分。
            好处是便于管理,分类明确。
            以及上述的GetModConfigData函数。


            6楼2017-03-03 20:19
            回复
              prefabs中的文件
              在这个文件夹里面的代码,不管游戏里怎么样,基本性质都是一样的。
              也就是返回一个prefab函数。
              Prefab = Class( function(self, name, fn, assets, deps)
              self.name = name or ""
              self.path = name or nil
              self.name = string.sub(name, string.find(name, "[^/]*$"))
              self.desc = ""
              self.fn = fn
              self.assets = assets or {}
              self.deps = deps or {}
              end)
              Prefab函数的源码是这样的。大家看得懂就看吧。
              name:去掉/前面所有,最后没有被去掉的就是物品最后的name。
              fn:每次这个物品被刷出来或者重进游戏时,都会执行一次fn。
              assets:与modmain中的assets大同小异。
              回到prefabs里的文件的代码中,
              大家可以看到,assets总是在代码的最前头。我这里解释一下,lua系统是从上到下读取代码,assets定义的是一个表。如果你下面使用了assets,而上面还没有定义assets,系统就会检查到nil值,就会报错。
              fn里,可以看到local inst = CreateEntity()总是摆在最前头。这个代码创建了实体,也就是创建了这个物品。没有这个,下面的代码都是白搭(事实上,下面的代码或多或少都与inst有关,没有定义inst,下面马上就给你报错)
              然后inst的函数都在entityscripts里面有。这里不多说了。
              这里讲一下inst的几个东西。
              inst.entity:AddTransform()
              inst.entity:AddAnimState()
              大家可能很常见这两行代码,或者与这两行代码类似的东西。但是又在上面的entityscripts里找不到。
              事实上,这些东西是构成一个实体的基础。比如animstate,是实体的动画贴图。没有这个,你看都看不见他。
              transform,是这个物体在游戏里的坐标相关。


              7楼2017-03-03 20:19
              回复


                IP属地:广东来自Android客户端10楼2017-03-03 20:47
                收起回复
                  不懂帮顶


                  IP属地:安徽来自iPhone客户端11楼2017-03-03 21:14
                  收起回复
                    太难了如果懂代码和绘图的话我早就做自己喜欢的mod了


                    IP属地:重庆来自Android客户端12楼2017-03-03 23:03
                    收起回复
                      好好看好好学


                      IP属地:江西来自iPhone客户端14楼2017-03-04 13:53
                      回复
                        原来如此


                        来自iPhone客户端15楼2017-03-04 14:56
                        回复
                          反正我又不会


                          来自iPhone客户端16楼2017-03-04 14:56
                          回复
                            mod制作教程
                            从入门到放弃
                            一个字都看不懂的我还是去画画吧


                            来自Android客户端17楼2017-03-04 16:00
                            收起回复
                              MARK


                              IP属地:辽宁18楼2017-03-04 21:34
                              收起回复