更新日から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が推奨されているようなので何らかの方法でインストールしましょう。公式サイトのリンクを張っておきます。
私は 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 良いね!