Unity で F#を使う 導入編 メモ 

#参考文献

[Tutorial: Using F# with Unity3D] (http://jacksondunstan.com/articles/3229)
[Unityのマネージド プラグインに関するマニュアル](http://docs.unity3d.com/ja/current/Manual/UsingDLL.html)
[初心者がF#をUnityで使ってみた！](http://qiita.com/RyotaMurohoshi/items/bdd7093707a6a1b4a275)

#はじめに

どうしてもUnityで機械学習をしてみたいので、F#を始めました。完全に初心者なので、一部勘違いがあるかもしれません。お気づきの点がございましたら、コメントか Twitterで @yanosen_jp にご指摘ください。

#プロジェクトのセットアップ

まず Unityプロジェクトを作る。

次に、Visual Studioの立ち上げ (Unityインストール時に入れる、Community Editionでよい）

File -> New -> Project

Visual F#のテンプレートを探す。まだインストールされてなければ、指示に従ってインストールする。インストールが完了したら、Libraryを選択する。

ライブラリの名前は何でもよい（ここではLibrary1とした）が、位置（Location）はUnityプロジェクトのルート（Assetsとかと同じレベル）にしておく。

<img width="953" alt="NewProject.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/58503/f3ae4914-aa07-d212-ccf4-b93b8acc98e3.png">

OKを押すと、プロジェクトが作られる。

右端のSolution Explorerで、”Library1”を右クリックして出てくるPropertiesを開く

<img width="412" alt="スクリーンショット (7).png" src="https://qiita-image-store.s3.amazonaws.com/0/58503/043bd643-bb56-89be-9efc-c60676580769.png">

Applicationタブで、Target FrameworkをUnity 3.5 .net Subset Base Class Librariesにする。

<img width="599" alt="ProjectProperties1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/58503/ba8bda68-102b-4f65-0217-220c585bde91.png">

Buildタブで、Output PathをUnityプロジェクトのAssetsの下（下ならどこでもよい）に指定する。

<img width="473" alt="ProjectProperties2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/58503/d4675f0c-1603-c873-42a5-8c491112b1fc.png">

ここでは（かくれて見えないけど）Assetsのすぐ下を指定した。

次に、同じく右端のSolution Explorerで、”Library1”の左の▶︎をクリックして出てくるReferencesフォルダを右クリックし、Add Referenceを選択する。

<img width="224" alt="Reference.png" src="https://qiita-image-store.s3.amazonaws.com/0/58503/04250455-ea35-cc6d-ee7c-67ff2b6cc725.png">

そこで、自分が使っているUnityのUnityEngine.dllを選択する。図中のパスを参考に。

<img width="785" alt="AddReference.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/58503/ba766753-25d7-d507-0d3b-1f68418fb3b3.png">

Solution ExplorerでUnityEngine.dllをクリックすると、下にPropertiesが出るので、それでCopy LocalをFalseにする。

<img width="243" alt="CopyLocal.png" src="https://qiita-image-store.s3.amazonaws.com/0/58503/348cd6b3-76ea-ef7d-efd5-2ea1af789623.png">

# F#スクリプトの書き方

## ゲームオブジェクトにアタッチするスクリプトの場合

Unity側でゲームオブジェクトにアタッチするF#スクリプトを作るには、以下のように書く。ここでは、ファイル名はLibrary1.fs

```fsharp: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フォルダの中を確認する。以下のようになっているはず。

<img width="516" alt="FSharpInUnity.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/58503/31279b4e-a48d-fda5-0a98-07962c01540a.png">

空白の書類のように見えるLibrary1.dllをクリックすると、中にTestScriptを確認できる。これを、適当なゲームオブジェクトにアタッチする。そして、Playすれば、コンソールに"Hello F# World"が出ることを確認できる。

## GameObjectにアタッチしないF#スクリプト

ゲームオブジェクトにアタッチしない（MonoBehaviourを継承しない）F#スクリプトも使える。Solution ExplorerでLibrary1を右クリックし、Add -> New Item...を選択する。

<img width="580" alt="AddNew.png" src="https://qiita-image-store.s3.amazonaws.com/0/58503/13f158be-4f86-c046-bc29-cc4d7f79c373.png">

出てくるウィンドウでCode -> Source Fileを選び、名前を付けて保存。

<img width="537" alt="SourceFile.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/58503/36a181ea-0174-e00b-dd9d-a1d9dea35755.png">

作ったファイルをFile1.fsとし、以下の通り書いて保存。namespaceを先ほどのLibrary1.fsと同じにしている。

```fsharp:File1.fs
namespace Library1

module File1 = 
    let k = 5
```

保存したら、またビルド。UnityのProjectからはファイルそのものは見られないが、気にしなくていい。

次に、File1.fsを参照するためのUnity C#スクリプトを書いてみる。Unity側でLookFSharp.csを作り、以下の通り書く。


```csharp:LookFSharp.cs

using UnityEngine;
using Library1;

public class LookFSharp : MonoBehaviour {

	void Start () {
        Debug.Log(File1.k);	
	}
	
}
```

Library1をnamespaceとして指定し、モジュール名File1を使ってkという変数を呼び出している。LookFSharp.csを適当なゲームオブジェクトにアタッチし、Playすれば、"5"がコンソールに出てくるはず。