「システムの概要」で紹介したように、Stingray エディタ、ランタイム エンジン、およびプロジェクト コンテンツにカスタム プラグインをフックすることができます。プラグインの機能に応じて、次に示す 3 つのコンポーネントのうちの 1 つ、2 つ、またはすべてを統合しなければならないことがあります。
Stingray SDK は、主に次に示す最初の 2 つのセクションを重点的に扱います。つまり、定義済みのプラグイン アーキテクチャを使用して編集ツールとランタイム環境を拡張することについて説明します。ただし、作成される可能性があるさまざまなものを 1 か所にまとめて配置しておくと便利です。
エディタ プラグインは、Stingray エディタに新機能を追加します。通常は、プロジェクトのソース フォルダを構成する未加工のコンテンツを作成し、管理するための機能です。
エディタ プラグインの大半は、一般に HTML や JavaScript で記述されます。プラグインを使用すると、新しいパネルやダイアログを追加できるようになり、エディタで公開されている一連の JavaScript サービス API を介してプロジェクト データや編集環境と相互作用できるようになります。
エディタはエンジンのインスタンスを内部で実行するため、エディタ プラグインも Lua スニペットを使用してエンジン内で機能を実行することができます。
これは、エディタのビューポートの動作をコントロールするのに役立ちます。たとえば、Asset Preview ビューポートにアセットを表示する方法をコントロールしたり、メインの Level Viewport パネルにギズモやデバッグ情報を描画したりできます。
あるいは、プラグインで Lua を使用して、エンジンの Lua スクリプト API が提供する他のサービスやサブシステムを呼び出すこともできます。これは、レベル内でのレイキャストや衝突テスト、オーディオ イベントの再生、ベクトル計算を行う場合に役立つことがあります。
エディタ プラグインを使用すると、JavaScript から、.dll で定義された C 関数を呼び出すこともできます。これは、可能な限り最高のパフォーマンスで実行する必要がある負荷の高い操作を行う場合や、サードパーティ製ライブラリまたはアプリケーションと直接統合する必要がある場合に役立ちます。
プラグインでエディタを拡張する方法の詳細については、「エディタを拡張する」を参照してください。
Stingray エディタ アプリに表示されるパネルおよびビューのほとんどは、自分で記述できるパネルやビューと同様に、プラグインから実際に提供されます。

エンジン プラグインはランタイムの表示および再生エンジンに統合されます。これは、プロジェクト データのロード方法、またはゲームのループ中にランタイムにデータを使用する方法について何らかの変更を加えられるようにするためです。
エンジン プラグインは常に C で記述され、.dll ファイルにコンパイルされます。
これらはエンジン実行中の特定のタイミングに、プラグイン API を介して体系的に呼び出されます。たとえば、プロジェクトを最初にロードするとき、更新ループのフレームごとにデータ コンパイラを開始するとき、ユニットがゲーム内でスポーンされるときなどです。プラグインはこれらのポイントに移動して、次に行われる動作をコントロールすることができます。
エンジン プラグインはエンジンの Lua 環境に新機能を追加することもできるためプロジェクトのゲームプレイ ロジックやエディタ プラグインはエンジン プラグインの C コードを呼び出してその内容を実行することができます。
エンジン プラグインにカスタム フロー ノードの C 実装を含めることもできます。(これらの C 実装は、新しいノードのデータ記述と一緒にプロジェクトに含める必要があります。「カスタム フロー ノードを作成する」を参照してください。)
プラグインでエンジンを拡張する方法の詳細については、「エンジンを拡張する」を参照してください。

Stingray は、これまで実現することはおろか、想像することすらできなかったユニークな新しいエクスペリエンスを想像、設計、作成することを目的とする、クリエイティブなユーザ向けの一連のツールです。したがって、新しいプロジェクト コンテンツを作成するだけの機能と、ツールセットを拡張する機能の境界が非常に曖昧になることがあります。
新しいユニットを単に読み込む場合や、シェーダやレベルなどの新しいアセットをプロジェクト内で作成する場合、ほとんどのユーザはツールを「拡張」することを意識しません。製品を「使用」してコンテンツを作成することだけを意識して、ツールの機能を変更するとは考えません。でも、新しい Lua スクリプトを追加する場合はどうでしょうか。あるいは、新しいカスタム フロー ノードやシェーダ ノードを作成する場合はどうでしょうか。このようなアセットもプロジェクト コンテンツです。これらはプロジェクトのソース フォルダ内にあり、コンパイルされてレベル、ユニット、アニメーションなどと一緒にゲーム エンジンに組み込まれます。ところが、他のコンテンツを作成するためにエディタおよびエンジンを使用する新しい方法を追加することもあります。
コンテンツ プラグインは、あらゆる種類の新しいアセットを、Stingray で開いて作成したすべてのプロジェクトで使用できるようにします。これらの新しいアセットは、core Stingray リソースとまったく同じように処理されます。エディタによって「マウント」され、Asset Browser に表示され、エンジンによってコンパイルされ、ランタイムにプロジェクトで使用できるようになります。
一般に、ユーザが 1 つのプロジェクトで作業している場合は、独自のコンテンツをプラグインとして作成することに悩むことはありません。プロジェクトのソース フォルダ内にコンテンツを作成するだけです。コンテンツ プラグインが必要になるのは、複数のプロジェクト間で一連のアセットを再利用する場合、または一連のアセットで別のエディタまたはエンジン プラグインをサポートする必要がある場合のみです。
次に、Stingray の機能を拡張する際に特に役立つ可能性があるプロジェクト アセットの種類をいくつか示します。
Lua スクリプト内で実装されるカスタム フロー ノード。「カスタム フロー ノードを作成する」を参照してください。
カスタム シェーダ ノード。すべてのシェーダ ノードは、core フォルダの SJSON リソースで定義されます。シェーダのプログラミングに慣れているユーザは、コア ノードをモデルとして使用し、独自のカスタム シェーダ ノードを作成することができます。
レンダー環境設定の拡張機能。プロセス内の特定のポイントに独自のレンダー パスおよびシェーダ コードを挿入して、レンダリング パイプラインをカスタマイズすることができます。これは、完全に文書化するときに使用する高度な機能です。デザインについて検討する場合は、このブログの投稿を参照してください。作業例を参照するには、ボリュームのあるクラウドのプラグインをダウンロードして、.render_config_extension ファイルを調べてください。
カスタム エンティティのコンポーネント。エンティティ システムを拡張するには、データ コンポーネントのカスタム タイプを独自に作成します。詳細については、こちらのページを参照してください。
C DLL を拡張モジュールとして Lua にロードする、または LuaJIT FFI ライブラリを使用する。これはコンテンツ プラグインとエンジン プラグイン間の一種のハイブリッドです。
エンジンが提供する Lua インタフェースを使用して、 HTTP 要求または WebSocket 接続 を介して他のアプリケーションまたは Web サービスと統合する Lua コード。
新しいリソースをプロジェクトに公開するようにプラグインを設定する方法の詳細については、「プロジェクト コンテンツを拡張する」を参照してください。
Asset Browser で Show mapped folders を選択すると、すべてのプラグインでマウントされているすべてのアセット フォルダを表示できるようになります。

この質問に回答するには、Stingray エコシステム全体でプラグインが果たす役割を検討する必要があります。
次に例を示します。
エディタ専用プラグインは、Stingray エンジンでネイティブに処理されるコンテンツ リソースのタイプのみと相互作用します。また、本番フェーズ中にこれらの標準タイプのリソースを使用して、ユーザの作業効率を高めることができます。Stingray エディタに組み込まれているほとんどのプラグインは、これに該当します。
たとえば、Dependency パネルは、プロジェクトで作業するときは、プロジェクト内のリソース間のリレーションシップを追跡するのに役立ちますが、そのジョブを実行するために、ランタイム エンジンに新しい機能を追加する必要はありません。同様に、History パネルでは、エディタの UI 内で行った編集操作に従って、元に戻す操作や、やり直しの操作を行うことができます。ただし、エンジンにおけるプロジェクトの実行方法が影響を受けることはありません。
エンジン専用プラグインはエンジンに新機能をいくつか追加したり、特殊な方法で編集環境にこれらの機能を公開することなく、プロジェクトの実行中にエンジンの動作を変更したりします。
たとえば、Lua 環境に C コードを呼び出す新しい関数をいくつか追加する場合は、エンジン専用プラグインを記述することができます。この操作を行うと、このコードを実行するときのパフォーマンスを最大化したり、サードパーティ製の SDK ライブラリとの相互作用を実現したりできます。この場合、エンジンは新しい関数をプロジェクトの Lua コードから使用できるよう自動設定します。エディタを拡張したり、アセットを追加する必要はありません。
コンテンツ専用プラグインには、必要に応じてプロジェクト内でそのまま使用することができる一連の標準的な Stingray アセットが含まれています。
たとえば、便利なマテリアルやテクスチャ(レンガ、コンクリート、カーペットなど)のライブラリ、Lua スクリプト内で実装される便利なフロー ノードのライブラリ、またはカスタム エンティティ コンポーネントによって設定された動的な時刻システムをコンテンツ プラグインに含めることができます。
エディタおよびエンジン用プラグインでは、新機能の作成およびランタイム サポートを両方行うことができます。
たとえば、エンジンとエディタを両方とも拡張して、新しい種類のデータ リソースをエンドツーエンドで統合しなければならないことがあります。エディタで設定されたパラメータを使用して、手続きに従ってエンジン内でランタイムに生成する必要があるアセットがあるとします。プロジェクトを再生するたびにランダムな個数の枝を作成する必要がある樹木や、ファサードがランダムに生成される建物などが該当します。この場合は、これらのメッシュを手続きに従って作成するときに行われる計算をランタイム コードが実行できるように、エンジンを拡張しなければならない可能性があります。また、ユーザがこれらのタイプのアセットのパラメータを作成、プレビュー、修正する方法をカスタマイズできるように、エディタを拡張しなければならない可能性もあります。
エディタおよびコンテンツ用プラグインでは、他のアセットを作成または設定するためにエンジンで既にサポートされている標準タイプのテンプレート コンテンツを使用することができます。
このようなプラグインには、森や町へのユニットの配置を簡易化するツールなどがあります。エディタ プラグインを使って、森または町で覆われている領域の拡張を定義するためのビューポート内ツールをレベル デザイナーに提供したり、密度や最大の高さなどの値をコントロールするためのパラメータを含む HTML パネルを提供することができます。エディタ プラグインを使えば、これらのパラメータに従って、レベル内に植物や建物を自動的に配置することができます。この場合の最終的な出力は、標準ユニットがすべて含まれている標準レベルになるため、このコンテンツを使用するためにエンジンを変更する必要はありません。
エンジンおよびコンテンツ用プラグインは、編集環境を変更することなく、追加コンテンツでサポートする必要がある新機能をランタイム環境に追加します。
たとえば、C で実装されるカスタム フロー ノードをいくつか追加するとします。この操作を行うには、ノードのデータ記述子を含む新しい .flow_node_definition ファイルをいくつか追加し、プロジェクト コンテンツを拡張するためのプラグインが必要になります。また、これらのノードの C 実装を含む .dll を使用してエンジンを拡張する必要もあります。この場合、新しいノードは既存のフロー編集システムの一部として使用されるため、エディタを拡張する必要はありません。
同様に、プラグインを使って新しいタイプのエンティティ コンポーネントを追加することで、ランタイム プラグインよって何らかの特殊処理を行うためのゲーム エンティティをマークすることができます。ゲーム デザイナーはエディタ内で既存のエンティティ編集ワークフローを使用して、マークを付ける必要があるすべてのエンティティにコンポーネントを適用することができます。ランタイム プラグインは更新ループのフレームごとにワールド内のエンティティに反復処理を行い、新しいコンポーネントが割り当てられたエンティティを検索することができます。
オールインワン プラグインは、Stingray 環境と全面的に統合されています。このプラグインが必要になるのは、プラグインによって高度な新機能を追加することにより、ランタイムの操作性を改善し、Stingray エディタで作業しているレベル デザイナーおよびゲーム作成者の優れた編集環境をバックアップする必要がある場合です。
次に示す 3 つのシステムすべてと統合するプラグインの最適な例は、Navigation プラグインです。
ユーザが現在のレベルの NavMesh を生成するのに役立つパネルを追加してエディタを拡張します。
ヘルパー アセットのライブラリをマウントします。特定の種類のスクリプト データ、カスタム フロー ノード、および Lua スクリプトなどが事前に設定されたユニットが該当します。
Navigation SDK ライブラリ内の関数を呼び出す .dll を使用してエンジンを拡張し、ゲームプレイ コードから Navigation システムと相互作用するための API を使用して Stingray Lua 環境を拡張します。
これらのすべてのプラグイン コンポーネントは連携して、エンドツーエンドのオーサリングおよびランタイム機能を使用できるようにします。