スポンサーリンク
最適化・パフォーマンス

Unityのリファクタリング完全ガイド|コードを壊さず改善する手順とタイミング

最適化・パフォーマンス

「動くには動くけど、正直このコード汚いな……」と思いながらも、直すタイミングが分からずそのままにしていませんか。

いざ手を付けようとしても、「今のフェーズで直していいのか」「触って動かなくなったらどうしよう」と不安になって、結局後回しにしてしまう人も多いはずです。

この記事では、リファクタリングに着手すべきサインの見分け方から、開発フェーズごとの判断基準、そして実際にコードを壊さず安全に進めていく手順まで、順番に整理していきます。


今すぐ着手すべきサイン3つ

「なんとなく汚い気がする」という感覚だけだと、直すべきタイミングが分かりにくいですよね。まずは、次の3つに当てはまるかどうかをチェックしてみてください。

  • 毎フレームGetComponentやFindを呼んでいる
    Update()の中で、同じコンポーネントを何度も探しにいくような書き方をしている場合です。1箇所くらいならまだしも、複数のスクリプトで同じような探し方を繰り返しているなら、そろそろ整理のサインです。
  • 1つのクラスにswitchやifで複数の役割が詰め込まれている
    プレイヤー・敵・NPCなど、タイプごとの処理を1つのクラスの中でswitch文やif文で分岐させている状態です。新しいタイプを追加するたびに、この分岐がどんどん長くなっている感覚があれば要注意です。
  • 同じ処理を3ファイル以上でコピペしている
    「あ、これさっきも書いたな」と思いながら似たようなコードを貼り付けている状態が続いているなら、修正が必要な箇所も同じ数だけ増えていくことになります。

この3つのうち、どれか1つでも当てはまっていて、しかも「今後もそのコードを触り続ける予定がある」なら、リファクタリングを検討するタイミングだと考えてよさそうです。逆に、もう触る予定のないコードであれば、無理に直す必要はありません。

例外的に待ったなしのケースもある

ここまでは「余裕があるときに直す」という前提の話でしたが、なかにはこちらの都合とは関係なく、直さざるを得ないケースもあります。

たとえばUnity 6では、あるバージョンからURP(Universal Render Pipeline)のカスタムレンダーパスにおいて、旧来の互換モードが段階的に廃止される動きが進んでいます。こうした変更が入ると、今まで動いていたレンダリング関連のコードが、そのままでは動かなくなってしまうことがあります。

この手の変更は自分のプロジェクトが使っているUnityのバージョンによって影響の有無が変わってくるので、「もう古い書き方はサポートされていないかもしれない」と感じたら、使用中のバージョンのリリースノートを一度確認してみることをおすすめします。




フェーズ別「やるべきか」の境界

前の章のサインに当てはまっていても、実は「今のフェーズではまだ直さなくていい」というケースもあります。ゲーム開発って、作っている段階によって優先すべきことが変わってくるんですよね。

フェーズリファクタリングの優先度考え方
プロトタイプ・体験構築時低い面白さの検証が最優先。自分が一目見て処理内容を把握できるなら、ベタ書きのままで進めてOK
システム基盤の構築時高いセーブ・通信・課金など、後から差し替えにくい部分は最初から一貫性を意識して整える
大規模化・チーム開発移行時高い依存関係が複雑になり、一部の変更が全体を壊すリスクが出てきた段階で本格的に着手する

判断に迷ったときは、「このコードを見て、数秒で何をしているか分かるかどうか」を基準にしてみてください。パッと見て理解できるなら、プロトタイプの段階では無理に整理しなくても大丈夫です。逆に、自分で書いたはずなのに読み解くのに時間がかかるようなら、それはもう整理したほうがいいサインです。

境界を越えて失敗した例

この境界を見誤ると、開発が思わぬ形で止まってしまうことがあります。よくあるのが、プロトタイプの段階から「せっかくだから綺麗に設計しよう」と抽象化やクラス分割を頑張りすぎてしまうケースです。

面白さを試行錯誤するはずの段階なのに、設計そのものに時間を使いすぎてしまい、肝心のゲーム部分がなかなか完成しないという状態に陥ってしまうんです。「綺麗なコードを書くこと」自体が目的になってしまっている感覚があれば、一度手を止めて、今は本当にそのタイミングなのかを見直してみるとよいと思います。

逆に、大規模化してからも「動いているから」とベタ書きのまま放置してしまうと、今度は1つの修正が別の場所のバグを引き起こすようになり、機能追加のたびに気を使う場面が増えていきます。どちらの失敗も、フェーズと整理のバランスが崩れることが原因といえそうです。




壊さず進める安全な手順

「直したいけど、動かなくなるのが怖い」という気持ち、すごく分かります。でも、いくつかの手順を踏むだけで、そのリスクはかなり減らせます。ここでは、実際に手を動かすときの流れを順番に見ていきますね。

Gitでバックアップしてから始める

リファクタリングを始める前に、まず今の状態をGitでコミットしておきましょう。「変更前の状態にいつでも戻れる」という安心感があるだけで、思い切って手を動かせるようになります。

もしGit管理をまだ導入していないなら、リファクタリングを始める前のこのタイミングが、ちょうど始めどきかもしれません。作業単位ごとに小さくコミットしておくと、どこまで戻せばいいか迷わずに済みます。

1つずつ直して都度確認する

一度に何箇所も変更してしまうと、後で不具合が起きたときに「どの変更が原因か」が分からなくなってしまいます。おすすめは、1箇所直すごとに実行して、ちゃんと動いているか確認するという進め方です。

地味に感じるかもしれませんが、この積み重ねが結果的に一番早く安全にゴールへたどり着く方法だったりします。

手作業での書き換えに不安がある場合は、リファクタリング支援機能を持ったIDEを使うという選択肢もあります。メソッド名の一括変更や、処理の一部を関数として切り出す作業なども、ツール側が安全に反映してくれるので、ミスを減らしたい人には心強い味方になってくれます。

JetBrains Rider
✅ 公式サイトでチェックする

無料で使いたい場合は、Visual Studio Community 2022にもリファクタリング支援機能が搭載されています。

壊れていないか確認する仕組みを持つ

「テストがないとリファクタリングしちゃいけない」というわけではありません。ただ、変更のたびに手動で全部の動作を確認するのは現実的ではないですよね。

まずは、Unityのシーンに依存しない部分だけでも、EditModeテストという軽量な単体テストを1つか2つ用意してみるのがおすすめです。「値を渡したら期待通りの結果が返ってくるか」を確認できるだけでも、修正のたびに感じる不安はかなり減らせます。

完璧なテスト環境を最初から目指す必要はないので、まずは一番不安な処理から少しずつ試してみるくらいの気持ちで十分です。




最初に直すべき3つの改善ポイント

「よし、リファクタリングしよう」と決めても、どこから手を付けるか迷ってしまいますよね。ここでは、効果が分かりやすく、初心者でも取り組みやすい3つのポイントを紹介します。

GetComponent/Findをキャッシュ化する

Update()の中で毎フレームGetComponentやFindを呼んでいる場合、これは比較的直しやすく、効果も感じやすい部分です。

  • Awake()やStart()の中で、対象のコンポーネントを一度だけ取得する
  • 取得した結果を変数にキャッシュしておく
  • Update()の中では、そのキャッシュした変数を使い回す

「探しにいく処理」を最初の1回だけに減らすイメージです。書き換える箇所も限定的なので、リファクタリングの練習としても取り組みやすいポイントです。

Update()の使いすぎを減らす

Update()の中に、状態が変わっていないのに毎フレーム実行されている判定処理が残っていないか見てみてください。

状態が変化したタイミングだけ処理を実行するように書き換えたり、InputSystemなどのイベント駆動の仕組みに処理を移して、Update()自体を減らせないか検討してみましょう。フレームごとに無条件で実行される処理を減らすほど、無駄な負荷を抑えられます。

役割を詰め込みすぎたクラスを分割する

1つのクラスの中で、プレイヤー・敵・NPCといった複数のタイプの処理をswitch文やif文で分けている場合は、次のように整理すると見通しがよくなります。

  • 全タイプに共通する処理と、タイプごとに固有の処理を洗い出す
  • 共通処理を持つベースのクラス(またはコンポーネント)を用意する
  • 固有処理は、それぞれ別のクラスに分けて実装する

この分割の考え方は「責務分離」と呼ばれる設計の基本にもつながっていきます。もう少し詳しく仕組みを知りたい場合は、こちらの記事も参考にしてみてください。

さらに設計を体系的に学びたい場合

ここまで紹介した3つは、あくまで最初の一歩です。プロジェクトの規模が大きくなってくると、SOLID原則や依存性注入(DI)、オブジェクト指向設計といった、もう一段階体系立った考え方が役に立つ場面が増えてきます。

どれも今すぐ必要というわけではないので、必要になったタイミングで少しずつ触れてみるくらいで十分です。

体系的に一冊きちんと学んでおきたいという人には、リファクタリングの考え方を網羅的にまとめた書籍を手元に置いておくのもおすすめです。

リファクタリング(第2版):既存のコードを安全に改善する
✅ Amazonでチェックする✅ 楽天でチェックする




よくある質問(FAQ)

Q
リファクタリングとバグ修正は同時にやってもいい?
A

同時に進めるのはおすすめしません。もしリファクタリング中に動きがおかしくなったとき、「元々あったバグなのか」「構造を変えたことで新しく生まれた問題なのか」の切り分けができなくなってしまうからです。

バグ修正が必要な箇所を見つけたら、いったんメモだけしておいて、リファクタリングが落ち着いてから対応する、という順番にすると原因を追いやすくなります。

Q
テストがなくても始めていい範囲はどこまで?
A

プロトタイプ段階のように、まだ何度も作り直す可能性がある部分については、テストがない状態で少しずつ手を動かしても大きな問題にはなりにくいです。

一方で、セーブデータや課金処理など、失敗したときの影響が大きい部分に手を入れる場合は、簡単なものでいいので確認できる仕組みを用意してから進めたほうが安心です。「直した後にどれくらい困るか」を基準に考えてみるとよさそうです。

Q
リファクタリングにどれくらい時間をかけるべき?
A

これは明確な正解があるわけではなく、今のプロジェクトがどのフェーズにいるかで変わってきます。まだ完成を優先すべきプロトタイプ段階であれば、リファクタリングに使う時間は最小限にとどめておくのが無難です。

逆に、すでに保守フェーズに入っていて、これからも長く触り続けるコードなのであれば、多少時間をかけてでも整理しておいたほうが、後々の修正がずっと楽になります。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク