Plugins.Scripting
Elin/Elin_Data/Managed/Plugins.Scripting.dll
このアセンブリには EScript クラスとそのAPI定義が含まれており、Roslynコンパイラ 5.3.0 を使ってゲーム実行中に C# スクリプトをコンパイル・実行できます。
ランタイムの仕様
- C#言語バージョン:14
- 既定の参照:現在のAppDomain内の全アセンブリ
- 既定の名前空間:
SystemSystem.CollectionsSystem.Collections.GenericSystem.IOSystem.LinqSystem.TextSystem.Text.RegularExpressionsSystem.ReflectionHarmonyLibEModdingEModding.APIEModding.HelperEModding.Helper.RuntimeEModding.Helper.Runtime.ExceptionsUnityEngineUnityEngine.UIReflexCLI.AttributesNewtonsoft.JsonNewtonsoft.Json.Serialization
スクリプトの書き方
C#スクリプトは、完全な構文のコードでも、トップレベルステートメントでもどちらも使えます。以下はすべて有効です:
var i = 100; return i << 5;EClass._map.FindChara("tinymita").MakeAlly()using SomeLib;
public class A(string thingy)
{
public string MakeThingy()
{
return thingy;
}
}
new A("somethingy").MakeThingy()コンソールでの実行
コンソールから直接C#コードを実行できます:
cs.eval <ここにコードを入力>スクリプトはフルパスまたは相対パスで読み込むことも可能です。相対パスの場合はゲーム本体の Elin フォルダか、任意のMOD内の Exec フォルダを参照します。
cs.file D:/MyScript/DoStuff.cs
cs.file exporters/DoStuffAPI
string EScript.EvaluateScript(string script)スクリプトを実行し、整形された結果を返します。このメソッドはスクリプトをキャッシュせず、呼び出すたびに再コンパイルします。
object? EScript.EvaluateAsCsharp(this string script,
object? globals = null,
string useState = null,
bool useCache = true,
bool throwOnError = false)スクリプトを実行し、実際の戻り値を返します。
globals:スクリプト内から直接アクセスできるオブジェクト(publicフィールドのみ)useState:既存のスクリプト状態のID(事前にコンソールコマンドcs.state push <id>で作成)。状態は特殊なグローバルオブジェクトで、Script["key"]インデクサを通じて複数回の実行間でデータを保持できます。未登録のIDを渡した場合は毎回使い捨ての一時状態になり、データは保持されませんuseCache:コンパイル済みスクリプトをキャッシュして再利用(ゲーム再起動で無効化)throwOnError:コンパイルエラー時にEScriptCompilationExceptionを投げる
提出(Submission)
EScriptSubmission はスクリプトを永続化するための専用APIです。初回作成時はコストがかかりますが、同じスクリプトを繰り返し実行する場合は高速で、ゲーム再起動後も保持されます。
提出グループ
EScriptSubmission EScriptSubmission.Create(string submissionKey)バッチは submissionKey によってすべてのスクリプトをグループ化します。例えば Drama シートのスクリプティングでは、各 Drama シートに一意のバッチが割り当てられます。
コンパイル
Func<T, object> EScriptSubmission.Compile<T>(string script)スクリプトをコンパイル(または既存キャッシュから読み込み)し、スクリプト呼び出しデリゲートを返します。既に同じ提出グループ内に存在する場合は再コンパイルせずキャッシュを利用します。
T:グローバルオブジェクトの型
実行
// グローバルオブジェクトの型
public class CustomScriptState : EScriptState {
public int somethingy = 1000;
}
// runnerの作成
var runner = batch.Compile<CustomScriptState>("Debug.Log(somethingy)");
// 実行
runner(new CustomScriptState());API
void EScriptSubmission.Remove(string submissionKey)指定した提出グループを削除します。
string EScriptSubmission.ListAllSubmissions()現在存在するすべての提出グループ一覧を取得します。
IScriptProvider
Roslynコンパイラへのより低レベルなアクセスを提供するインターフェースです。
現在の実装
IScriptProvider EScript.ScriptProvider { get; }現在のプロバイダを取得します。通常はElin Modding Kit内蔵のRoslynコンパイラです。
void EScript.SetProvider(IScriptProvider provider = null)新しいプロバイダを設定します。null を渡すと無効化されます。
API
public delegate object EScriptRunner(object globals);
public interface IScriptProvider
{
bool IsAvailable { get; }
string GetApiVersion();
object EvaluateScript(string script, object globals = null, bool throwOnError = false);
EScriptRunner CompileScript(string script, Type globalsType = null, bool throwOnError = false);
byte[] CompileScriptAssembly(string script, Type globalsType = null, bool throwOnError = false);
byte[] CompileAssembly((string content, string filePath)[] codes, string assemblyName, bool throwOnError = false);
}