ChroMapper プラグイン作成ガイドの日本語訳 - rynan4818/ChroMapper-CameraMovement GitHub Wiki

オリジナル

プラグイン作成ガイド

ChroMapper には基本的なプラグインローダーが含まれており、ディレクトリのルートにある Plugins フォルダからプラグインをロードすることができます。

プラグインは、エディターの機能追加、プログラムのカスタマイズ、ルック&フィールの編集、あるいはChroMapperの別のフォークにすることが適切ではないようなコードを開発するために使用することができます。

プラグインプロジェクトのセットアップ方法

  • Visual Studioで、.NET Frameworkを対象としたクラスライブラリを新規に作成します。.NET Standardと.NET Coreは未検証ですので、ご自身の責任でご利用ください。
  • ChroMapper のコアファイルである Main.dll への参照を追加します。これは、ChroMapper_Data/Managedフォルダに格納されています。
  • その他、必要な ChroMapper や Unity のライブラリへの参照を追加します。これらは ChroMapper_Data/Managed フォルダにあります:
    • UnityEngine.CoreModule.dll - Unityのコアとなる部分です。Unityエンジンにアクセスする必要がある場合に参照します。
    • UnityEngine.UI.dll - UnityのUIシステムです。カスタムUIを作成する場合はこちらを参考にしてください。
    • Unity.TextMeshPro.dll - ChroMapperが使用するテキストシステムです。
    • Unity.InputSystem.dll - ChroMapperで多用される新入力システム。
    • UnityEngine.InputLegacyModule.dll - もう少しシンプルに使える「旧入力システム」。
    • FileBrowser.dll - ChroMapperが使用するクロスプラットフォームのFile Browserシステム。
    • Intersections.dll - ChroMapper's 製作、高速レイキャスティングシステム。
    • Plugins.dll - ChroMapper の JSON ライブラリが含まれています。
  • ChroMapper が読み込む、以下の例のようなクラスを作成します。
  • プロジェクトをビルドし、ビルドした .dll ファイルを Plugins フォルダに配置します。
[Plugin("Plugin Name")]
public class Plugin
{
    [Init]
    private void Init()
    {
        Debug.Log("Plugin has loaded!");
    }
		
    [Exit]
    private void Exit()
    {
        Debug.Log("Application has closed!");
    }
}

今のところプラグインのインターフェースは非常に素っ気ないものですが、将来的には拡張されるかもしれません。

ExtensionButtons(拡張ボタン)

エディタの右側ポップアウトパネルに表示する、独自のボタンを登録することができます。これは、プラグインの Init 関数か、エディタシーンが始まる前に行う必要があります。

ボタンを登録するには、次のように呼び出します。

ExtensionButton button = ExtensionButtons.AddButton(iconSprite, "This is the tooltip", OnButtonClick);

AddButton は ExtensionButton を返します。これは、登録した後にボタンのプロパティを変更したい場合に使用します。

Requirement Checks

ChroMapper 0.7.386で、譜面の_requirements_suggestionsを設定するための新しいモジュールシステムが追加されました。この新しいシステムにより、外部プラグインは、譜面が特定のMODや機能を提案したり、要求したりするための独自のRequirementチェックを登録することができるようになりました。

※要するに、譜面のinfo.dat_difficultyBeatmaps : [{"_customData" : {"_requirements" : []},{"_suggestions" : []}}]を設定するための機能

現在、ChroMapperには、以下のMODのための6つの要件チェックが組み込まれています:

  • Chroma 2.0
  • Chroma 1.0
  • Noodle Extensions
  • Mapping Extensions
  • Cinema
  • Sound Extensions

Custom Requirement Checks

独自のRequirementチェックを作成するには、ChroMapperの抽象クラスであるRequirementCheckを継承したC#のクラスファイルを新規に作成し、必要なものを実装してください。

public class MyCustomModCheck : RequirementCheck
{
    public override string Name => "Mod or Feature Name";

    public override RequirementType IsRequiredOrSuggested(BeatSaberSong.DifficultyBeatmap mapInfo, BeatSaberMap map)
    {
        return RequirementType.None;
    }
}

ChroMapper にRequirementチェックを登録するには、静的メソッド RequirementCheck.RegisterRequirement を呼び出し、そのインスタンスを独自のRequirementチェックに渡します。

[Plugin("My Plugin")]
public class MyPlugin
{
    [Init]
    private void Init()
    {
        RequirementCheck.RegisterRequirement(new MyCustomModCheck());
    }
}

Name

この Name プロパティは、譜面のinfo.dat_requirements または _suggestions 配列の内部に格納されるものです。ChroMapper で検出する必要のある Mod の名前と一致することを確認してください。

IsRequiredOrSuggested(必須または推奨)

このメソッドは、マップと難易度情報を処理し、要件や提案を追加すべきかどうかを判断する。これは3つの値を持つ列挙型であるRequirementTypeを返します:

  • RequirementType.Requirement: これが返された場合、ChroMapperはNameプロパティをその難易度の必須の要件として追加します。
  • RequirementType.Suggestion: これが返された場合、ChroMapperは、難易度の推奨の提案として、Nameプロパティを追加します。
  • RequirementType.None: これが返された場合、ChroMapperは何も行いません。これは、ほとんどの場合、デフォルト値として設定する必要があります。

法的事項

あるユーザはこう思うかもしれません: GPLv2についてはどうでしょうか? これらのプラグインはGPLv2で配布、リリースされることを余儀なくされるのではないでしょうか?

GPLv2ライセンスを注意深く検討した結果、これらのプラグインはこの条項に該当すると判断しました。:

もしその作品の特定できる部分が『プログラム』から派生したものではなく、それ自体が独立した別個の作品であると合理的に考えられるならば、あなたがそれらを別個の作品として頒布するとき、この契約書とその条件はそれらの部分には適用されない。

原則として: GPLv2 の悪名高い「感染」効果は、ChroMapper 用に作成したプラグインには適用されません。

もう少し詳しく言うと: 私はChroMapperのプラグインを派生したものとは考えず、独立した別の作品と考えます。そのため、GPLv2には、ソースコードと改変を同一のライセンスで利用可能にすることについて述べている第2条と第3条が適用されません。