ここにはすでにいくつかの答えがありますが、Unity3Dを考慮に入れた答えは次のとおりです(答えはUnity3Dに非常に固有であり、ほとんどのコンテキストでこれを非常に異なる方法で行います)。
一般に、Unity3Dは従来、例外を使用しません。Unity3Dで例外をスローする場合、平均的な.NETアプリケーションとは異なります。つまり、プログラムを停止しません。ほとんどの場合、エディターを一時停止するように構成できます。記録されるだけです。これにより、ゲームが簡単に無効な状態になり、エラーを追跡するのが難しくなるカスケード効果が作成されます。したがって、Unityの場合Add
、例外をスローさせることは特に望ましくないオプションです。
しかし、一部のプラットフォーム上のUnityでMonoがどのように機能するかにより、例外の速度を調べることは、場合によっては時期尚早な最適化のケースではありません。実際、iOS上のUnity3Dはいくつかの高度なスクリプト最適化をサポートしており、無効化された例外*はそれらの1つの副作用です。これらの最適化は多くのユーザーにとって非常に有益であることが証明されており、Unity3Dでの例外の使用を制限することを検討するための現実的なケースを示しているため、これは本当に考慮すべきものです。(*コードではなく、エンジンからの管理例外)
Unityでは、より専門的なアプローチを取りたいと思うかもしれません。皮肉なことに、これを書いている時点で非常にダウン投票答え、私はショー一つの方法かもしれません。このような何かを実装し、具体的Unity3Dの文脈で(このような他の場所で何かが本当に受け入れられない、とさえユニティで、それはかなり洗練です)。
私が検討する別のアプローチは、実際には呼び出し側に関する限りエラーを示すのではなく、Debug.LogXX
関数を使用することです。そうすることで、何かを奇妙な状態にする危険を冒すことなく、未処理の例外をスローするのと同じ動作が得られます(Unity3Dがそれらを処理する方法のため)。また、これが本当にエラーであるかどうかも考慮してください(同じマテリアルを2回ロードしようとすると、必ずエラーになりますか?それとも、Debug.LogWarning
より適切なケースかもしれません)。
また、Debug.LogXX
例外の代わりに関数などを使用することに関しては、値を返すもの(GetMaterialなど)から例外がスローされるとどうなるかを考慮する必要があります。エラーをログに記録するとともにnullを渡すことでこれにアプローチする傾向があります(これもUnityのみです)。次に、MonoBehaviorsでnullチェックを使用して、マテリアルなどの依存関係がnull値でないことを確認し、MonoBehaviorが無効な場合は無効にします。いくつかの依存関係を必要とする単純な動作の例は、次のようなものです。
public void Awake()
{
_inputParameters = GetComponent<VehicleInputParameters>();
_rigidbody = GetComponent<Rigidbody>();
_rigidbodyTransform = _rigidbody.transform;
_raycastStrategySelector = GetComponent<RaycastStrategySelectionBehavior>();
_trackParameters =
SceneManager.InstanceOf.CurrentSceneData.GetValue<TrackParameters>();
this.DisableIfNull(() => _rigidbody);
this.DisableIfNull(() => _raycastStrategySelector);
this.DisableIfNull(() => _inputParameters);
this.DisableIfNull(() => _trackParameters);
}
SceneData.GetValue<>
例外をスローする辞書の関数を呼び出すという点で、あなたの例に似ています。ただし、例外をスローする代わりにDebug.LogError
、通常の例外と同様にスタックトレースを提供し、nullを返します。続くチェック*は、無効な状態で存在し続けるのではなく、動作を無効にします。
*チェックは、ゲームオブジェクトを無効にするときにフォーマットされたメッセージを出力する小さなヘルパーを使用しているため、そのように見えます**。if
ここでの作業を伴う単純なnullチェック(**ヘルパーのチェックは、デバッグビルド(アサートなど)でのみコンパイルされます。Unityでラムダとそのような式を使用すると、パフォーマンスが低下します)
_Materials.Add
例外をスロー?