UnityでVimを使うためのセットアップ手順

この記事は[Vim2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/vim2)の13日目の記事です。

Unityでは外部のスクリプトエディタを設定できるようになっており、
スクリプトエディタにはVimを指定することもできるようになっています。

この記事ではUnityでVimを使うための設定について紹介します。

## 2022-08-05追記

執筆当時(2020年12月)の手順だとできなくなっていたので更新。
あわせて数か所調整。以下調整箇所。もしまた動かなくなったりしていた場合はTwitter等からご連絡ください。調整します。

- vim-plugの代わりにvim-jetpackを使うように
- vim-lsp、vim-lsp-settingsの代わりにomnisharp-vimを使うように

セットアップ手順
----------------

次の手順でセットアップをしていきます。
今回はWindows11を前提に書いていますが、一部を読み替えれば、他のOSでも同じ設定を行うことが可能です。

手順は1から全て書いていますが、
○○をインストールと書いている箇所については、該当のものを既にインストールしている場合はスキップして問題ありません。また、手順はあくまでも一例なので、必ずしも全てこの手順に沿って行う必要はありません。
1.1、1.2、1.3については、Scoopを使わずに公式サイトからVim、Gitをインストールしても問題ありませんし、
1.3、1.4、1.5、1.6、1.7、3.3は補完が不要であればスキップして問題ありません。
最低限、1.2、2.1、2.2、3.1、3.2のようにして、VimとUnityをインストールし、外部のスクリプトエディタをVimに設定できれば十分です。

まずはVimのセットアップを行います。

### 1.1. Scoopのインストール

https://scoop.sh/

後述するVimとGitをインストールするため、Scoopをインストールします。
Scoopをインストールするには、PowerShellで次のコマンドを実行します。

```powershell
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
```

上記のコマンドでエラーが出る場合は、PowerShellの実行ポリシーでスクリプトの実行が制限されている可能性があります。上記のコマンドでエラーが出ていた場合は、次のコマンドを実行して実行ポリシーを変更した後、上記のコマンドを再度実行します。

```powershell
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
```

### 1.2. Vimのインストール

https://vim-jp.org/

Vim本体をインストールします。
Vim本体をインストールするには、PowerShellで次のコマンドを実行します。

```powershell
scoop install vim
```

### 1.3. Gitのインストール

https://git-scm.com/

後述するvim-jetpackを使う上で必要となる、Gitをインストールします。
Gitをインストールするには、PowerShellで次のコマンドを実行します。

```powershell
scoop install git
```

### 1.4. vim-jetpackのインストール

https://github.com/tani/vim-jetpack

後述するomnisharp-vimをインストールする上で必要となる、vim-jetpackをインストールします。
vim-jetpackをインストールするには、cmdで次のコマンドを実行します。

```dosbatch
curl -fLo %USERPROFILE%\vimfiles\pack\jetpack\opt\vim-jetpack\plugin\jetpack.vim --create-dirs https://raw.githubusercontent.com/tani/vim-jetpack/master/plugin/jetpack.vim
```

### 1.5. vimrcの設定

後述するomnisharp-vimのインストール、いくつかの設定のため、vimrcを編集します。
Windowsであれば`C:\Users\ユーザー名\_vimrc`を開き(無ければ作成し)、次のような設定を追記します。

```vim:_vimrc
" 補完の設定
" (任意)補完の表示をメニューとポップアップに出す
set completeopt=menu,popup

" vim-jetpackの設定
" call jetpack#begin()～call jetpack#end()にインストールするプラグインを記述する
"
packadd vim-jetpack
call jetpack#begin()
Jetpack 'tani/vim-jetpack', {'opt': 1}
Jetpack 'OmniSharp/omnisharp-vim'
call jetpack#end()

" シンタックスハイライトの有効化
" ファイルタイプの自動検出、ファイルタイプ用のプラグインとインデント設定の自動読み込みの有効化
syntax enable
filetype plugin indent on
```

### 1.6. omnisharp-vimのインストール

https://github.com/OmniSharp/omnisharp-vim

Omnisharpクライアントのomnisharp-vimをインストールします。
先ほどの手順でvimrcを編集したのち、Vimを再起動して次のExコマンドを実行し、それらをインストールします(インストールするプラグインは先ほどの手順でvimrcに記述しています)。

```
:JetpackSync
```

### 2.1. UnityHubのインストール

https://unity3d.com/jp/get-unity/download

Unityの管理をしてくれる、UnityHubをインストールします。
上記のURLからUnityHubをインストールします。

### 2.2. Unityのインストール

Unity本体をインストールします。
UnityHubを起動したら、インストール→インストールから推奨リリースのバージョンを選択し、次のモジュールを選択し、Unityをインストールします。

- Microsoft Visual Studio Community 2019
- Android Build Support
- iOS Build Support
- Linux Build Support (Mono)
- Mac Build Support (Mono)
- WebGL Build Support
- Windows Build Support (IL2CPP)
- 日本語

これでUnityのプロジェクトを作る前の段階でやる必要のある手順は終わりです。
あとは、プロジェクトを作成したときに次の初回の設定を行うようにします。

### 3.1. プロジェクトの作成

Unityのプロジェクトを作成します。
UnityHubを起動したら、プロジェクト→新規作成からプロジェクトを作成します。

今回は例として、テンプレートは2D、プロジェクト名はTest、保存先は`C:\Users\ユーザー名\Documents\Unity\`を指定します。

### 3.2. 外部のスクリプトエディタの設定

Unityで使用する外部のスクリプトエディタを設定します。
Unityのプロジェクトを開いたら、編集→環境設定から環境設定を開き、外部エディタ→外部のスクリプトエディタをVimに設定して環境設定を閉じます。
外部エディタの一覧にVimが無ければ、ブラウズからgvim.exeを指定します。gvim.exeはScoopでVimを入れたのであれば`C:\Users\ユーザー名\scoop\apps\vim\current\gvim.exe`にあります。

### 3.3. slnファイル、csprojの作成

OmniSharpにプロジェクトを認識させるために必要となる、slnファイル、csprojファイルを作成します。
Unityのプロジェクトを開いたら、アセット→作成→C♯スクリプトから仮のC♯スクリプトを作成し、
編集→環境設定から環境設定を開き、外部エディタ→外部のスクリプトエディタをVisual Studioに設定し、外部エディタ→Regenerate project filesをクリックし、外部エディタ→外部のスクリプトエディタをVimに戻します。そうするとslnファイルとcsprojファイルが生成されます。最初に作成した仮のC♯スクリプトは削除します。

これで必要な作業は終わりです。
最後に確認として、試しに簡単なものを作ってみましょう。

確認
----

Unityのプロジェクトを開いたら、アセット→作成→C♯スクリプトから、CubeBehaviourという名前のC♯スクリプトを作成します。作成したら、CubeBehaviourを開き、CubeBehaviourを次のように編集します。
ここで、補完を行いたい箇所でCtrl+x→Ctrl+oと入力して補完候補が表示され、Ctrl+nやCtrl+pで補完候補の選択ができれば、適切にセットアップができています。

```csharp:CubeBehaviour.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeBehaviour : MonoBehaviour
{
    public float speed = 5f;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        var dx = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
        var dy = Input.GetAxis("Vertical") * Time.deltaTime * speed;
        transform.Translate(dx, dy, 0);
    }
}
```

編集し終えたら、ゲームオブジェクト→3Dオブジェクト→キューブからキューブを追加します。追加したら、CubeBehaviourを追加したキューブにドラッグアンドドロップします。そうしたら、再生を押し、キューブが矢印キーで動くことを確認します。

最後に、ファイル→ビルドして実行→ビルドして実行から実行してみましょう。終了させるためのコードは書いていないので、終了するときはタスクバー等から終了するようにします。

まとめ
------

このような手順を踏むことで、
Unityの外部スクリプトエディタとしてVimを使うことができるようになります。

おまけ
------

こうしてせっかくUnityとVimの開発環境を整えたので、
一つVimで反復横跳びをする感じのゲームを作成してみました。

![vimsts-ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82539/74173552-fe15-c23d-9ddb-924260dde116.png)

左右移動の練習になる…かもしれない。
Windows版、Mac版、Linux版を置いています。
Unityだとクロスプラットフォームなものが作りやすくて、その辺りとてもいいと思います。

https://github.com/nil2nekoni/vimsts