Rustで遊ぶためにGDNativeを入れてみたよ(Windows編)

#WindowsでGodot+Rustがやりたいだけの年明けだった

## 今回の環境
Windows 11
Godot 3.4
Rust 1.57
LLVM 11.0.0
GDNative masterブランチ

## そうだ、GodotでRustを書こう

Rustにだいぶ慣れてきた気が気がするのだけどなにか目的がないと手が伸びないなーって思ってたのですが、最近Godotをやっていこうと思っていたこともあって、だったらGDNative入れたらいいじゃない？ってなりました。

検索すればやり方すぐにでてくるじゃろ？そう思ってた時期がわたしにも(ry
あれ？Windowsの記事がほとんどないのでは？(´・ω:;.:... 

わりとUbuntu使いなのですが最近Windowsを使うことが増えてきたっていうか、コタツの上に乗っかってるノートPCがWindowsで冬の間はもうコタツから出られない呪いにかかっているので、環境はWindowsで整えたいわけです。

というわけでWindows上にGodot+Rust+GDNativeの環境をつくりました。
一部補完が効かなかったりしますが、それ以外では補完も効くのでとても快適にRustで遊べてます(\*´ω｀\*)

そんなWindows上に環境を整えたときのメモです。

#Rustは入ってるよね？
この記事を見に来るような人はたぶんRustの環境はあると思うので、ここは読み飛ばして、どうぞ。

## WindowsにRustを入れよう
マイクロソフトの中の人がRustの入れ方書いてくれてるの、しかも日本語。
https://docs.microsoft.com/ja-jp/windows/dev-environment/rust/setup

最終的にはclangが必要なんだけど(GDNativeのビルドで要求される)、普段遣いならMicrosoft C++ Build ToolsだけでもOK。

一応簡単にまとめると、
・Microsoft C++ Build Toolsを入れる
https://visualstudio.microsoft.com/visual-cpp-build-tools/
・Rustを入れる
https://www.rust-lang.org/tools/install
・VSCodeを入れる
MSStoreから入れたらおしまい。あとはRust用のextension(Rust and Friendsで必要なのだいたい全部入る)入れたらおしまい。

#Godotは入ってる？

この記事を見に来るような人はry

## WindowsにGodotを入れよう
オフィシャルからダウンロードしてどうぞ。
https://godotengine.org/download/windows

zipの中に１ファイルしか入ってないけど、この１ファイルで全部入っているこの軽量さがいいですね。Un○tyとかU○とか、起動中にやる気がなくなるというか、あまりの起動時間の長さに起動したくなくなるというか。

仕事だったら起動時間中にお茶飲んでゆっくりできるので、起動時間が長いのはわりと平気なんですけどね'\`,､('∀\`) '`,､

# clangを入れよう
普通にRustを使うぶんにはMicrosoft C++ Build Toolsでいいのですが、GDNativeのビルドを行うときにclang関係のdllを要求されるので入れておく必要があります。

## WindowsにLLVM(clang)を入れよう
LLVM環境一式入っているぽいのでclangも入ってます。
https://releases.llvm.org/download.html

バージョン11以前はdownloadページから、それ以降はGitHub経由でインストーラーを落とせます。
最初GitHubにWindows用のインストーラーがあるのに気がつかなかったので、私はdownloadページにあった11のインストーラーで入れちゃいました。

# GDNativeを使ってみる
ここからが本番です。

dllを作るので、プロジェクトは`cargo init --lib`で作ってください。

後はcargo.tomlをGDNativeを使うように書き換えて、lib.rsをサンプルコードに置き換えるだけで動くものができます。

## GDNativeを使ってdllを作成する

`cargo init --lib`でプロジェクトを作成したら、GDNativeを取り込むようにcargo.tomlを書き換えていきます。

GitHubのReadmeにやり方が書いてます。
https://github.com/godot-rust/godot-rust

今回私はGodot3.4を使ったので、GitHubのものに直接依存させるようにしました。
https://github.com/godot-rust/godot-rust#latest-master-version--godot-34

GDNativeを使うコードは、バージョンによってちょっとずつ書き方が変わってるっぽいので、古い記事のサンプルコードを使うと動かない場合があります。

新規立ち上げ時は、基本はオフィシャルを見るように心がけます。
https://github.com/godot-rust/godot-rust#example

このサンプルコードをcargo buildするとtarget/debugの下に.dllファイルができてます。.soではなくて.dllです。たぶん1MBくらいになってると思います。

この.dllができたら一安心ですね。ここに来るまでに実はちょっとだけ苦労した(´・ω:;.:... 

ここでエラーがでたら、まじ頑張って(´・ω:;.:... 
そして解決したらQiitaで共有しましょう、ぜひ、しましょう。

最後に作った.dllをGodotのプロジェクトディレクトリ下に入れて準備完了です。

## Godotでdllを使う

GitHubのReadmeに、作ったdllをどう取り込むかを書いてあるページへのリンクがあります。
https://hagsteel.com/posts/godot-rust/

基本はInspector下の+押してGDNativeLibrary追加したら、GDNativeLibraryの設定が画面中央下のパネルに現れるのでWindowsの64のところに.dllを登録します。

大事なことなので２回いいます。

**Windowsの64のところに.dllを登録します**

間違ってAndroidの64のところに登録しちゃって、あれ？動かない？って２，３分迷った(´・ω:;.:... 

後は適当に名前を付けて保存しておきます。ドキュメントにも書いてますが、保存時の拡張子がデフォルトで.tresになってますので.gdnlibで保存するようにしましょう。

ドキュメント最後のステップ、スクリプトを付けたいノードでスクリプトの追加ボタンでGDNativeScript(.gdns)を作成してLibraryプロパティに先程保存した.gdnlibを設定します。

これで、動かしたら出力部分に無事文字列が出力されました。

## 補完が欲しい
じゃぁって何か書き加えてみようとしますよね？ プログラムが書かれている_readyとか、あるいはGodot経験者なら_processを作ってみますよね？

※なお_processはこんな感じ。GDScriptと同じくdeltaが引数に入ります。

```rust
    fn _process(&mut self, _owner: &Node, _delta: f64) {
    }
```

で、この中でプログラムを書いても補完が効かないわけです\_(:3」∠)\_

私の環境だけかもしれませんが、同じように補完が効かない場合は関数呼び出しにしてみてください。

次の例はGodot上でGDScriptがついたNodeにぶら下げたCSGBoxを動かす例になります。

```rust
impl HelloWorld {
    fn new(_owner: &Node) -> Self {
        HelloWorld
    }

    #[export]
    fn _ready(&self, _owner: &Node) {
        godot_print!("Hello, world.");
    }
    #[export]
    fn _process(&mut self, _owner: &Node, _delta: f64) {
        test(_owner);
    }
}

fn test(v: &Node){
    if let Some(csg_box) = unsafe{ v.get_node_as::<CSGBox>("CSGBox") } {
        csg_box.translate(Vector3 { x:0.1, y:0., z:0. });
    }
}

```

この例の場合、test関数の中では補完が効くようになりました。

補完が怪しいなってなったらわかりやすい場所に関数を配置したりファイル分けとかしたりして、RustAnalyzerが分析しやすい感じにしてあげるのが良さげかもしれません。


#動いたーヽ(´ー｀)ノ

そして、箱もちゃんと動いたーヽ(´ー｀)ノ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/5698274b-a7a2-4f28-e86a-36f7fe8c0f31.png)

なおここまでめっちゃRustコンパイラに怒られボコボコにされる。

```
　　∧＿∧
　 ((.;.;)ω･)＝つ≡つ　　Rust? ぼこぼこにしてやんよ
　 (っ　≡つ＝つ
　 /　　＃) ﾊﾞﾊﾞﾊﾞﾊﾞ
　( /￣∪ 
```