コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】C# のコードをインタープリタ方式で実行できる「UniScript」紹介

はじめに

「UniScript」を Unity プロジェクトに導入することで
C# のコードをインタープリタ方式で実行できるようになります

使用例1

using Slowsharp;
using UnityEngine;

public class Example : MonoBehaviour
{
    private void Start()
    {
        // C# のコードの定義(Foo クラスの定義)
        var runner = CScript.CreateRunner
        (
            @"
public class Foo
{ 
    public int Sum( int x, int y ) => x + y; 
}
"
        );

        // Foo クラスのインスタンスを作成
        var foo = runner.Instantiate( "Foo" );

        // Foo クラスの Sum 関数を呼び出して値を受け取る
        var num = foo.Invoke( "Sum", 1, 2 );

        Debug.Log( num.As<int>() );
    }
}

C# のシンプルなクラスは上記のようなコードで実行できます

使用例2

using Slowsharp;
using UnityEngine;

public class Example : MonoBehaviour
{
    private CScript m_runner;

    private void Start()
    {
        m_runner = CScript.CreateRunner
        (
            @"
public class Foo
{ 
    public int Sum( int x, int y ) => x + y; 
}
"
        );
    }

    private void Update()
    {
        if ( Input.GetKeyDown( ( KeyCode.Space ) ) )
        {
            m_runner.UpdateMethodsOnly
            (
                @"
public class Foo
{ 
    public int Sum( int x, int y ) => x * y; 
}
" );
        }
        
        var foo = m_runner.Instantiate( "Foo" );

        var num = foo.Invoke( "Sum", 1, 2 );

        Debug.Log( num.As<int>() );
    }
}

UpdateMethodsOnly 関数を使用することでホットリロードすることもできます

使用例3

using UnityEngine;

public class Example : UniScriptBehaviour
{
    public Transform m_target;

    private void Awake()
    {
        // Example クラスに DemoScript クラスをバインドして
        // Update 関数が呼び出されるようにする
        Bind
        (
            @"
using UnityEngine;

class DemoScript : Example2
{
    private void Update()
    {
        m_target.position += new Vector3( 0, 0, 1 );
    }
}"
        );
    }
}

MonoBehaviour を継承したクラスをインタープリタ方式で実行することもできます