Unity小ネタ3選

EEIC2019のぺんぎー[^1]と申します。Qiita初投稿です。

普段はUnityを使ってゲームを作っています。個人製作・サークル・インターンなどいろんなところでUnityを使ってきて早3年ほどですが、日々新たな発見があります。

ここでは自分の経験から、あまり知られていなそうだけど知っておくといつかは使えるかもしれないUnityの標準機能を紹介します。

Unityのバージョンは主に2019.4系を使用していますが、ここにあげるものは大体2017以降なら対応してるんじゃないかと思います(未検証)
OSはWindows10です。

# 標準機能編

## スクリプトのテンプレートを設定する方法
Unityエディタ上で新しいスクリプトファイルを作成するとデフォルトで以下のようなファイルができますよね。

```c#:NewBehaviourScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

```

でもこのテンプレートで満足していますか？
例えばクラスを全てnamespaceに入れたいとなると、毎回namespaceで囲うのは面倒くさいですよね。
またUniRXを使うようになると、Update関数はいらなくなるんですけど、毎回Update関数を削除するのも手間ですよね。

そこで簡単にテンプレートを変更・追加する方法があります。
テンプレートはプロジェクトごとに設定する方法と、Unityバージョンごとに設定する方法があるんですけど、自分はプロジェクトごとに設定する方法をおすすめします。
(本当は全バージョン共通でテンプレートを設定できればよかったのですが、参照するディレクトリがバージョンごとに違うのでダメっぽいです。)

プロジェクトごとに設定する方法は

1. `ScriptTemplates`というフォルダを好きな場所に作成
1. そのフォルダの中に以下のようなテキストファイルを作成し、`79-Custom__C# Script In Namespace-NewBehaviourScript.cs.txt`と名前を付けて保存
1. Unityを開いて`Assets/`直下に`ScriptTemplates`フォルダをD&D

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace MyNamespace
{
    public class #SCRIPTNAME# : MonoBehaviour
    {
        void Start()
        {
            #NOTRIM#
        }
    }
}
```

一度Unityを閉じてから再度開き、Create欄を見ると`C# Script`の上に`Custom > C# Script In Namespace`があるはずです。
それをクリックすれば、先ほど作成したテンプレートでスクリプトファイルが作成されます。

ちなみにデフォルトのテンプレートはWindowsの場合
`C:\Program Files\Unity\Hub\Editor\201X.X.Xf1\Editor\Data\Resources\ScriptTemplates`
にあります。
ここにテンプレートを追加すればバージョンごとに適用されますし、`81-C# Script-NewBehaviourScript.cs.txt`を書き換えればデフォルトのテンプレートを書き換えることができます。

テキストファイルの命名規則ですが、
`<表示順>-<Create欄に表示する名前>-<生成されるファイル名>.txt`
となっています。
Create欄に表示する名前は`__`(アンダーバー2つ)で階層化可能です。

#### 参照

- [Unityのスクリプトテンプレートを変更する](https://developers.wonderpla.net/entry/2014/08/27/201641)
- [【Unity】ScriptTemplates でScriptテンプレートを作成する](https://kazupon.org/unity-scripttemplates-script/)

## UIの位置・サイズを自動調整

Unityのレイアウトグループというコンポーネントを使用すると、子オブジェクトとして持つボタンやテキストなどを自動で並べてくれます。
レイアウトグループは3種類あります。

- Horizontal Layout Group
- Vertical Layout Group
- Grid Layout Group

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Vertical Layout Groupの挙動 <a href="https://t.co/JPKATnDbRI">pic.twitter.com/JPKATnDbRI</a></p>&mdash; ぺんぎー.unity (@penguin_uts1) <a href="https://twitter.com/penguin_uts1/status/1335114247643291651?ref_src=twsrc%5Etfw">December 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

↑Vertical Layout Groupを使ってみた様子です。
ボタンの数に応じて自動でレイアウトされているのがわかります。
ただしボタンが多すぎてはみ出してしまう場合は下に伸びるようで、あまりきれいではありません。

次にContent Size Fitterというコンポーネントを紹介します。
これは子オブジェクトが収まるように自分のサイズを自動で調整してくれるコンポーネントです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Vertical Layout Group + Content Size Fitterの挙動 <a href="https://t.co/wd8VoKYuQ0">pic.twitter.com/wd8VoKYuQ0</a></p>&mdash; ぺんぎー.unity (@penguin_uts1) <a href="https://twitter.com/penguin_uts1/status/1335117354670276608?ref_src=twsrc%5Etfw">December 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

↑先ほどのVertical Layout Groupを付けたImageに、Content Size Fitterを付けた場合の様子です。
ボタンの数に応じてImageが伸び縮みしているのがわかります。

ちなみに、TextにContent Size Fitterを付けると、文字の量に応じてサイズが伸び縮みします！

他にもレイアウトに関する様々な機能がありますが、闇が深い部分もあるので割愛します。

#### 参照

- [レイアウトグループ（Layout Group）の種類と使い方](https://unity-guide.moon-bear.com/ui-layout-group/)
- [【Unity】uGUIの自動レイアウトが分かりにくいと評判なので解説してみる](http://tsubakit1.hateblo.jp/entry/2017/05/14/163456)

## 簡単にきれいな文字を表示する

Text Mesh Pro(以下TMPro)を使おうぜ！という話です。
作っているのがゲームではなくて、他人に見せるつもりがなかったり、文字のクオリティにこだわらないのであれば標準のTextで十分かもしれませんが、そうでなければぜひ使ってみてください。

TMProは文字のスケールを大きくしても文字が粗くなりません！
以下標準TextとTMProのスケールを縦横2倍にした時の比較です

![スクリーンショット 2020-12-05 164312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423351/1c6a8bba-4b24-c358-4810-78f49a37a3db.png)

さらにTMProは文字の縁取りやグラデーションなどが簡単にできます！

![スクリーンショット 2020-12-05 170247.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423351/b7b40caa-303a-6a2b-479c-c1a8da5cc097.png)

あと、スプライトから自作の絵文字を登録できるのも魅力ですね！

TMProを使うデメリットとして、フォントを追加する作業がちょっとめんどいというのがあります。
またデフォルトのフォントでは日本語が打てないため、日本語を表示させたければ日本語対応のフリーフォントを追加するという作業が必須になります。

フォントの追加に関しては以下の記事が参考になります。

#### フォントの追加

- [UnityのText Mesh Proアセットで日本語を使うときの手順](https://qiita.com/thorikawa/items/03b65b75fa9461b53efd)
- [UnityのText Mesh Proでほぼ全ての日本語を表示させる](https://qiita.com/kgsi/items/08a1c78b3bee71136156)

#### その他参照

- [[Unity] TextMeshProを使ってマイ絵文字をテキストに入れる](https://shamaton.orz.hm/blog/archives/436)

## おわりに

時間的に余裕があればもっと書きたかったんですけど、無料アセット編とスクリプト編はまたの機会にします。

[^1]: Twitter: [@penguin_uts1](https://twitter.com/penguin_uts1)