blog.tkeo.info

EmacsでUnity開発をする

これはドリコム Advent Calendar 2014の10日目の記事です。

9日目は@hiracyさんによるサーバが増えた時にインフラ担当者がやってきたことです。

自己紹介

  • @tkeo
  • 2007年新卒でドリコムに入社、8年目
  • メインの仕事はスマホゲームのサーバサイド(Rails)で、今年からクライアント(Unity)のほうも触り始めた
  • Rails歴 6年、Unity歴 8ヶ月
  • いまの作業比率は サーバ:クライアント = 2:1 ぐらい

今回の話

Unityを始めた当初はMonoDevelopを使っていたのですが、どうにも手になじまず腹が立ったので、普段サーバ側の開発で使っているemacsを使うことにしました。

以下はいろいろハマりながらも、インターネット上の先人の力を借りてまとめた自分の設定です。

環境

  • Mac OS X Mavericks
  • emacs 24.4.1
  • パッケージ管理はcask

csharp-mode

これがなくては始まらないC#用のメジャーモード。

1
2
; cask
(depends-on "csharp-mode")
1
2
3
4
5
6
7
8
9
; init.el
(require 'csharp-mode)
(add-hook 'csharp-mode-hook
          '(lambda ()
             (setq indent-tabs-mode nil)
             (setq c-basic-offset 4)
             (c-set-offset 'substatement-open 0)
             (flycheck-mode 1)
             (omnisharp-mode)))

自動補完

OmniSharpServer

C#のコードをパースしたりいろいろやってくれる(らしい)サーバです。 他のエディタでも使えるらしいです。

monoが必要なのでインストールして、

1
$ brew install mono

あとはREADME通りにビルド。

1
2
3
4
$ git clone https://github.com/nosami/OmniSharpServer.git
$ cd OmniSharpServer
$ git submodule update --init --recursive
$ xbuild

するとOmniSharp/bin/DebugOmniSharp.exeができているはず。 試しに起動してみる。

1
$ mono OmniSharp/bin/Debug/OmniSharp.exe -s /path/to/unity-project.sln

するとずらずらっとLoadingほげほげと出てきて、Solution has finished loadingで起動完了。無事起動が確認できたらCtrl+Cで止めておく(このあとemacsから起動するので)

omnisharp-emacs

OmniSharpServerをemacsから使うためのものです。

1
2
; cask
(depends-on "omnisharp")
1
2
3
; init.el
(require 'omnisharp)
(setq omnisharp-server-executable-path (expand-file-name "/path/to/OmniSharp/bin/Debug/OmniSharp.exe"))

csファイルを開いた時にslnファイルを選べと言われるので、選んであげるとバックグラウンドで起動してくれます。

M-x omnisharp-auto-completeで候補表示、M-x omnisharp-go-to-definitionで定義にジャンプできます。 適当なキーバインドを設定しておくと便利。

文法チェック

flycheck

omnisharp-emacsにcheckerが含まれていて、OmniSharpサーバと連携してチェックをしてくれます。

1
2
; cask
(depends-on "flycheck")
1
2
3
4
; init.el
(require 'flycheck)
(setq flycheck-check-syntax-automatically '(mode-enabled save idle-change))
(setq flycheck-idle-change-delay 2)

emacsclientアプリ化

Unity上でcsファイルをダブルクリックして開きたくなったときのための設定(あまりしないけど)

Unityの設定で外部エディタに指定できるのはMacのアプリ(*.app)だけなので、emacsclientを起動するアプリを作ります。 vim用にやっている人がいたのでその設定を参考にしました。

アプリを作るのにはAutomatorを使います。手順は以下のとおり。

  1. アプリケーションを選択。
  2. アクション>ユーティリティの中にある「AppleScriptを実行」を右にドラッグ&ドロップ。
  3. 下記コードを貼り付けて、appを適当な場所に保存。
1
2
3
on run {input, parameters}
    do shell script "/usr/local/bin/emacsclient -n " & quoted form of POSIX path of input
end run

automator

作ったappをUnity上で指定してあげると、外部エディタとしてemacsが使えるようになります。 あとはserverとして起動するのを忘れずに。

1
2
3
4
; init.el
(require 'server)
(unless (server-running-p)
  (server-start))

リファレンス検索

rubyの開発でも使っているDashを使えるようにします。

dash-at-point

1
(depends-on "dash-at-point")
1
2
3
4
; init.el
(global-set-key (kbd "C-c d") 'dash-at-point)
(global-set-key (kbd "C-c e") 'dash-at-point-with-docset)
(add-to-list 'dash-at-point-mode-alist '(csharp-mode . "cs"))

カーソル位置の単語で検索します。 上記設定ではcsharp-modeのときはキーワード “cs” が設定されたdocsetの中から検索します。

dash

Dash側で画像のようにキーワードを設定しておくと、.NET FrameworkとUnity 3Dのドキュメントを同時に検索できます。

自前docsetを作る

doxygenを使えばDash用のdocsetを作れます。 コードを含むアセットを購入した時に(たまに)やってます。

1
$ brew install doxygen
1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat doxygen.config
GENERATE_DOCSET        = YES
SEARCHENGINE           = NO
DISABLE_INDEX          = YES
GENERATE_TREEVIEW      = NO
GENERATE_LATEX         = NO
GENERATE_HTMLHELP      = YES
RECURSIVE              = YES

PROJECT_NAME           = hogehoge
OUTPUT_DIRECTORY       = output
INPUT                  = path/to/Scripts
DOCSET_BUNDLE_ID       = hogehoge

こんな感じの設定ファイルを作って、まずはHTMLドキュメントを生成。

1
$ doxygen doxygen.config

htmlディレクトリに移動してmakeをたたくとdocsetが作られます。

1
2
3
$ cd output/html
$ make
$ open hogehoge.docset

その他

日本語を含むときはBOM付きで保存しないと化けます。C-x RET futf-8-with-signatureに変更。

まとめ

以上、MonoDevelopを使わずにemacsでUnity開発するための設定を紹介しました。

明日はみっきーさんです。

参考リンク