👏

Unity C# の小技 : Null-conditional 演算子 (?.) を使い、Null チェックを簡素化する

2025/02/16に公開

Unity C# の小技: Null-conditional 演算子 (?.) を使い、Null チェックを簡素化する

Unity を使った開発において、コンポーネントやオブジェクトの参照が存在しない場合のエラー(NullReferenceException)は避けて通れない問題です。従来は if 文による冗長な Null チェックが必要でしたが、C#6.0 以降で導入された Null-conditional 演算子 (?.) を活用することで、コードがシンプルになり可読性も向上します。本記事では、Null-conditional 演算子の基本的な使い方から Unity 特有の注意点、実務での活用例まで、具体的なコード例や画像も交えて解説します。

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

従来の Null チェックとその課題

これまでの C# コードでは、オブジェクトが null でないかどうかを判定するために下記のような if 文が頻繁に使われていました。

if (player != null)
{
    player.Move();
}

このように記述することで、オブジェクトが null の場合にメソッド呼び出しを回避し、NullReferenceException を防ぐことができます。しかし、オブジェクトが多数存在する場合や複雑な入れ子構造になっている場合、コードが煩雑になりがちです。冗長な記述は保守性や可読性を低下させ、バグの温床にもなります。

Null-conditional 演算子 (?.) の基本

Null-conditional 演算子 (?.) を使えば、上記の if 文をワンライナーで記述でき、コードは大幅に簡素化されます。基本的な構文は以下の通りです。

player?.Move();

この記述は、player が null でなければ Move() メソッドを呼び出し、null の場合は何も行わずに次の処理に移ります。返り値が存在する場合も、null であればそのまま null を返すため、連鎖的な呼び出しも安全に行えます。

連鎖呼び出しの例

複数のプロパティやメソッドを連鎖して呼び出す際にも有効です。例えば、以下のコードでは managercurrentPlayer の両方が null でない場合にのみ Score プロパティにアクセスします。

int? score = manager?.currentPlayer?.Score;

このように、Null-conditional 演算子を利用することでコードがシンプルになり、ネストが深くなっても可読性が保たれます。

Unity における Null チェックの特殊事情

Unity では、C# の通常の null チェックとは異なる挙動が発生する場合があります。Unity 独自に実装された == 演算子のオーバーロードにより、実際にオブジェクトが破棄されている場合でも「null」と判定されるケースがあるのです。この点については、Qiita の記事でも詳しく解説されています。
https://qiita.com/shirasaya0201/items/866fb7caa58c6483f3ad

また、Unity Discussions のフォーラムでは、Null-conditional 演算子使用時に発生する警告やエラーについて議論されています。以下の点に注意しましょう。

https://discussions.unity.com/t/simple-question-about-null-conditional-operator/756002

  • 非Nullable 型へのアクセスの場合、演算子の適用方法によっては予期しない動作をすることがある。
  • コンポーネントの取得や参照に際して、Unity 固有の null 判定が絡むため、コード全体の動作を十分に確認する必要がある。

具体的なコード例と活用法

ここでは、実際の Unity プロジェクトでの活用例をいくつか紹介します。

UI 要素の参照と更新

UI コンポーネントはシーン上で動的に変更されることが多く、null チェックが必須です。以下は、UI Text コンポーネントへのアクセス例です。

using UnityEngine;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public Text scoreText;

    void UpdateScore(int score)
    {
        // scoreText が null でない場合にのみテキストを更新
        scoreText?.SetText("Score: " + score);
    }
}

また、null 合体演算子 (??) と組み合わせることで、デフォルト値を設定することも可能です。

string displayText = scoreText?.text ?? "スコアが未設定です";

複雑なオブジェクト階層での安全なアクセス

オブジェクトの階層が深くなると、各段階での null チェックが面倒になります。Null-conditional 演算子を活用すれば、以下のようにシンプルに記述できます。

float? playerHealth = gameManager?.player?.status?.health;

このような記述により、途中のどのオブジェクトが null であっても安全に処理をスキップできます。

画像による動作例

以下の画像は、Null-conditional 演算子と null 合体演算子を用いたコード例の視覚的な説明です。

Null条件演算子とNull合体演算子の使用例

また、Unity エディタ上での実際の動作を示すキャプチャも参考になります。

UnityでのNull条件演算子使用例

Null 合体演算子 (??) との併用

Null-conditional 演算子と併せて、Null 合体演算子 (??) を使うことで、null の場合に代替値を簡単に設定できます。たとえば、デフォルト値を返す場合は以下のように記述します。

string playerName = player?.Name ?? "Unknown Player";

この記述により、player が null の場合でも "Unknown Player" が返され、コードの意図が明確になります。

実務での活用例と注意点

実際のプロジェクトでは、Null-conditional 演算子を用いることで、以下のメリットが得られます。

  • コードの簡潔性向上
    複数の if 文を使わずに、連鎖的な Null チェックが可能となるため、コード行数が削減され、保守性が向上します。

  • バグの削減
    NullReferenceException の発生リスクが低減され、予期せぬエラーを防止できます。

  • 可読性の向上
    一目で処理の流れが把握でき、チーム開発においても他のメンバーがコードを理解しやすくなります。

まとめと今後の展開

Null-conditional 演算子 (?.) は、Unity C# のコードをシンプルかつ安全に記述するための強力なツールです。従来の冗長な Null チェックを大幅に削減できるだけでなく、null 合体演算子 (??) との組み合わせにより、柔軟なエラーハンドリングが可能になります。

Unity のコード改善を進め、より効率的な開発環境を構築するために、Null-conditional 演算子の活用は必須のテクニックです。最新の情報や実例をもとに、日々の開発に積極的に取り入れていきましょう。今後も、実務に直結する小技を取り上げていきますので、ぜひ引き続き情報をチェックしてください。

最後に、さらに詳しい解説や実例については、以下のリンクも参考にしてください。

ぜひ、これらの情報をもとに実際のプロジェクトで Null チェックの手法を改善し、より快適な開発環境を実現してください。

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion