はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】DebugクラスではなくAssertクラスを用いたコンソールへのエラーの出し方

はじめに

今回はAssertクラスでのコンソールへのエラーの出し方についての記事になります!

AssertUnityEngine.Assertion名前空間に属するクラスで、お馴染みのDebug.Logのようにコンソールへログを出す静的なメソッドがいくつも含まれています。

f:id:hanaaaaaachiru:20190505172248p:plain

例えばnullには絶対にならないといった場合にエラーメッセージをログに残すならDebug.Assertでも出来なくはないのですが、Assertクラスの方が便利な場合が多いみたいです。

またアサーションメソッドは本番ビルドから自動で削除されるので、なにかと心配しなく使うことができます。(Debugクラスもできる)

実際に使ってみる

using UnityEngine;
using UnityEngine.Assertions;       //ここを忘れずにする

public class AssertTest : MonoBehaviour
{
    [SerializeField] private GameObject _someGameObject;
    private void Start()
    {
        //_someGameObjectがnullの場合にエラーを出す
        Assert.IsNotNull(_someGameObject, "_someGameObjectがnullです");
    }
}

もし_someGameObjectをインスペクターから設定し忘れた場合、以下のようなエラーコードがでてきます。

f:id:hanaaaaaachiru:20190505172248p:plain

この場合は第一引数である_someGomeObjectnullであった場合、第2引数のメッセージとともにエラーを出力します

このようなメソッドがAssertクラスにはいくつも用意されています。

メソッド名 説明
IsTrue 条件が真か確認する(偽ならエラー)
IsFalse 条件が偽か確認する(真ならエラー)
IsNull nullか確認する(nullじゃなければエラー)
IsNotNull nullではないことを確認する(nullならエラー)
AreEqual 値が等しいか確認する(異なればエラー)
AreNotEqual 値が異なるか確認する(等しければエラー)
AreApproximatelyEqual 値がほぼ等しいか確認する。float用(ほぼ等しくなければエラー)
AreNotApproximatelyEqual 値がほぼ等しくないか確認する。float用(ほぼ等しければエラー)

制御フローを停止する

初期設定ではアサーションメソッドが失敗しても、実行の制御フローは中断されません。つまり、エラーがでてもコードが止まることはないのです。

しかし、Assertクラスのstatic変数であるraiseExceptionstrueにすることでコードを止めることができます

using UnityEngine;
using UnityEngine.Assertions;       //ここを忘れずにする

public class AssertTest : MonoBehaviour
{
    [SerializeField] private GameObject _someGameObject;
    private void Start()
    {
        //エラーがでた場合実行を停止する
        Assert.raiseExceptions = true;

        //_someGameObjectがnullの場合にエラーを出す
        Assert.IsNotNull(_someGameObject, "_someGameObjectがnullです");

        Debug.Log("これは実行されない");
    }
}

さいごに

例外処理を用いずにエラーを出してしまうというのも一つの手ではないのでしょうか。
是非うまく活用してみてください!