突然仕事でUnity向けのSDKやPluginを作ることになった人向け資料<概要編>

#はじめに

仕事でUnity向けのSDK/Plugin開発をやることになりました。
私自身はUnityを一年ほど扱ったことがあるのですが
「iOS, Androidの開発はあるけどUnityはやったことない！」
「趣味やったけど仕事で使ったことない！」
という方が意外と多い事に気づきました。意外とそういう書籍もなく、
「ここがわかれば仕事がスムーズに進むかも」
と思ったことをざっと書きます。

#仕事をはじめる前に

##マニュアルを読む

公式マニュアルは以下です。
http://docs.unity3d.com/ja/current/Manual/

##対応バージョンを決める
2016年6月現在最新版のUnityは5.3.5で、Unity5.0.0の公開が2015年5月です。
4と5で仕様が大きく変わっているため新規作成の場合は5.xのみ対応で良いと思います。
(仕事によって変わると思うので個人的意見です)

過去のバージョンのUnityは以下からダウンロードできるので対応バージョンを複数ダウンロードしておくと良いと思います。
(ライセンスやサブスクリプションについては適時確認してください)
https://unity3d.com/jp/get-unity/download/archive

##成果物を決める

SDKやPluginの場合、成果物は「.unitypackage」形式が一般的です。
プロジェクトビュー内で右クリック> Export Packageで簡単に作成できます。
また、ユーザが取り込む際も右クリック> Import Packageで取り込むことが出来ます。

<img width="633" alt="スクリーンショット 2016-06-24 19.43.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/892eb203-3f25-4214-6979-0f6ae67b4f5d.png">

### unitypackage内のプロジェクト構成について

SDK名をunitypackage直下のフォルダ名として使用するのが良いです。

<img width="643" alt="スクリーンショット 2016-06-24 19.54.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/a0acdeab-fdb6-94d1-4346-22f82ec47eb2.png">

理由は以下です。
・import時の名前衝突を避ける
・ユーザが手作業でファイルを移動してしまうと次回SDK更新時に正しい差分表示がされずimportが面倒になるため

※ただしPluginsフォルダは例外としてAssets直下のPluginsフォルダに置くことになります。
http://docs.unity3d.com/ja/current/Manual/SpecialFolders.html

SDKが正しく動くことを確認するため1つ以上のデモシーンを準備すると良いと思います。


# コード/開発について

##コーディング規約

UnityScript開発はC#を使用します。
C#自体にはコーディング規約はなく、チームで決めることになると思いますが参考としてMicrosoftとMonoの規約を以下に貼ります。

https://msdn.microsoft.com/ja-jp/library/ff926074.aspx
http://www.mono-project.com/community/contributing/coding-guidelines/

###コーディング規約のチーム共有

Unityに標準付属されているMonoDevelopにはカスタムポリシー機能でコードフォーマットを設定することが出来ます。
タブorスペース、括弧の位置、改行コードなど守りにくいルールをポリシー化することが出来ます。

(MonoDevelop-Unity >Custom Policyで設定)
<img width="951" alt="スクリーンショット 2016-06-24 20.08.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/62bf8639-cf81-1492-5a9a-56c354480cb4.png">



### ドキュメントコメント
Unityの標準機能ではないのですが、
C#なので外部ツールのDoxygenやSandcastleなどでドキュメントコメントからドキュメント生成可能です。

http://www.doxygen.jp/
https://github.com/EWSoftware/SHFB/releases

## バージョン管理ツールを使用する際の注意点
	
1ファイルにつき同名のmetaファイルが作成されます。
このファイルはバージョン管理化におかないとプロジェクトが壊れることがあります。
また、Unity上以外でファイルの更新や上書きをおこなうとmetaファイルと同期されないためプロジェクトが壊れることがあります。

http://docs.unity3d.com/ja/current/Manual/ExternalVersionControlSystemSupport.html

gitHubでは初期設定の際にUnity向けの.gitignoreが設定できます。

<img width="732" alt="スクリーンショット 2016-06-24 20.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/3a6ef68f-2b10-813d-03c1-731469861efd.png">

# ユニットテストについて

Unity5.3からユニットテストに関してNUnit標準搭載となりました。

ユニットテストの作成はAssets> Create >Editor Test C# Script
<img width="717" alt="スクリーンショット 2016-06-24 22.50.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/261a5d44-c868-8f7f-3742-78b295016836.png">

ユニットテストの実行はWindow> Editor Test Runner
<img width="665" alt="スクリーンショット 2016-06-24 22.51.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/87ff7f61-3d22-5422-e678-ab154b2ece9f.png">

また統合テストなどが必要な場合は
Unityから提供されているUnity Test Toolsを使用します。
https://www.assetstore.unity3d.com/jp/#!/content/13802

# パッケージ作成の自動化

上の方にunitypackageは作成が楽と書きましたがUnity起動すら面倒なことがあります。
Unityはコマンドラインから実行可能よりJenkinsなどのCIツールにて自動化出来ます。
(2016年6月現在、Unity Cloud Buildではunitypackage出力には対応してないっぽいです)

以下はMacでUnityからunitypackageをexport出力する例となります。

``` Macでの例
/Applications/Unity/Unity.app/Contents/MacOS/Unity\
 -batchmode\
 -nographics\
 -projectPath {$PROJECT_HOME}\
 -exportPackage Assets/HogehogeSDK Assets/Plugins HogehogeSDK.unitypackage\
 -quit
```

Jenkinsを使用する場合、以下の様なUnity Pluginもあります。
https://wiki.jenkins-ci.org/display/JENKINS/Unity3dBuilder+Plugin

http://docs.unity3d.com/ja/current/Manual/CommandLineArguments.html

#おわりに
別に知らなくてもUnity向けのSDKやPluginは開発できるのですが、
"仕事"では必須な「チーム開発」「テスト」「自動化」というあまり触れられない部分についてのざっと紹介でした。
今回書いてて気づいたことは、たいていのことは公式マニュアルに書いてあるということです(大事)
Unity初心者向け記事としては「趣味でゲーム開発」が多いので、
真逆の「仕事で非ゲーム開発」はあまり需要はないかもしれないですが参考になれば

つづく(かも