ClojureCLRのマクロをつかって、Visual Scriptingのかわりに、自分が理解しやすい言語を作って、プログラミングできるのでは?と思ったので、何も知らないけど、どうなるのかやってみる。この記事は、そのメモ。
結論:以下の記事は、C#からclojureをよびだそうとしてみた(文字通りの無謀な試み)がうまくいかなかった。が、以下のリポジトリでUnityとClojureの統合が試みられていることが分かった。
https://github.com/arcadia-unity/Arcadia
で、インストール方法の動画があった。OSX用の説明だったが、windows11で、現在もつかえるか検証する記事を別途作成しようと思った。
Windows 11環境での最新の.NET向けのインストール手順です:
1. dotnet toolとしてインストールする方法(推奨):
ダウンロードするDLLの対応バージョンを調べるために、Unityで使っている.NETのバージョンを知る必要がある。
// DebugCheckScript.cs として保存 using UnityEngine; public class DebugCheckScript : MonoBehaviour { void Start() { Debug.Log($"Unity's .NET Version: {System.Environment.Version}"); } }
これで現在のUnityプロジェクトで使用されている.NETのバージョンを確認できます。
自分はUnity2022でしたが、.NETは、4系でした。
https://sourceforge.net/projects/clojureclr/files/
.NETが4系だったので、上記から。最新版だと、
clojure-clr-1.12.0-alpha11-Release-net4.6.2.zip
をダウンロードすればいいし、
安定板であれば、
clojure-clr-1.11.0-Release-net4.6.2.zip
をダウンロードする
以下は、現在インストールされている.NETのバージョンを考慮しないでインストールするやり方で、UnityにDLLをコピーしようとするとエラーになったやり方だ。以下はそうなるとは知らずに、書いた文章である。
powershellで以下を実行
# グローバルにClojure.Mainをインストール dotnet tool install --global Clojure.Main
2. インストール後、REPLの起動: powershellで以下を実行.
Clojure.Main
(System.Environment/Exit 0)
または
(Environment/Exit 0)
または
Ctrl + c
;; 基本的な計算 (+ 1 2 3) ;; 文字列出力 (println "Hello, ClojureCLR!") ;; 簡単な関数定義 (defn greet [name] (str "Hello, " name "!")) ;; 関数の実行 (greet "Unity")
10年以上前の記事か。。。 https://qiita.com/koji_yusa/items/9ca0f17677e8403cfb43
7つのパッケージしかなかったようですが、2025年2月時点では25のパッケージが出ていますので、AIにまとめさせました。
パッケージ名 | 説明 (NuGet? からの抜粋) | NuGet? リンク |
--- | --- | --- |
ClojureCLR | .NET Framework 上で動作する Clojure | [NuGet?](https://www.nuget.org/packages/ClojureCLR) |
ClojureCLR.Build | ClojureCLR の実行ファイルをダウンロードしてプロジェクトに追加するビルドタスクを追加します。 | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Build) |
clojure.clr.interop | Clojure.CLR の相互運用ユーティリティ | [NuGet?](https://www.nuget.org/packages/clojure.clr.interop) |
ClojureCLR.Lib | ClojureCLR.Lib | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Lib) |
ClojureCLR.Source | ClojureCLR のソースコード | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Source) |
Clojure.CLR.FSharp | Clojure CLR のための F# 相互運用機能を提供します。 | [NuGet?](https://www.nuget.org/packages/Clojure.CLR.FSharp) |
Clojure.CLR.NUnit | Clojure.CLR NUnit ユーティリティ | [NuGet?](https://www.nuget.org/packages/Clojure.CLR.NUnit) |
Clojure.CLR.Tests | Clojure.CLR テストユーティリティ | [NuGet?](https://www.nuget.org/packages/Clojure.CLR.Tests) |
Clojure.CLR.Tools | Clojure.CLR ツール | [NuGet?](https://www.nuget.org/packages/Clojure.CLR.Tools) |
Unclr | ClojureCLR のためのユーティリティライブラリ | [NuGet?](https://www.nuget.org/packages/Unclr) |
ClojureCLR.Depot | ClojureCLR モジュールのリポジトリ | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Depot) |
clojure-clr.sdk | .NET 用の clojure.clr.sdk ツールとライブラリが含まれています | [NuGet?](https://www.nuget.org/packages/clojure-clr.sdk) |
ClojureCLR.Topshelf | Topshelf を使用して ClojureCLR コードを Windows サービスとして実行するためのシンプルなラッパー。 | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Topshelf) |
ClojureCLR.ConsoleTest? | ClojureCLR.ConsoleTest? | [NuGet?](https://www.nuget.org/packages/ClojureCLR.ConsoleTest) |
ClojureCLR.WPF | ClojureCLR.WPF | [NuGet?](https://www.nuget.org/packages/ClojureCLR.WPF) |
Clojure.CLR.TypeProvider? | Clojure CLR のための型プロバイダー | [NuGet?](https://www.nuget.org/packages/Clojure.CLR.TypeProvider) |
ClojureCLR.Reactive | ClojureCLR 用の Reactive Extensions | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Reactive) |
clojure-clr-contrib | Clojure CLR 用のコミュニティが提供するライブラリ | [NuGet?](https://www.nuget.org/packages/clojure-clr-contrib) |
ClojureCLR.Extras | ClojureCLR のためのユーティリティ関数のコレクション | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Extras) |
ClojureCLR.Logging | ClojureCLR 用のロギングの抽象化と実装 | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Logging) |
ClojureCLR.Dynamic | ClojureCLR 用の動的相互運用機能 | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Dynamic) |
ClojureCLR.Schema | ClojureCLR 用のスキーマ検証および生成 | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Schema) |
ClojureCLR.Spec | ClojureCLR 用の Spec ライブラリ | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Spec) |
ClojureCLR.Async | ClojureCLR 用の非同期プログラミング構造 | [NuGet?](https://www.nuget.org/packages/ClojureCLR.Async) |
clojure.clr.test-adapter | Clojure CLR 用のテストアダプター | [NuGet?](https://www.nuget.org/packages/clojure.clr.test-adapter) |
だから何?
Assets/ Plugins/ ClojureCLR/
Assets/Plugins/ClojureCLR/ - Clojure.dll - Microsoft.Dynamic.dll - Microsoft.Scripting.dll
power shellでDLLを探すコマンド
Get-ChildItem -Path $env:USERPROFILE\.dotnet -Recurse -Filter "Clojure.dll"
利用する環境に応じてdllがあることがわかる。自分の場合は同名のDLLが3つでてきた。
後でわかったことだが、ここで出てくるバージョン名と、インストールしてある.NETのバージョンがあっていないと、Unloading broken assembly なんとか、エラーがでて、DLL消して、ちゃんとしたDLLを探してダウンロードしなくてはいけないということが分かった。
上記でバージョンがわかる(今回はnet6.0)ので、それに合わせてさらにその中のDLLの確認するコマンドを実行してみる
Get-ChildItem -Path "C:\Users\kh\.dotnet\tools\.store\clojure.main\1.11.0\clojure.main\1.11.0\tools\net6.0\any" -Filter "*.dll"
dllファイル1つに対して、.metaファイルが自動生成されますが、Unityが管理するためのものなので、削除しないようにしましょう。
https://github.com/clojure/clojure-clr/wiki
Unityの外部IDの設定項目は、[編集] - [環境設定] - [外部ツール] - [外部のスクリプトエディター]で変更できる