Unityを使い始めた頃に困っていた事、悩んでいた事

こんにちは。カヤックアキバスタジオでエンジニアをやっている臼井です。

この記事は 面白法人グループ Advent Calendar 2022 の17日目の記事です。

今回はUnityを使い始めた頃に困っていた事、悩んでいた事についてお話しします。

はじめに

ここ最近、僕の周りでもプログラムを勉強するためにUnityを使い始める人が増えてきました。
その中で、色々な悩みを聞く機会が増えてきたので、自分が使い始めた頃どうだったかな?
というのを振り返ってみようと思います。
(昔の記憶でうる覚えのため、勘違いや間違いがあってもご了承ください。)

困っていた事、悩んでいた事

Unityバージョン

Unityを使うにしてもどのバージョンを使うのか、使い始めてからどのタイミングでバージョンアップするのか等々悩む事がありました。
この辺りはプロジェクト内で決めればいいのですが、知見がある人がいないと中々決まらないものですよね。
今みたいにLTSもなく、Unity起因のバグで地雷を踏む事も多かった印象がありバージョンを決めるのも苦労してた気がします。

Warning

ビルドエラーとは違いwarningが出ていても実行はできるため、スルーされがちなのですが意図しない挙動になっていてバグが発生する事もありました。
warningをちゃんと潰していたらこんな事にはならなかったのに・・・。
という事もあり、最近は定期的にwarningがないか確認しながら開発しています。

public変数

Unityだからという訳ではないですが、public変数を使ってる事でどこからでも値が変更できてしまい、意図しない箇所から設定されバグが発生することも多々ありました。 public変数お手軽なので使いたくなりますよね。
Unityを触り始めた方でバグに遭遇し解決できずに辞めてしまう人も多い印象があるので、public変数を使わない形から始めるのもいいかもしれないなと思いました。

missing

使用しているファイルを気づかずに削除してしまい、missingが発生して動作しなくなる事も多々ありました。
当時は、このファイル削除してもいいですか?と聞きながら対応してた気がします。
今はmissingの箇所を検索したりファイルが使われてるか検索する機能を作って対処しています。
それでも発生する時は発生しますが。

Find、GetChildを使用したインスタンス取得

オブジェクト名、何番目というのを指定してインスタンスを取得する処理を書いていて、オブジェクト名や構造が変わる事でインスタンスが取得できずにエラーが発生する事が多々ありました。

  • ルール決めをしっかりおこなえていない
  • prefabを使う人と作る人が別々だった
  • etc

と、理由は色々あると思いますが、構造が変わる事で破綻するような処理をなるべく書かないというのが一番かなと思いました。

文字コードの違いによる文字化け

当時はwindows、mac半々くらいで開発してたりしていたので、文字コードの違いによる文字化けで困る事が多く、その対策としてAssetPostprocessUTF8Encode.csを利用させていただく事が多かったです。

デリミタ(区切り文字)

文字の区切り文字もwindows、mac環境で異なるため問題が起こる事がありました。
対処法としては、\\/に置換する対応を取っていました。 最近ではSystem.IOが提供しているPath、Directoryクラスをラップするクラスを用意してその中で、デリミタを置換する処理を使って回避してたりします。

こんな感じで

public static class Path
{
    public static string ReplaceBackSlashToSlash(this string self)
    {
        return self.Replace('\\', '/');
    }

    public static string Combine(string path1, string path2)
    {
        return System.IO.Path.Combine(path1, path2).ReplaceBackSlashToSlash();
    }

    public static string GetExtension(string path)
    {
        return System.IO.Path.GetExtension(path).ReplaceBackSlashToSlash();
    }

    // System.IO.Pathクラスが提供している関数を粛々と定義
}

prefab内にprefabを配置

prefabA内にprefabBを配置して、prefabBを編集してもprefabA内のprefabBは変更が反映されないという事がありました。 その時は、prefabAにprefabBの参照を持たせてinstantiateをする事で回避していた気がします(うる覚え)  現在はNested Prefabが提供されているため気にすることはなくなりました。

複数解像度を考慮したUI

UI配置をする際に解像度の違いを考慮せずに作っていたため、開発終盤やQAの時に発覚し粛々と修正する事もありました。
最初に考慮して作っていればよかったんですけどね・・・。

画面切り替え

Sceneを切り替えて作った方のがいいのか、1つのScene内でprefabを切り替えて作る方がいいのか?という事にも悩んでいました。 当時はScene切り替えは重いのでprefabを切り替えて作る事が多かったかな思いますが、最近ではあまり気にせずに作りやすい方法で作ってしまうのがいいのかなと個人的に思っています。

アセットバンドル

2重でロードするとエラーが発生したり、パスの大文字、小文字を識別するためその違いによるロードエラーに悩まされたりしていました。
あと、開発初期はResourcesを使用していたが、あとあと配信用アセットバンドルに変更する事で読み込み処理を書いていた箇所を粛々と修正するというような事も発生していました。
それらを解決するためクラスを用意している所も多かったのではないでしょうか。
今はAASがあるので、そのまま使ったり拡張して使えたりして便利ですね。

まとめ

振り返ってみると色々とでてきますね。
当時はUnityを使ってる人が周りにいなくて、情報も少なかった為、手探りでやっていました。
最近は使ってる人や情報も増え、検索するとすぐ解決できたり、参考になる情報がたくさん出てくるのでありがたいですね!
もし、困った事や悩んでいる事がでてきたらまずは検索してみるのがいいですね。

最近よく見るサイトで

は、とても参考になる内容が多いのでおすすめです!

最後に、

  • 楽しむ事
  • 完成させる事

がとても大切な事かなと思うので忘れずに、色々模索しながら引き出しを増やしていこうと思います!