unity4d

**できることはやった**

#成果物
https://github.com/pandaman64/unity4d

#やったこと
##.NET用dmd
dmdの.NET用バックエンドを[D Compiler for .NET](https://dnet.codeplex.com/)から引っ張ってきました．
![DNEThistory.png](https://qiita-image-store.s3.amazonaws.com/0/11714/da8df5b9-2203-a862-c8d2-eb05fbfc003c.png)
（　＾ω＾）・・・
![deadDNET.png](https://qiita-image-store.s3.amazonaws.com/0/11714/942e0b77-e200-0b62-6f2e-ef800f7f3ba2.png)
（　＾ω＾）し，死んでる・・・

気を取り直してSource Codeの所からDownloadをクリック．ワクワクを抑えながらソリューションを開いて高らかにビルドをﾀｰﾝ!!
<img width="1234" alt="errors.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/53f36161-a76e-f5dc-8249-d283e177cf81.png">
(,,ﾟДﾟ)
ソースコードを眺めてみます．
<img width="494" alt="alignof.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/cf981f35-dbd8-9c8b-6947-a172072fda07.png">
あー．
<img width="492" alt="stdint.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/2a09c415-13ca-52cf-ee31-cc79ba05aa29.png">
？？？？
dmdのソースに含まれていたstdint.hが古かったみたいです．[最新のdmd](https://github.com/D-Programming-Language/dmd/blob/7a7687e6e5b46ab9629bcdddb3061478c504ae49/src/vcbuild/stdint.h)からstdint.hを拾ってきたらエラーが消えました！

他にも細々としたコンパイルエラーを消しました．エラーの原因はおおよそVC++の規格準拠度が上がった（！）せいのようです．古いVC++でコンパイルできるように加えたハックが逆にエラーを引き起こしていたみたいでした．悲しいなあ・・・

##Hello, World!
D.NETは.NETの中間言語であるCIL(Common Intermediate Language)を吐いて，そこからMS謹製のアセンブラ(ilasm.exe)でアセンブルしているので，デベロッパーコマンドプロンプト上でコンパイラを実行する必要があります．

やってみました．
<img width="381" alt="hello.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/e75d1808-37a0-4d1b-74dd-90bfb2f155dd.png">
こんなのを書いてコンパイルしたら，
<img width="549" alt="hello_console.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/efd61372-0295-4f37-8fa2-d7234415fedd.png">
こんなのがでてきて，
<img width="275" alt="hello_output.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/89ba63a6-ef1e-71c1-c372-b3866d692310.png">
やったあ！変数も使ってみましょう，
<img width="226" alt="hello_var.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/dd577413-e555-bb5c-09b6-95e9d307caf5.png">
どうかな？
<img width="555" alt="hello_var_console.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/35e3caac-3b08-b820-0439-416a276b5efb.png">
(´･_･`) ・・・・・・訳が分からないよ・・・
ローカル変数の宣言部分(.locals initから)のところに余計なカンマがあるのが原因だったのでそれを取り除くスクリプトをD言語で書きました．昔のアセンブラは構わず通してたんだろうか・・・

##Unity
D.NETに付属しているライブラリファイルではConsole.WriteLineしかできないので面白くありません．せっかくの.NETなのですから，Unityでも使えるようにしてみましょう．
<img width="647" alt="nettod.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/e86d946c-e553-c70e-44f9-3685c828d357.png">
.NETのアセンブリ(dll)から宣言を抜き出すプログラムを書いてmscorlib.dllとUnityEngine.dllに対して走らせます．
するとD言語でimportする用の.dファイルの出来上がり！
<img width="734" alt="unityengine.d.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/5b5e5154-5526-566e-c717-a4602f5c380b.png">
やったー．自作のMonoBehaviourを書きます．
![DBehaviour.png](https://qiita-image-store.s3.amazonaws.com/0/11714/007f58e4-ac5f-7c22-25c2-732210b79fc1.png)
コンパイルしたdllをUnityのエディタに放り込んで，
<img width="318" alt="DBehaviourInUnity.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/a9488d6d-3fe9-275c-c341-76f82d907aca.png">
スクリプトをアタッチできたぞー！！！
<img width="243" alt="AttachDBehaviour.png" src="https://qiita-image-store.s3.amazonaws.com/0/11714/c1b15592-4e7a-6416-be24-9680fc8cf900.png">
後はテキトーにゲームを一本書くだけだなと，このとき（24日夜）は思ってたのですが．

##MissingMethodExceptionの罠
![NotFound.png](https://qiita-image-store.s3.amazonaws.com/0/11714/14a09b0e-f277-7754-a624-4b6a24be2a34.png)
dotPeekで見る限り.dファイルは正常に生成されているし，ILにも特別不審な点は見当たらないのですが，なぜかMissingMethodExceptionが出てうまく動きませんでした．

![DKid.png](https://qiita-image-store.s3.amazonaws.com/0/11714/8592a994-eb3e-cd6f-bb20-80b310c64367.png)
靴下持ってプレゼント（D言語くん）を待ち構えている子供（D言語くん）のモデルも作ったのに・・・