RustでUnityのNativePluginを書く

更新日から1年以上経過しています。情報が古い可能性がございます。

最近Unityを使っているはずなのにC/C++を書いていて、そろそろ別な言語に置き換えられないかと考えていたところ、RustでDllが作れるという情報を耳にしたので早速UnityのPluginをRustで作ってみました。

実行環境

いつものあれです。実行環境が分からないと再現できなかったりするので。

  • Windows 10 Pro 20H2
  • Unity 2019.4.19f1
  • rustup 1.23.1 (rustc 1.49.0, cargo 1.49.0)

Rustの準備

rustupが推奨されているようなので何らかの方法でインストールしましょう。公式サイトのリンクを張っておきます。

https://www.rust-lang.org/

私は scoop.sh を入れているので、scoop 経由でインストールしました。

プロジェクトの作成

適当な場所に shell で移動してプロジェクトを作成します。AddTest とでも名前を付けておきましょう。

cargo new AddTest

作成されたプロジェクトに入ってコードを書いていきます。
作成されたプロジェクトには、Cargo.toml と src/main.rs があればOKです。

DLLの作成

Cargo.toml に以下の記述を追加します。

[lib]
name = "addtest"
crate-type = ["dylib"]

この記述があると、src/lib.rs をビルドしようとするので src/lib.rs を作成します。

#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

これで準備は完了です。shell からビルドしましょう。

cargo build --release

target ディレクトリが作成され、target/release/addtest.dll があるはずです。

Unityで使ってみる

適当な Unity プロジェクトを作成し、Plugins ディレクトリに先ほど作成した addtest.dll を入れます。入れたらそのdllを使うC#のコードを書きましょう。

using System.Runtime.InteropServices;
using UnityEngine;

public class AddTest : MonoBehaviour
{
    [DllImport("addtest", CallingConvention = CallingConvention.Cdecl)]
    private static extern int add(int a, int b);

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(add(3, 4));
    }

}

書いたらカメラにでも貼り付けて動かしてみます。

7
UnityEngine.Debug:Log(Object)
AddTest:Start() (at Assets/Scripts/AddTest.cs:14)

ばっちり出力されました!

最後に

いやー、rust で NativePlugin が書けるなら、もう C/C++ にこだわる必要もないので、今後は少しずつ rust に乗り換えていこうと思います。rust 良いね!

コメントする

メールアドレスが公開されることはありません。