elin吧 关注:14,925贴子:108,530
  • 16回复贴,共1

Mod开发指北

只看楼主收藏回复

最近刚开始研究怎么开发mod 不知道有没有朋友发过
管他呢 总之简单分享一下 如果已经有了我就删帖跑路【不是
因为目前还在学习中 所以没办法保证帖子里的东西都是对的
请不要直接回复我的楼层 我可能会贴一些更新啥的 如果有问题请发在后面 感谢
首先首先首先首先!!!!!! 并不推荐完全没有开发经验的朋友自己做mod
当然如果你很喜欢elin愿意学除外 爱是第一生产力
所以我还是尽量用最浅显易懂的方式描述 希望对大家有点帮助
本人维塔士任职4年 给firaxis konami等公司打过工 【战绩不可查x
但是没做过mod而且unity也确实不熟 主要都是UE的东西 CSharp也是要用才边查边用
分享一下做mod的起始准备工作 学习为主 也许之后研究有进展也会继续更新 但说不准
如果有错误请指正 感谢
首先你需要准备的东西
Visual Studio 我用的VS2019 community
VS code 没有也无所谓 本质是高级文本编辑工具 其实用notepad也一样
Everything 一个非常好用的全盘搜索工具 非必须 但是很好用 我上下班有需要都会用这个 助你快速找到你要找的文件
打开你的steam 找到elin 右键管理浏览本地文件 你会进入elin本地安装的目录
然后打开BepInEx\config 用你喜欢的文本编辑器打开BepInEx.cfg
搜索 [Logging.Console] 在下方找到Enable=false 给他改成=true
改完之后你启动游戏时会同时启动一个cmd窗口 之后开发mod输出log的时候可以用这个窗口查看
接下来新建mod项目 选择C# 找到class library(.Net Framework) 然后创建tmd就完事了
创建完项目 打开 然后右边应该会有个Class1.cs 你可以改下名字然后回车
接下来要准备一些游戏库
在你的项目右边 右键references 选择add reference
找到Elin的根目录 也就是从steam打开的目录 选择
Elin_Data\Managed
Assembly-Csharp.dll,
UnityEngine.dll
然后是\Elin\BepInEx\core下的
0Harmony.dll,
BepInEx.Core.dll,
UnityEngine.CoreModule.dll ,
BepInEx.Preloader.Core.dll,
BepInEx.Preloader.Unity.dll,
BepInEx.Unity.dll
把上面这些文件加入依赖项
(我不是完全确定要引入哪些 有可能有遗留 如果有问题可以喊我 我有时间尽量帮忙看看)
加进去的依赖项记得在右下角窗口里 Copy Local改成false
接下来来到代码
保证最上方至少有
using BepInEx;
using UnityEngine;
using HarmonyLib;
然后是mod部分 先贴代码后面解释
[BepInPlugin("missfour.bepinex.plugins.MissFourStackTool", "MissFour Stack Tool", "0.0.0.1")]
public class MissFourStackTool : BaseUnityPlugin
{
void Awake()
{
}
void Start()
{
var harmony = new Harmony("MissFourStackTool");
harmony.PatchAll();
}
void Update()
{
}
void OnDestroy()
{
}
}
[BepInPlugin("missfour.bepinex.plugins.MissFourStackTool", "MissFour Stack Tool", "0.0.0.1")]
上面这行有三个部分 第一个是对于mod来说的唯一值 你可以用类似我这种名字+mod名字的方式来填
第二个是你mod的名字 这个是对用户来说可读的名字 清楚描述mod就行
第三个是版本号 我不确定是否有硬性规定
正好插个小科普
简单来说 软件或者游戏 版本号用点分割 靠左的数字表示大版本 靠右的数字表示小版本 不会进位
比如小版本0.0.9修复一些bug之后会是0.0.10
如果大改游戏性或者推出新功能那可能就是0.1.0甚至1.0.0
扯远了 类似这种填好你的版本号
在Update()函数里 你可以加上下面这段代码来测试
void Update()
{
var key = new BepInEx.Configuration.KeyboardShortcut(KeyCode.F9);
if (key.IsDown())
{
Debug.Log("F9 is pressed");
}
}
完成之后 编译你的项目
上方build->build solution 或者右边右键你的项目 build solution
如果VS下方没有报错 那就说明搞定了
在你项目文件夹里的bin\Debug下找到xxxx.dll xxxx是你项目的名字
复制这个文件然后拷贝到Elin\BepInEx\plugins文件夹下
然后启动elin 进入游戏后 如果一切正常 按下F9你会在cmd窗口看到输出
上述应该是对本地载入mod的方式 关于上传到创意工坊的部分我还在研究


IP属地:上海1楼2024-12-25 04:29回复
    2楼可能会贴点链接啥的 先开出来


    IP属地:上海2楼2024-12-25 04:32
    收起回复
      学习学习,感谢楼主开源🙏


      IP属地:福建来自iPhone客户端3楼2024-12-25 10:28
      回复
        我给隔壁缘开发了几个mod。。。到时候看看这边的 ,反正都是harmony,就是得读读源码了


        IP属地:北京4楼2024-12-25 13:20
        回复
          先cy


          IP属地:河北来自Android客户端5楼2024-12-25 16:01
          回复
            IP属地:四川6楼2024-12-25 16:22
            收起回复
              当初看这个学的BV1ZY4y1q7gj


              IP属地:湖南7楼2024-12-25 18:10
              回复
                把文档和工具链接放上然后就懂得都懂了贴个语义化版本控制规范链接网页链接


                IP属地:河南来自Android客户端8楼2024-12-26 03:49
                回复
                  我先搬点Elin官方文档过来 得挂梯子好像

                  后面五个


                  IP属地:上海9楼2024-12-26 21:02
                  收起回复
                    ■紹介
                    このガイドは臨時の簡易的なガイドです。Modの作り方とSteam Workshopへの登録の仕方を簡単に紹介します。
                    Modの保存場所の変更や、使い勝手の改善などはβ以降に調整を予定しています。とりあえずαのうちにWorkshopを使ってみたい、テストしてみたいという方向けの暫定仕様・情報です。
                    ■Modの作り方と公開方法
                    1.Modフォルダを作る
                    ElinのSteamのPackageフォルダの下に、下のように適当なフォルダ名のフォルダを作ります。

                    2.作成したフォルダにModに必要なファイルを作成する
                    Modに最低限必要なファイルは以下の二つです。既存のModフォルダからコピーするなどして用意してください。
                    package.xml
                    ElinがModを読み込む際に参照する様々な情報が記載されたxmlファイルです。
                    preview.jpg
                    Steamworksに表示されるModのプレビューイメージです。
                    3.package.xmlを編集する
                    package.xmlの内容を全て消し、以下のコードを貼り付け、各項目を書き換えて編集します。
                    <?xml version="1.0" encoding="utf-8"?>
                    <Meta>
                    <title>Custom Map Test(Example Mod)</title>
                    <id>elin_example_mod_custom_map1</id>
                    <author>Lafrontier</author>
                    <loadPriority>100</loadPriority>
                    <description>This is a sample description text for this workshop item.
                    </description>
                    </Meta>
                    各項目の説明は以下の通りです。
                    title
                    Workshop等で表示されるModのタイトルです。好きな名前をつけてください。
                    id
                    ModのIDです。任意の英数字で構いませんが、既に同じIDのModがあると登録できません。また、このIDはModをアップデートする際にも使用されます。他のModのIDと競合しないようなユニークなIDが好ましいです。
                    author
                    Modの作者の名前です。好きな名前を付けてください。
                    loadPriority
                    Modが読み込まれる順番です。今のところは100のままで構いません。
                    description
                    Workshop等で表示されるModの説明文です。Modの内容がわかるような内容にしてください。説明文を含め、幾つかの項目はWorkshopのWebページからも変更ができます。
                    4.Modのコンテンツを入れる
                    これは次の章で説明します。
                    5.Modをアップロードする
                    Modをアップロードするには、ゲーム内のModビューアーから、アップロードしたいModを選択して「公開する」を選択してください。無事にアップロードが完了すると、SteamのWorkshopで閲覧できるようになります。(一度自分のSteamアカウントのWorkshop ItemsからアップロードしたModを表示しないと、Workshopのリストには表示されないかもしれません)
                    アップロードしたModは、SteamのWorkshopのアカウントから情報を編集したり削除することができます。

                    ■Modのコンテンツの作り方
                    BepInExのカスタムスクリプトを使用する場合は、ModフォルダにDLLを放り込むと自動的にゲーム開始時に読み込まれます。
                    また、以下のフォルダ名は特別なフォルダ名となっており、それぞれ説明を書いておきます。
                    /Texture
                    _Elona/Texture以下の画像ファイルの差し替え用のフォルダです。例えばこのフォルダにblocks.pngという画像を入れると、_ELona/Texture/blocks.pngの画像が差し変わります。
                    /Texture Replace
                    単体画像の差し替え用のフォルダです。ゲーム内で作ったグラフィック差し替え画像をこの中に入れると、Modを読み込んだ時に、該当する画像が差し変わります。
                    /Portrait
                    ポートレートの差し替え・追加用のフォルダです。このフォルダに適当な名前のポートレートを入れると、そのポートレートがゲームで使用できるようになります。既に存在するファイル名のポートレートを入れた場合は、画像が差し変わります。
                    /Lang
                    このフォルダの下に言語フォルダ(例: /Mod_Name/Lang/CN)を配置することで、言語Modを作成することができます。言語Modについては、使い勝手が悪かったり、不具合などもあるかもしれませんが、フィードバックを参考に徐々に調整していく予定です。
                    ■Modの質問や要望など
                    ゲーム内バグ報告の「フィードバック」から、もしくはElona DiscordのModチャンネルの方に、質問や要望がありましたらお寄せください。


                    IP属地:上海10楼2024-12-26 21:04
                    回复
                      Unityを使ったシンプルなModの作成ガイド
                      ■紹介
                      このガイドは臨時の簡易的なガイドです。ミニゲームのサンプルプロジェクトを例に、UnityでのModのビルドの仕方を紹介します。ただし、このビルド方法は、あくまで私(noa)がミニゲームを作る際に使っていた方法で、もっと簡単なビルド方法などもあるかもしれません。
                      ■サンプルプロジェクト
                      バスケのミニゲームのサンプルプロジェクトを以下のリンクからダウンロードしてください。
                      Minigame_example.zip
                      解凍したフォルダ(プロジェクト)をUnityで読み込んでください。Unityのバージョンは「2021.3.16f1」です。Unityから「Basket」フォルダの「Basket」というシーンを開くことでゲームがプレイできます。
                      また、説明のために、ビルド完了後のElinのModパッケージもダウンロードしてください。
                      Mod_Basket.zip
                      ■ビルド方法の簡単な説明
                      1. まずはMod用のフォルダを用意します。Modの作り方については「ElinのModとSteam Workshopの簡易ガイド」を参照してください。例では、先ほどダウンロードしたMod_Basket.zipを解凍すると生成されるModフォルダ「Mod_Basket」を使用して説明します。
                      2. ElinのModのスクリプトはDLLにコンパイルする必要があります。これは、UnityのAssembly Definition機能を使うと簡単に変換できます。試しにプロジェクト内のバスケのスクリプトを適当にいじると、「Minigame_example\Library\ScriptAssemblies」フォルダに「Minigame.Basket.dll」が自動的に作成されるはずです。このDLLをMod用フォルダ「Mod_Basket」にコピーしてください。
                      3. スクリプトだけのModなら上記の方法だけで完成です。画像や音などのリソースを付属させる場合は、AssetBundleを使用しPrefab形式でスクリプトごと読み込む必要があります。私はUnityの「Asset Bundle Browser」というパッケージを使ってAssetBundleを作成しています(使い方は後述します)。作成された「Asset_Basket」フォルダをMod用フォルダ「Mod_Basket」にコピーしてください。
                      4. Mod用フォルダをElin本体の「Package」フォルダにコピーすると、ElinでModを動かすことができます。
                      ■AssetBundleの作り方
                      先ほども書きましたが、画像や音などをModに含める一番手っ取り早い方法は、スクリプトごと一つのPrefabに詰め込んでしまう方法だと思います。DLLにコンパイルしたスクリプトやアセットへの参照もPrefab内で全て維持されます。
                      プロジェクト内でAsset Bundle Brwoserのウィンドウを開き、「Basket\Asset」フォルダをConfigurationタブで指定します。
                      次にBuildタブでOutput Pathに「Library/ScriptAssemblies/Asset_Basket」を指定し、Buildボタンを押してください。これでAssetBundleが作成できます。
                      ■バスケModがElinで読み込まれるまでの説明
                      ・Elinを起動するとBepInExにより以下のStart()メソッドが呼ばれ、MiniGame_Basketクラスのインスタンスが登録されます。
                      [BepInPlugin("lafrontier.minigame", "Basket", "1.0.0.0")]
                      public class Mod_Basket : BaseUnityPlugin {
                      private void Start() {
                      var m = new MiniGame_Basket();
                      MiniGame.RegisterMiniGame(m.id, m, Info.Location);
                      }
                      }
                      }
                      ・ゲーム内でバスケサークルにプレイヤーが立つと、上記で登録されたMiniGame_BasketのOnActivateメソッドが呼ばれます。
                      ・OnActivate()内のLoad()により、AssetBundleの「Basket」のPrefabが読み込まれ、バスケのミニゲームが始まります。


                      IP属地:上海11楼2024-12-26 21:05
                      回复
                        簡単なスクリプトModを作ってみる
                        ■紹介
                        このガイドは臨時の簡易的なガイドです。サンプルプロジェクトを例に、Unityを使用した簡単なスクリプトModの作成方法を説明します。
                        ■サンプルプロジェクト
                        まずは下のサンプルプロジェクトをダウンロードしてください。
                        SimpleMod_example.zip
                        解凍したフォルダ(プロジェクト)をUnityで読み込んでください。Unityのバージョンは「2021.3.16f1」です。プロジェクトを開くと幾つかエラーメッセージが表示されますが気にしないでください。
                        ■はじめに
                        ElinはBepInExというフレームワークを使用してModを読み込みます。BepInExはゲームのアセンブリ(コンパイル済みの実行コード)にパッチを行ったり、カスタムMonoBehavioursを通してModをロードする手段を提供します
                        今回のサンプルModでは、このBepInExを使用して、マップに入るごとにネルンがマップの名前を教えてくれるModを作ってみます。
                        ■ビルド方法の簡単な説明
                        1. まずはMod用のフォルダを用意します。Modの作り方については「ElinのModとSteam Workshopの簡易ガイド」を参照してください。サンプルプロジェクトには「Mod_SimpleMod」というModフォルダが既に含まれているので参考にしてください。
                        2. ElinのModのスクリプトはDLLにコンパイルする必要があります。これは、UnityのAssembly Definition機能を使うと簡単に変換できます。試しにプロジェクト内の「NerunTest.cs」を適当にいじると、「SimpleMod_example\Library\ScriptAssemblies」フォルダに「SimpleMod.dll」が自動的に作成されるはずです。このDLLをMod用フォルダ「Mod_SimpleMod」にコピーしてください。
                        3. Mod用フォルダをElin本体の「Package」フォルダにコピーすると、ElinでModを動かすことができます。
                        ■スクリプトの簡単な解説
                        このModで使用されているNerunTest.csを見てみます。
                        using UnityEngine;using BepInEx;using HarmonyLib;
                        必要なライブラリをインポートします。
                        [BepInPlugin("lafrontier.example_plugins", "Script Example", "1.0.0.0")]public class NerunTest : BaseUnityPlugin { private void Start() { var harmony = new Harmony("NerunTest"); harmony.PatchAll(); }}
                        BepInExのBaseUnityPluginを継承したクラスを作り、アトリビュートでModのメタデータを指定します。Elinが起動するとStart()が呼ばれるので、ElinのメソッドをパッチするためにHarmony.PatchAll()を呼びます。
                        [HarmonyPatch(typeof(Zone))][HarmonyPatch(nameof(Zone.Activate))]class ZonePatch { static void Prefix() { Debug.Log("Harmoney Prefix"); } static void Postfix(Zone __instance) { Debug.Log("Harmoney Postfix"); WidgetFeed.Instance?.Nerun(Lang.isJP ? ("ここは" + __instance.Name + "ね!") : ("This is " + __instance.Name + "!")); }}
                        Harmonyの綴りが間違っていますが気にしないでください。
                        Elinでは新しいマップに切り替わる時、内部でZoneクラスのActivate()が呼ばれます。ZonePatchクラスは、このZone.Activate()メソッドにパッチをあてるためのクラスです。
                        [HarmonyPatch(nameof(Zone.Activate))]
                        このアトリビュートでパッチをあてるメソッド(Zone.Activate)を指定します。
                        クラス内のPrefix()はActivate()が実行される前に呼ばれ、PostfixはActivate()が実行された後に呼ばれるメソッドです。PostfixではZoneのインスタンスを受け取ることができます。
                        上記の例では、Postfixメソッド内で、Elinのウィジェット(WidgetFeed)を使い、ネルンにマップの名前を喋らせています。
                        WidgetFeedやLangというクラスはElinの内部クラスです。内部クラスについては、今のところ逆コンパイルなどで調べるしかありませんが、ソースコードの公開も検討しています。


                        IP属地:上海12楼2024-12-26 21:05
                        回复
                          Excelデータをインポートしてキャラやアイテムを追加してみる
                          ■紹介
                          このガイドは臨時の簡易的なガイドです。サンプルプロジェクトを例に、ElinへのExcelデータのインポート方法を紹介します。
                          ■サンプルプロジェクト
                          まずは下のサンプルプロジェクトをダウンロードしてください。
                          Mod_ImportExcel_example.zip
                          解凍したフォルダ(プロジェクト)をUnityで読み込んでください。Unityのバージョンは「2021.3.16f1」です。プロジェクトを開くと幾つかエラーメッセージが表示されますが気にしないでください。
                          Modの基本的なビルドの仕方などは簡単なスクリプトModを作ってみるを参考にしてください。
                          ■スクリプトの簡単な解説
                          このModで使用されているImportTest.csを見てみます。
                          using BepInEx;using System.IO;[BepInPlugin("lafrontier.example_plugins", "ImportTest Example", "1.0.0.0")]public class ImportTest : BaseUnityPlugin { public void OnStartCore() { var dir = Path.GetDirectoryName(Info.Location); var excel = dir + "/SourceCard.xlsx"; var sources = Core.Instance.sources; ModUtil.ImportExcel(excel, "Chara", sources.charas); ModUtil.ImportExcel(excel, "CharaText", sources.charaText); ModUtil.ImportExcel(excel, "Thing", sources.things); }}
                          OnStartCore()は、Elinの起動直後、データの初期化が行われる前にElinから呼ばれるMod専用のメソッドとなっています。
                          ModUtilはElinで今後Mod関連の便利な機能を詰め込んでいく予定のstaticクラスです。
                          public static void ImportExcel(string pathToExcelFile, string sheetName, SourceData source)
                          ModUtilのImportExcel関数を呼ぶことで、外部のexcelファイルを読み込み、読み込んだデータをElinのデータに追加することができます。
                          このスクリプトでは、スクリプトが置いてあるフォルダにある「SourceCard.xlsx」を読み込み、「チキチキチキン」というキャラとその会話データ、また「チキンダガー」というアイテムを追加しています。生成率を高く設定してあるので、ゲーム内ですぐ確認できると思います。


                          IP属地:上海13楼2024-12-26 21:06
                          回复
                            Modの実験など色々
                            ■紹介
                            サンプルプロジェクトを例に、最新のModの機能などを紹介します。
                            ■サンプルプロジェクト
                            まずは下のサンプルプロジェクトをダウンロードしてください。
                            MiscMod.zip
                            解凍したフォルダ(プロジェクト)をUnityで読み込んでください。Unityのバージョンは「2021.3.16f1」です。プロジェクトを開くと幾つかエラーメッセージが表示されますが気にしないでください。
                            Modの基本的なビルドの仕方などは簡単なスクリプトModを作ってみるを参考にしてください。
                            解凍されたフォルダの中の「Mod_Misc」フォルダをElinのPackageフォルダにコピーすると、次のような機能のModがアクティベートされます。
                            ・ゲームでマップが読み込まれる度に、チキンダガーとチキン井戸をプレイヤーのバックパックに生成し、さらにチキチキチキンとチキチキチキン2(デカキャラ)をプレイヤーの周囲に召喚する。
                            ・キャラやアイテムにはカスタム画像を使用し、またチキチキチキンにはカスタムTraitを適用しています。
                            ■スクリプトの簡単な解説
                            今回のModは、先日公開した「Excelデータをインポートしてキャラやアイテムを追加してみる」を拡張しています。Excelからのデータのインポートの仕方についてはこのリンクを参照してください。
                            このModで使用されているMiscExample.csを見てみます。今回は特に新しいことはしておらず、以下のようにカスタムTraitを定義しているだけです。
                            public class TraitTest : TraitChara { public override bool CanBePushed => false;}
                            Mod_Miscフォルダを見てみると、「Texture」フォルダにキャラやアイテムの画像が追加されているのがわかります。
                            付属のSourceCard.xlsxを開いてみてください。「_idRenderData」の列を見るとわかるように、「@chara」などRenderData[1]のIDの前に@を付けると、「Texture」フォルダの中のidと対応した画像が読み込まれます。
                            また、「@obj#well」などのように#の後にThingもしくはCharaのidを指定することで、そのThingもしくはCharaのSourcePref[2]を適用することができます。SourcePrefにwell(井戸)を指定しているチキン井戸をゲーム内で確認すると、井戸と同じ影が使われているのがわかります。
                            [1] RenderDataとは、キャラやアイテムの画像のサイズや、アイテムを設置・手に持った時の位置、インベントリアイコンの大きさなどを記述したデータです。代表的なIDに以下のようなものがあります。
                            chara 128x128ドットのキャラ用のデータで、大半のキャラがこのデータを使用しています
                            chara_L 128x256ドットのキャラ用のデータで、巨人などに使用されています
                            obj_S 32x32ドットのアイテムに一般的に使用されています
                            obj_S EQ 32x32ドットの装備アイテムに一般的に使用されています
                            obj 64x64ドットのアイテムに一般的に使用されています
                            [2] SourcePrefとは、アイテムやキャラごとに設定された影の位置や形状、位置の微調整、アイコンの位置・大きさ、水に浮かぶか、上に乗れるかなどを記述した個別データです。ModではSourcePrefを作成する機能が現在はないため、アイテムなどは基本的に既存のアイテムのSourcePrefを「#」で指定して使用することになると思います。


                            IP属地:上海14楼2024-12-26 21:06
                            回复