#参考文献
[Tutorial: Using F# with Unity3D] (http://jacksondunstan.com/articles/3229)
Unityのマネージド プラグインに関するマニュアル
初心者がF#をUnityで使ってみた!
#はじめに
どうしてもUnityで機械学習をしてみたいので、F#を始めました。完全に初心者なので、一部勘違いがあるかもしれません。お気づきの点がございましたら、コメントか Twitterで @yanosen_jp にご指摘ください。
#プロジェクトのセットアップ
まず Unityプロジェクトを作る。
次に、Visual Studioの立ち上げ (Unityインストール時に入れる、Community Editionでよい)
File -> New -> Project
Visual F#のテンプレートを探す。まだインストールされてなければ、指示に従ってインストールする。インストールが完了したら、Libraryを選択する。
ライブラリの名前は何でもよい(ここではLibrary1とした)が、位置(Location)はUnityプロジェクトのルート(Assetsとかと同じレベル)にしておく。
![NewProject.PNG](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2Ff3ae4914-aa07-d212-ccf4-b93b8acc98e3.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c36f052610a53d016f4ed2dcb0ffe125)
OKを押すと、プロジェクトが作られる。
右端のSolution Explorerで、”Library1”を右クリックして出てくるPropertiesを開く
![スクリーンショット (7).png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2F043bd643-bb56-89be-9efc-c60676580769.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f87c23a5928bc20953c1ca8a4c68a25d)
Applicationタブで、Target FrameworkをUnity 3.5 .net Subset Base Class Librariesにする。
![ProjectProperties1.PNG](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2Fba8bda68-102b-4f65-0217-220c585bde91.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e95aa04a79b1a2b08916ed8ad36e65ac)
Buildタブで、Output PathをUnityプロジェクトのAssetsの下(下ならどこでもよい)に指定する。
![ProjectProperties2.PNG](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2Fd4675f0c-1603-c873-42a5-8c491112b1fc.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ff8fb64221dced5207599e39065616f0)
ここでは(かくれて見えないけど)Assetsのすぐ下を指定した。
次に、同じく右端のSolution Explorerで、”Library1”の左の▶︎をクリックして出てくるReferencesフォルダを右クリックし、Add Referenceを選択する。
![Reference.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2F04250455-ea35-cc6d-ee7c-67ff2b6cc725.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fa5642026d6f24fc71f207e6f38f0476)
そこで、自分が使っているUnityのUnityEngine.dllを選択する。図中のパスを参考に。
![AddReference.PNG](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2Fba766753-25d7-d507-0d3b-1f68418fb3b3.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a0b7a2169668f7f26fee3f7bc57c62ae)
Solution ExplorerでUnityEngine.dllをクリックすると、下にPropertiesが出るので、それでCopy LocalをFalseにする。
![CopyLocal.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2F348cd6b3-76ea-ef7d-efd5-2ea1af789623.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=76fa05c714828a7286ca077fadc6e680)
F#スクリプトの書き方
ゲームオブジェクトにアタッチするスクリプトの場合
Unity側でゲームオブジェクトにアタッチするF#スクリプトを作るには、以下のように書く。ここでは、ファイル名はLibrary1.fs
namespace Library1
open UnityEngine
type TestScript() =
inherit MonoBehaviour()
member this.Start() = Debug.Log("Hello F# World")
Open UnityEngine
とinherit MonoBehaviour()
が必要。
出来たら保存して、Build -> Build Solutionでビルドする。終わったら、UnityのAssetsフォルダの中を確認する。以下のようになっているはず。
![FSharpInUnity.PNG](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2F31279b4e-a48d-fda5-0a98-07962c01540a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=befbcdc98a509d266b3fd54efa370d28)
空白の書類のように見えるLibrary1.dllをクリックすると、中にTestScriptを確認できる。これを、適当なゲームオブジェクトにアタッチする。そして、Playすれば、コンソールに"Hello F# World"が出ることを確認できる。
GameObjectにアタッチしないF#スクリプト
ゲームオブジェクトにアタッチしない(MonoBehaviourを継承しない)F#スクリプトも使える。Solution ExplorerでLibrary1を右クリックし、Add -> New Item...を選択する。
![AddNew.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2F13f158be-4f86-c046-bc29-cc4d7f79c373.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3090b416d50b0417e0855e769e95bdfc)
出てくるウィンドウでCode -> Source Fileを選び、名前を付けて保存。
![SourceFile.PNG](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F58503%2F36a181ea-0174-e00b-dd9d-a1d9dea35755.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=8268108544329a3536583c76b0e8ee70)
作ったファイルをFile1.fsとし、以下の通り書いて保存。namespaceを先ほどのLibrary1.fsと同じにしている。
namespace Library1
module File1 =
let k = 5
保存したら、またビルド。UnityのProjectからはファイルそのものは見られないが、気にしなくていい。
次に、File1.fsを参照するためのUnity C#スクリプトを書いてみる。Unity側でLookFSharp.csを作り、以下の通り書く。
using UnityEngine;
using Library1;
public class LookFSharp : MonoBehaviour {
void Start () {
Debug.Log(File1.k);
}
}
Library1をnamespaceとして指定し、モジュール名File1を使ってkという変数を呼び出している。LookFSharp.csを適当なゲームオブジェクトにアタッチし、Playすれば、"5"がコンソールに出てくるはず。