今回は脱初心者を目指すUnityユーザーの方向けの話題で、
をたくさんご紹介するという内容です。
Unityを使ってゲームを作ったり、C#スクリプトを書いたりしていると
- なんか作業が面倒くさいなあ
- もっと便利に使いこなせないかな
と感じることがあると思うのですが、実は意外と知らないだけで便利な裏技が色々あるんですよ。そこでこの記事では、そういった
- 裏技的な機能
- 知っていると得する知識
について詳しく書いていきますね。
UnityとC#の便利Tips・裏技10連発
では早速ですが、知っていると便利なUnityとC#スクリプトの知識・テクニックを10個ご紹介していきます。
Unityの便利知識まとめ
まずは意外と知られていないUnityの裏技からです。次の4つはぜひ試して頂きたいなと思います。
- 便利な「プリセット」を活用しよう
- 同名オブジェクトを複製したときの連番の書式は変更できる
- GitHubのアセットはパッケージマネージャからインストール可能
- 「EditorOnly」タグをつけたゲームオブジェクトはビルドから除外できる
それぞれ詳しく見ていきましょう。
便利な「プリセット」を活用しよう
まず一つ目のTipsは、便利なのに意外と知られていない「プリセット」を活用するとよいということです。
プリセットは
- コンポーネントのデフォルト値
- テクスチャ・オーディオ等をインポートするときのデフォルト設定
を変更できる機能で、うまく使えば設定値の面倒な変更作業を自動化することができます。
例えばテクスチャであれば、インポートする場合はデフォルトだと「2048px四方」になっている場合が多いと思います(※最初に選んだテンプレートにもよりますが)。ですがプロジェクトによっては
- モバイル向けゲームなのでもっと小さいサイズでインポートしたい
- ハイエンドPC向けのゲームなので、もっと大きなテクスチャを使いたい
といった場合にはいちいち手作業でテクスチャサイズを変更し直さないといけないので不便ですよね。そこでプリセットを使えばこのインポート時のデフォルト値を「512px四方」にしてインポートするようにできたりするので便利です。
なおプリセットの詳しい使い方は姉妹サイトでご紹介しているので、ぜひそちらも併せてご覧ください。
同名オブジェクトを複製したときの連番の書式は変更できる
二つ目のTipsは、ヒエラルキーで同名オブジェクトを複製したときの連番の書式は変更できるということです。
デフォルトだとゲームオブジェクトを複製したとき、次のように「GameObject (1)」という風になりますが…
これってカッコがあったり、カッコの前にスペースが入っていたりして名前を変更するときに結構不便ですよね。そこでこの書式を変更してみましょう。
やり方は簡単で、プロジェクト設定ウィンドウの「エディタ」→「ナンバリングスキーム」を変更するだけです(下図)。
これで例えば次のようなナンバリングにすることができます。
GitHubのアセットはパッケージマネージャからインストール可能
さて三つ目は、GitHubにあるUnity用のアセットはパッケージマネージャからインストール可能だということです。
Unity用のアセットを探していると、アセットストア以外ではよくGitHubにアップロードされているのを見つけることがあります。でもGitHubに上がっているアセットってUnitypackage形式じゃない場合がほとんどなので自分のプロジェクトにインポートしようと思っても不便ですよね。
しかし実はパッケージマネージャを使うとGitHub上のアセットを直接インストールすることができます。詳しいやり方は公式マニュアルに載っているのでそちらをご参照ください。
「EditorOnly」タグをつけたゲームオブジェクトはビルドから除外できる
四つ目は「EditorOnly」タグをつけたゲームオブジェクトはビルドから除外できることです。
このタグをつけるとエディタ上でのみ存在するようになるので、「テストプレイの時だけあればいい」というようなゲームオブジェクトを作りたいときに便利です。これを使えばビルドの時にいちいいちテスト用のゲームオブジェクトを消す必要がなくなりますね。
C#スクリプトの便利知識まとめ
お次はC#スクリプトに関するお役立ち知識です。次の6つをご紹介します。
- 実は自分で勝手にクラスを定義することが可能
- Visual Studioの「名前の変更」機能で安全に名前を変更しよう
- 「神クラス」はなるべく避けよう
- 継承を乱用するとメンテナンス性が悪くなるので注意
- より高速な関数・プロパティを活用しよう
- 属性を活用してインスペクター表示を便利にしよう
実は自分で勝手にクラスを定義することが可能
まず一つ目は、実はC#スクリプトには自分で勝手にクラスを追加できるということです。Unityで普通にスクリプトを作ると最初から下のようなコードが書かれていますが…
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ExampleScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
実はここに適当な新しいクラスを追加してもOKなのです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ExampleScript : MonoBehaviour { NewClass newClass = new NewClass(); // Start is called before the first frame update void Start() { newClass.TestMethod(); } // Update is called once per frame void Update() { } } public class NewClass { public string newClassString = "これは新しいクラスのメソッドです。"; public void TestMethod() { Debug.Log(newClassString); } }
MonoBehaviourを継承したクラスは1つのスクリプトに1つまでしか書けませんが、そうでないクラスはスクリプト内の任意の場所にいくつでも追加することができます。
…といってもこれだけだと使い道が良く分からないかもしれませんが、新しいクラスを作ることで任意の型の値をセットで保存できるようになったり、1つのクラスの肥大化を防ぐことができたりするので活用できるようになると何かと便利です。
Visual Studioの「名前の変更」機能で安全に名前を変更しよう
次に二つ目は、
- クラス名
- 関数名
- 変数名
などスクリプト内の何かの名前を変更する場合はVisual Studioの「名前の変更」機能を使うと安全だということです。
初心者の方は名前を変更したくなった時に手動で一つ一つ変更してしまうかもしれませんが、そうすると面倒くさいですし、変更漏れがあったときにコンパイルエラーが出てしまいます。そこでVisual Studioの名前変更機能を活用しましょう(下図)。
やり方は簡単で、クラス名などのところで右クリック→「名前の変更」を選択して新しい名前を入力するだけです。これによって参照があるすべての箇所の名前が一発で変更されます。便利。
「神クラス」はなるべく避けよう
三つ目は「神クラス」はなるべく作らないほうがいいということです。
Unityでゲームを作っていると、GameManagerなど様々な役割を分担する神クラスを作ってしまいがちです。しかしそのようなクラスは肥大化しやすいので、後々変更・修正が必要になったときに処理が絡み合っていて作業が困難になってしまう可能性が高いです。
そこでクラスを作るときはなるべく
という風になるように注意しながら設計しましょう。
例えばプレイヤーキャラクターを作る場合であれば、「PlayerController」というクラスに色々な機能を詰め込むのではなく
- HP管理・ダメージ処理クラス
- 移動処理クラス
- 攻撃処理クラス
といった具合に複数のクラスに処理を振り分けるようにするとベターです。こうすることによってゲームの仕様が変更になった時でも柔軟に対応することができます(※例えば攻撃の仕様が変わったとしても、攻撃処理クラスだけを変更すればいいので楽)。
継承を乱用するとメンテナンス性が悪くなるので注意
さて四つ目もメンテナンス性についてで、クラスの継承を乱用すると変更が大変になるので注意したほうがいいということです。
一見すると継承は便利なので共通部分があるクラスはついつい継承したくなってしまうのですが、これを乱用すると「派生クラスから見たとき、基底クラスの仕様を確認するのが大変になる」というデメリットがあります。つまり継承先から元のクラスのコードを直接見ることができないので、いちいち継承元のスクリプトを開かないといけなくなり「これどうなってるんだっけ?」と分からなくなってしまいがちだというわけです。あとクラスにどんどん機能が追加されていく形になるのでクラスが肥大化して先ほどの「神クラス」になる危険性もはらんでいます。
これの対策としては、なるべくクラスの継承を使わなくても済むようなクラス設計にすることです。例えば共通の規格を持つクラスにしたいのであればインターフェースを活用すれば事足ります。
まあUnityでゲームを作っていると継承を使ったほうが楽な場面もあるので絶対悪とは言いませんが、その場合はせめて何重にも継承しないような設計にするように心がけましょう。ちなみにsealed修飾子を使うとクラスを継承禁止にできるので便利です。
より高速な関数・プロパティを活用しよう
五つ目は最適化に関する話で、Unityでは「ある関数・プロパティを単純に使うよりも高速な方法」があることが多いのでそれを覚えておくとよいです。
この辺についての詳しい話は以下の記事で説明しているので、ご興味があれば併せてご覧ください。
属性を活用してインスペクター表示を便利にしよう
最後に六つ目は「属性」を活用してインスペクターの表示を便利にするとよいという話です。
Unityでいうところの属性とは、メンバ変数につけることでインスペクターでの表示をカスタマイズできるものです。例えば下記のようにRange属性をつけると…
[Range(0f, 1f)] public float value = 1;
下の画像のようにインスペクターにスライダーが表示されます。
Unityには色々な属性が用意されており、使いこなせると便利なのでぜひ覚えておいてください。属性の一覧は下記のブログ記事(テラシュールブログ様)がよくまとまっていておススメです。
おわりに
以上、UnityエディタやC#スクリプトに関する便利Tipsを色々とご紹介しました。どれも意外と知られていないと思うのですが、とても便利なTipsばかりなのでぜひ覚えて頂ければと思います。
この記事がUnityでのゲーム開発のお役に立てば幸いです。