初めてのプラグインModを作成する
前回のチュートリアルでは、Playgroundを使用してカスタムノードとカスタムアセットを読み込みました。ただし、これには制限があります。Unityアセットを参照できないため、たとえばカスタムUnityパーティクルプレハブを生成するノードを作りたい場合、Playgroundでは実現できません。
このチュートリアルでは、Warudo SDKを使用して、先ほど作成したHelloWorldNodeとCookieClickerAssetを含むプラグインModをビルドします。プラグインModを使用するとUnityアセットの保存・参照ができるだけでなく、カスタムノードとアセットをほかのユーザーに配布できます。
ステップ1: Warudo SDKプロジェクトを作成する
まだ作成していない場合は、Warudo SDKのインストールガイドに従って新しいWarudo SDKプロジェクトを作成してください。まずWarudo SDKに慣れるため、初めてのModを作成するチュートリアルも実施することをおすすめします。
プラグインModのビルドは、ほかの種類のModのビルドと非常によく似ています!唯一の違いは、以下で説明するように、プラグインModにはPluginを継承するC#スクリプトが必要なことです。
ステップ2: 新しいModを作成する
新しいModを作成するには、メニューバーからWarudo → New Modを選択します。

Mod Nameに「HelloWorldPlugin」と入力し、「Create Mod!」をクリックします。

Assetsフォルダーの下に、Mod用のフォルダーが作成されます。
ステップ3: プラグインスクリプトを作成する
「HelloWorldPlugin」Modフォルダー内で右クリックし、HelloWorldPlugin.csという新しいC#スクリプトを作成します。スクリプトに次のコードを貼り付けます。
using UnityEngine;
using Warudo.Core.Attributes;
using Warudo.Core.Plugins;
[PluginType(
Id = "hakuyatira.helloworld",
Name = "Hello World",
Description = "A simple plugin that says hello to the world.",
Version = "1.0.0",
Author = "Hakuya Tira",
SupportUrl = "https://docs.warudo.app",
AssetTypes = new [] { typeof(CookieClickerAsset) },
NodeTypes = new [] { typeof(HelloWorldNode) })]
public class HelloWorldPlugin : Plugin {
protected override void OnCreate() {
base.OnCreate();
Debug.Log("The Hello World plugin is officially enabled! Hooray!");
}
}
前回のチュートリアルのHelloWorldNode.csファイルとCookieClickerAsset.csファイルを、「HelloWorldPlugin」Modフォルダーにコピーします。
Modフォルダーは次のようになります。

ステップ4: プラグインModをエクスポートする
もう少しで完了です!Modをエクスポートする前に、Warudo → Mod SettingsでModの設定が正しいか確認できます。Modの名前、バージョン、作成者、説明を設定できます。これらは[PluginType]のパラメーターと同じにする必要があります。
デフォルトではMod Export Directoryは空欄で、この場合Modはプロジェクトのルートフォルダーにエクスポートされます。代わりに、WarudoのデータフォルダーにあるPluginsディレクトリ、たとえばC:\Program Files (x86)\Steam\steamapps\common\Warudo\Warudo_Data\StreamingAssets\Pluginsを設定できます。
エクスポートする前にWarudoを閉じ、PlaygroundディレクトリからHelloWorldNode.csとCookieClickerAsset.csを削除してください。これはPlaygroundとプラグインModの競合を防ぐためです。
Warudo → Export Modを選択してプラグインModをエクスポートします。すべて問題なく進めば、コンソールにBUILD SUCCEEDED!メッセージが表示されます。

Modフォルダー内のスクリプトが実際にプラグインModへコンパイルされていることを確認するため、簡単な動作確認を行うとよいでしょう。コンソールを上へスクロールすると、次の行が見つかります。

この行が表示されない場合、UnityプロジェクトがC#スクリプティング用に正しく設定されていない可能性があります。このセクションの手順に従い、プラグインModをもう一度エクスポートしてください。
エクスポートされたHelloWorldPlugin.warudoフォルダーが、Warudoのデータフォルダー内のPluginsディレクトリにあることを確認します。Warudoを開き、AboutダイアログでプラグインModが読み込まれているか確認できます。

もちろん、Cookie ClickerアセットはAdd Assetメニューに、Hello Worldノードはノードパレットに表示されます。


Voilà!Warudoで初めてのプラグインModが完成しました!
ステップ5: Unityアセットを読み込む
プラグインModができたので、カスタムUnityアセットをWarudoに読み込めます!CookieClickerAssetスクリプトでUnityアセットを読み込んでみましょう。
Unity Asset StoreからCartoon FX Remaster Freeをダウンロードします。パッケージをUnityプロジェクトにインポートします。次に、パッケージからパーティクルプレハブを選択し、Ctrlを押しながら「HelloWorldPlugin」フォルダーへドラッグします。この例では「CFXR Explosion 1」プレハブを使用します。

プレハブの名前をParticleに変更します。Modフォルダーは次のようになります。

CookieClickerAsset.csスクリプトを開き、以下の内容に置き換えます。
using System;
using Cysharp.Threading.Tasks;
using UnityEngine;
using Warudo.Core.Attributes;
using Warudo.Core.Scenes;
using Object = UnityEngine.Object;
using Random = UnityEngine.Random;
[AssetType(Id = "82ae6c21-e202-4e0e-9183-318e2e607672", Title = "Cookie Clicker")]
public class CookieClickerAsset : Asset {
[Markdown]
public string Status = "You don't have any cookies.";
[DataInput]
[IntegerSlider(1, 10)]
[Description("Increase me to get more cookies each time!")]
public int Multiplier = 1;
private int count;
private GameObject particlePrefab; // New field to store the particle prefab
[Trigger]
public async void GimmeCookie() { // Note the async keyword
count += Multiplier;
SetDataInput(nameof(Status), "You have " + count + " cookie(s).", broadcast: true);
// Spawn the particle prefab Multiplier times
for (var i = 0; i < Multiplier; i++) {
var particle = Object.Instantiate(particlePrefab, Random.insideUnitSphere * 2f, Quaternion.identity);
particle.SetActive(true);
Object.Destroy(particle, 3f); // Automatically destroy the cloned particle after 3 seconds
await UniTask.Delay(TimeSpan.FromSeconds(0.2f)); // Delay 0.2 seconds before spawning the next particle
}
}
protected override void OnCreate() {
base.OnCreate();
SetActive(true);
// Load the particle prefab from the mod folder. Change this path if your prefab is in a different folder
particlePrefab = Plugin.ModHost.Assets.Instantiate<GameObject>("Assets/HelloWorldPlugin/Particle.prefab");
// Disable it so that it doesn't show up in the scene
particlePrefab.SetActive(false);
}
}
Modをもう一度エクスポートします。Warudoはプラグインのホットリロードに対応しているため、ModをPluginsフォルダーにエクスポートするだけで、Warudo上ですぐに変更を確認できます!
Cookie Clickerアセットの「Gimme Cookie」ボタンを押すと、シーン内にパーティクルプレハブが生成されます。

Warudo Proユーザーは、パーティクルエフェクトを表示する ために組み込みレンダリングパイプラインへ切り替えてください。代わりにURP対応のパーティクルアセットを使用することもできます。
Warudoでこんなことまでできるなんて、すごいと思いませんか?
Playgroundとの比較
プラグインModの作成はPlaygroundの使用より強力ですが、欠点もあります。
- 変更するたびにModをエクスポートする必要があるため、プラグインModの開発はかなり遅くなる場合があります。
- 現在、PlaygroundではMessagePack、WebSocketSharpなど、Warudoが使用するより多くのライブラリにアクセスできます(プラグインModについては改善を進めています)。
- プラグインModにはより多くのセキュリティ上の制限があります。たとえば、
System.IO名前空間にはアクセスできません(ただし、サンドボックス化されたファイル永続化APIを提供しています)。
プラグインModとPlaygroundのどちらを使用するかは、ユースケースによって決まります。新機能のプロトタイプ作成や新しいアイデアのテストを行う場合、特にUnityアセットを参照する必要がなければ、Playgroundはすばやく反復し結果を確認できる優れたツールです。VTuber向けのカスタム開発を行う場合、Playgroundはクライアント向けの小規模で自己完結した機能を実装するのに最適です。一方、カ スタムUnityアセットを読み込む必要がある場合や、Steam Workshopでカスタムノードやアセットを配布する場合は、プラグインModを使用してください。(プラグインModへ移行する前に、Playgroundでカスタムノードとアセットのプロトタイプを作成することもできます!)