【Unity】できれば「使わない方がいい」Unityの機能ワースト3

あの機能、使わないほうがいいってよ… Unity

Unityを使っていると、ある機能についてよく調べたときに公式が「その機能は使うな」みたいなことを平気で言っていることがあります。個人的には機能を提供しておいてそれはねーだろ…と思うわけですが、Unityでは「あまり良くない機能だが、分かりやすいので初心者向けに一応残してある」というようなものが結構あるみたいです。

それで皆さんに馴染みのある機能の中にもそういう「できれば使わない方がいい」機能がいくつかあるので、ここでは特に使ってしまいがちなクソ機能を3つ紹介して

  • なんで使わない方がいいのか
  • 代わりにどうすればいいのか

といったことを書いていきますね。


※注意:
念のため書いておきますが、ここで取り上げる機能は「絶対に使うな」というわけではないので勘違いしないようにしてください。

Unityでなるべく使わない方がいい機能ワースト3

では早速ですが、Unityでなるべく使わない方がいい機能ワースト3を挙げると次の通りです。

  1. PlayerPrefs
  2. Resourcesフォルダ
  3. DontDestroyOnLoad

それぞれ詳しく見ていきましょう。

第1位:PlayerPrefs

まず堂々の第1位は「PlayerPrefs」です。Unity初心者の方にとってはセーブといったらこの機能だと思いますが、正直これはダントツで使わない方がいいです。

PlayerPrefsを使わない方が良い理由

PlayerPrefsを使わない方が良い理由は次の4つが挙げられます。

  1. Windows用ビルドの場合、保存先がレジストリだから(←最悪)
  2. 保存できるデータの型が限られているから
  3. セーブデータの読み書きが遅いから
  4. 複数データを一括で処理できないから

まあ色々問題がありますが、何よりも1番目の仕様が気になります。なんでゲームデータをレジストリに保存するのさ…正直意味が分かりません。これがPlayerPrefsがクソ機能たるゆえんです。

PlayerPrefsを使わずに済むセーブ方法

代替案としては、セーブデータを外部ファイル(主にJSON形式)に書き出して保存する方法が有名です。

これについては以下の記事で詳しく説明していますので興味があればご覧ください。

【Unity】JSONを使ったセーブ・ロード処理の作り方
Unityでゲームを作っていると「セーブ・ロード処理」で悩んでしまうことがあります。なぜかというと、 Unityに標準で付いているセーブ・ロード機能である「PlayerPrefs」は問題だらけ(※後述) アセットを使うにもま...

第2位:Resourcesフォルダ

さて、次に第2位は「Resourcesフォルダ」です。よくスクリプトからアセットにアクセスする場合に使われますが、これもできれば使わない方が賢明でしょう。

Resourcesフォルダを使わない方が良い理由

Resourcesフォルダを使わない方が良い理由については、公式リファレンスに次のような記載があります:

Resources フォルダーは、しばしば Unity プロジェクトで発生する各種問題の原因となる場所です。 Resources フォルダーの不適切な使用が原因で、プロジェクトのビルドサイズの膨張やメモリの極端な過剰使用が引き起こされ、アプリケーションの起動時間が著しく増加してしまうことがあります。

まあ要するに「Resourcesフォルダは簡単に使えるけど、下手に使うと危険」というわけですね。

Resourcesフォルダを使わない代替案

Resourcesフォルダの代替案はいくつかあると思いますが、一番簡単なのは「なるべくスクリプトからアセットをロードしようとせず、代わりに予めインスペクターで登録しておく」ことに尽きると思います。

第3位:DontDestroyOnLoad

最後に第3位は「DontDestroyOnLoad」です。これは今まで私もよく使っていたので、Unity公式ブログで「使わない方がいい」という記述を見つけたときはびっくりしました。

DontDestroyOnLoadを使わない方が良い理由

どうやらDontDestroyOnLoad自体が問題というわけではなく、使い方によっては面倒なことになることが理由のようです。Unity公式ブログを見てみると次のような記述があります。

異なるシーン間でデータを共有する必要があるときは、静的な変数と DontDestroyOnLoad を組み合わせて使うやり方をよく見かけますが、DontDestoryOnLoad は可能な限り避けるべきです。

これはDontDestroyOnLoadとstatic変数を組み合わせて使ったとき、(static変数はインスペクターに表示されないため)テストプレイの際に値を確認・変更することができず面倒なことになるというのが主な理由のようです。

DontDestroyOnLoadを使わない代替案

先ほどのリンク先に書いてありますが、シーン間で共有したい値がある場合はScriptableObjectを上手く活用すると良いみたいです。

ScriptableObjectについては以下の記事で詳しく紹介しているので併せてご覧いただければと思います。

【Unity】ScriptableObjectの作り方・使い方
Unityでゲームを作っていると、特にRPGなどで大量のデータを扱う必要が出てきて「データの管理が大変だからデータベース的なものが欲しいなぁ」と思うことがあります。 そんなときに便利なのがUnity標準の「ScriptableObje...

おわりに

以上、Unityで使わない方が良い機能ワースト3をご紹介してきました。

Unityには上記のように「どうぞ使ってくださいと言わんばかりに提供されているのに、実は使わない方がいい機能」が色々あります。よく分からない機能を使う時はきちんと使い方や注意点を調べてから使うようにしましょう。