メインコンテンツにスキップ

Plugins.Scripting

Elin/Elin_Data/Managed/Plugins.Scripting.dll

このアセンブリには EScript クラスとそのAPI定義が含まれており、Roslynコンパイラ 5.3.0 を使ってゲーム実行中に C# スクリプトをコンパイル・実行できます。

ランタイムの仕様

  • C#言語バージョン:14
  • 既定の参照:現在のAppDomain内の全アセンブリ
  • 既定の名前空間:
    • System
    • System.Collections
    • System.Collections.Generic
    • System.IO
    • System.Linq
    • System.Text
    • System.Text.RegularExpressions
    • System.Reflection
    • HarmonyLib
    • EModding
    • EModding.API
    • EModding.Helper
    • EModding.Helper.Runtime
    • EModding.Helper.Runtime.Exceptions
    • UnityEngine
    • UnityEngine.UI
    • ReflexCLI.Attributes
    • Newtonsoft.Json
    • Newtonsoft.Json.Serialization

スクリプトの書き方

C#スクリプトは、完全な構文のコードでも、トップレベルステートメントでもどちらも使えます。以下はすべて有効です:

cs
var i = 100; return i << 5;
cs
EClass._map.FindChara("tinymita").MakeAlly()
cs
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/DoStuff

API

cs
string EScript.EvaluateScript(string script)

スクリプトを実行し、整形された結果を返します。このメソッドはスクリプトをキャッシュせず、呼び出すたびに再コンパイルします。

cs
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です。初回作成時はコストがかかりますが、同じスクリプトを繰り返し実行する場合は高速で、ゲーム再起動後も保持されます。

提出グループ

cs
EScriptSubmission EScriptSubmission.Create(string submissionKey)

バッチは submissionKey によってすべてのスクリプトをグループ化します。例えば Drama シートのスクリプティングでは、各 Drama シートに一意のバッチが割り当てられます。

コンパイル

cs
Func<T, object> EScriptSubmission.Compile<T>(string script)

スクリプトをコンパイル(または既存キャッシュから読み込み)し、スクリプト呼び出しデリゲートを返します。既に同じ提出グループ内に存在する場合は再コンパイルせずキャッシュを利用します。

  • T:グローバルオブジェクトの型

実行

cs
// グローバルオブジェクトの型
public class CustomScriptState : EScriptState {
    public int somethingy = 1000;
}
// runnerの作成
var runner = batch.Compile<CustomScriptState>("Debug.Log(somethingy)");
// 実行
runner(new CustomScriptState());

API

cs
void EScriptSubmission.Remove(string submissionKey)

指定した提出グループを削除します。

cs
string EScriptSubmission.ListAllSubmissions()

現在存在するすべての提出グループ一覧を取得します。

IScriptProvider

Roslynコンパイラへのより低レベルなアクセスを提供するインターフェースです。

現在の実装

cs
IScriptProvider EScript.ScriptProvider { get; }

現在のプロバイダを取得します。通常はElin Modding Kit内蔵のRoslynコンパイラです。

cs
void EScript.SetProvider(IScriptProvider provider = null)

新しいプロバイダを設定します。null を渡すと無効化されます。

API

cs
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);
}

This project is an unofficial documentation site and is not affiliated with, endorsed by, or associated with Elin or Lafrontier / Noa. All trademarks are the property of their respective owners.