おもちゃラボ

Unityで遊びを作ってます

【Unity】Visual Studio Codeを使う(2021年度対応)

Unityでは標準のエディタとしてVisual Studioが使えるようになっていますが、動作が重かったり、補完機能が不安定だったりします。そこで、サクサク動いて補完もバッチリなVisual Studio Codeのインストール方法をまとめます。

手順は次のとおりです。

Visual Studio Codeのインストール

まずはVisual Studio Codeをインストールします。お使いの環境に合わせたVS Codeのインストーラをダウンロードしてインストールしてください。

code.visualstudio.com

拡張モジュールのインストール

C#の文法のハイライトやコードの補完、インテリセンスが使えるようにVisual Studio Codeに拡張機能モジュールを追加していきます。

ここでは次の拡張機能モジュールを追加します。

  • C# for Visual Studio Code (OmniSharp)
  • MonoBehaviour Snippets
  • Debugger for Unity
  • Unity Code Snippets

VS Codeの画面左のExtentionsのアイコンをクリックして、検索欄で上の各モジュールを検索してインストールしてください。

f:id:nn_hokuson:20210821230255j:plain

インテリセンスの有効化

拡張機能モジュールをインストールしただけではコード補完が効きません。コード補完を有効にするための設定をします。これをしないとインテリセンスが効かない場合があります。

メニューからCode→Preferences→Settingsを選択して「Use Global Mono」 を検索します。 検索結果のOmnisharp: Use Global Monoのプルダウンメニューが「auto」になっているので「alaways」 に変更します。

f:id:nn_hokuson:20210821230421j:plain

Monoのインストール

Macではコード補完を有効にするため、Monoのモジュールも追加でインストールする必要があります。次のサイトから Download Mono 6.12.0 (Visual Studio channel)ボタンをクリックして、Monoをダウンロード、インストールしてください。

www.mono-project.com

Unityでエディタの設定

最後にUnityでC#ファイルやShaderファイルをクリックしたときにVisual Studio Codeが起動するように設定します。

メニューバーからUnity→Perferencesを選択してください。左カラムのExternal Toolsをクリックして、External Script EditorのプルダウンをVisual Studio Codeに設定してください。

f:id:nn_hokuson:20210821230148j:plain:w500

確認

これでVisual Studio Codeの設定は完了です。Unityで適当なスクリプトを作って入力してみてください。次のようにシンタックスハイライトやインテリセンスがちゃんと動いていればOKです。
f:id:nn_hokuson:20210822060607g:plain:w600

【Unity】M1 Mac (Apple Silicon)でUnityのビルド時間を測ってみた

M1 MacBook Airを購入したのでUnityのiOS/Androidのビルド時間やSwitch Platformをしたときの時間を計測してみました。今回、計測&比較に使用したPCのスペックは次のとおりです。

PC名 M1 MacBook Air iMac
CPU M1 4Core+4Core Core i5 QuadCore 3.2GHz
GPU M1 Radeon R9 M380
メモリ 8GB 24GB

計測結果

実験はUnity2021.1.6で3Dのプロジェクトを作成した直後の状態(空のプロジェクト)で行っています。

Switch Platformの時間はTarget platformをMac→iOSの変更にかかった時間を測っています。また、iOSビルド・Androidビルド・Xcodeビルドについても空のプロジェクトをビルドした結果です。

PC名 M1 MacBook Air iMac
Switch Platform 2分40秒 0分42秒
iOSビルド 1分5秒 1分12秒
Androidビルド 1分40秒 1分33秒
Xcodeのビルド 0秒18秒 1分20秒

続・計測結果(2021年6月追記)

Unity 2021.2.0a19のPreviewパッケージでついにApple Silicon対応のUnityエディタがリリースされました!

forum.unity.com

それぞれのプラットフォームのビルド結果を測定してみたので追記しておきます。

PC名 M1 MacBook Air
Switch Platform 0分14秒
iOSビルド 0分29秒
Androidビルド 1分02秒

iOSビルドが2.3倍、Androidビルドが1.5倍、Switch Platoformが2分40秒→14秒と12.8倍の高速化!!(笑) Apple Siliconに対応したエディタだとビルドが爆速になりました。ということでApple SiliconのMacを買おう。

考察

M1 MacとIntel Macでメモリの差はあるので単純比較はできないですが、Unityのビルド時間は思ったほど速くなかったですね。。。

Unity 2021.1.6のUnity Editorは Apple Silicon にネイティブ対応していなくて、RosettaでIntelの命令コードをApple Sliconの命令コードへとバイナリを変換するオーバーヘッドが生じます。これがM1 MacでUnityを動かしたときに時間のかかる原因でしょう。

Xcodeのビルド時間はかなり短縮されているので、Unity2021.2でUnityエディタがApple Sliiconにネイティブ対応すれば、かなり高速になるんじゃないかなぁ、と期待しています!
forum.unity.com

Unity2021.2.0f1でApple Siliconにネイティブ対応!

ついにUnity2021.2.0f1でApple Silicon上でネイティブで動くエディタがリリースされました!

Apple Siliconにネイティブ対応したエディタをインストールするにはUnity Hubで「インストール」→「エディターをインストール」をクリックします。
f:id:nn_hokuson:20211109161038p:plain:w600
表示されるUnityエディタの候補から「シリコン」と書かれたバージョンのエディタをインストールしてください。
f:id:nn_hokuson:20211109161116p:plain:w600
インストールしたUnityのアイコンを選択して⌘Iで情報を見ると、ちゃんとApple Siliconネイティブで動いていることが確認できます!
f:id:nn_hokuson:20211109161537p:plain:w320

まとめ

Unity2021.1.6時点では、M1 MacでのUnityのビルド時間はそこまで速くない!

UnityエディタがApple Siliconに対応(2021.2.0a19)したら爆速になった!

【Unity】これだけは覚えておきたいRectTransformの基本

UnityのUIを作るときに使うuGUIですが、このuGUIを動かしたいときに使う座標系ってちょっと分かりにくくないですか?uGUIの座標系についてはあやふやなまま使っているという方も多いかと思います。

そこで、ここではuGUIで座標を扱うときに、最低限押さえて置かなければいけないポイントをまとめておこうと思います。CanvasのRender Modeの設定はデフォルトの「Screen Space - Overlay」になっている前提で説明しますね。

RectTransformについて

UIで座標を指定するにはTransformではなくRectTransformを使用します。RectTransformのメンバには「position」と「anchoredPosition」の2種類が用意されています。

f:id:nn_hokuson:20210512072509p:plain

RectTransformを使うときは、この2つのメンバがあることを意識して、きちんと使い分けられるようになればOKです!

positionの場合

画面の解像度を1280x720に設定した場合、RectTransformのpositionを使った座標系では画面左下が(0,0)、右上が(1280, 720)になります。
f:id:nn_hokuson:20210511231403p:plain:w500

anchoredPositionの場合

一方、anchoredPositionを使った座標系では、インスペクタで設定したアンカーが原点になります。例えばアンカーをセンターに指定した場合、画面の座標は次のように-640 < x < 640、-360 < y < 360の範囲になります。

f:id:nn_hokuson:20210511231416p:plain:w500

インスペクタで座標を設定する

さて、ではインスペクタで設定する値はpositionとanchoredPositionのどちらでしょうか?(すぐに答えを言っちゃうんですけど)インスペクタに表示されている値はanchoredPositionになります!このあたりがあやふやだと混乱するので注意してください。

f:id:nn_hokuson:20210511232246p:plain

スクリプトから値を設定する

スクリプトからuGUIの座標を設定するには、ゲームオブジェクトにアタッチされているRectTransformコンポーネントを取得して、そのメンバであるpositionかanchoredPoistionに値を設定します。

// positionを使って設定する。
// この場合、positionに(0,0)を設定しているので画面左下に表示される
GetComponent<RectTransform>().position = Vector3.zero;

// anchoredPositionを使って設定する
// この場合、anchoredPositionに(0,0)を設定しているのでアンカーの位置に表示される
GetComponent<RectTransform>().anchoredPosition = Vector3.zero;

ワールド座標系をuGUIの座標系に変換する

ゲーム中のオブジェクトの上に、何かUIで情報を表示したい場合には「ワールド座標」→「スクリーン座標」の変換ができると便利です。この変換のため、UnityにはRectTransformUtility.WorldToScreenPointというメソッドが用意されています。

f:id:nn_hokuson:20210512143315p:plain:w550

使い方は次のとおりです。WorldToScreenPointの戻り値はRectTransformのpositionに代入します。anchoredPositionではないので注意しましょう。

//Utility.WorldToScreenPointを使って座標変換をする
GetComponent<RectTransform>().position 
= RectTransformUtility.WorldToScreenPoint (Camera.main, player.transform.position);

DOTweenを使ってuGUIの要素を動かす

DoMoveメソッドの場合

DOTweenを使ってuGUIのオブジェクトを動かすとき、DoMoveメソッドを使うと、positionを使った座標系(左下が原点)でオブジェクトが移動します。

次の例ではimgは画面左下に移動します。

img.transform.DoMove(Vector3.zero, 1.0f);

f:id:nn_hokuson:20211006062152p:plain:w300

DOAnchorPosメソッドの場合

一方、RectTransformコンポーネントのDOAnchorPosメソッドを使うとanchoredPositionの座標系でオブジェクトを移動できます。

次の例ではimgはアンカーの場所に移動します。

img.GetComponent<RectTransform>().DOAnchorPos(Vector3.zero, 1.0f);

f:id:nn_hokuson:20211006062231p:plain:w300

まとめ

uGUIの座標系にはpositionとanchoredPositionがあります。positionは画面左下が原点になり、anchoredPositionはインスペクタで設定したアンカーが原点になります。