C#2024/10/05に公開2024/10/10C#UnityTipstechはじめに今回はTips的なものをたくさん紹介します。UnityC#で、簡単に適用出来て少しだけコードが綺麗になるような、そういうテクニック集です。★★★★☆もはや定番のテクニックですが、分かりやすく見た目が変わるので好きです。}}上記のコードはネストが深くなっているので、ちょっと読みづらいです。早期returnを使って、ネストを減らしましょう。考え方としては、条件に合うものを厳選するのではなく、条件に合わないものをはじくようにします。結果、以下のようになります。}}!実行部が1行で書くことができる場合は{}を省略してもいいため、行数・文字数を減らすことが出来ます。これでネストが減り、コードがすっきりしたのが分かります。基本的にネストは深くなるほど読みづらいと感じる傾向にあるので、早期returnを使ってネストを減らすことはコードの可読性を上げるために有効です。早期returnを使うことで、条件に合わないものをはじくという考え方に変換することが出来ます。条件に合わないものをはじく部分と、大丈夫なら何かをする部分を分けることで、コードの意図が明確になります。このようにメソッドの先頭部にreturnを書いていくことをガード節とも呼びます。コンストラクタや初期化等でも使える考え方です。その他自前の初期化関数などにて初期化されることが期待される場合は、まずはその処理が必ず呼ばれるようにしたいところです。そもそもnullだとまずい場合は、最初に確実に初期化されるようにしましょう。それが不可能な場合は、nullチェックを減らすために、_isInitializedなどのフラグを使って初期化されているかどうかを管理するという方法があります。こっちの方が、初期化されたかどうかで判定しているという意図が明確になります。★★★☆☆??=を使えば初期化すらしなくてもいいかもしれません。}}??=は左辺がnullの場合に右辺を代入する演算子です。下側のプロパティしか使わないように注意すれば、この方法も使えます。外部に公開し、外部のみが使用する場合はより相性がいいです。Component)はGetComponent<T>()と違い、コンポーネントがアタッチされていない場合にnullではなくboolを返します。これによって、nullチェックを省略することができます。outを使った関数になじみがないと最初は少し使うのに苦労するかもしれませんが、動的にコンポーネントを取得する際にはTryGetComponentを使うのがかなり便利な時があるので覚えると少し楽になります。いっても正直好みのレベルかなーとは思います。outでplayerに取得したコンポーネントが入る。変数名を使って変数を宣言すると、その変数に取得したコンポーネントが入ります(元々定義したフィールド等に代入することもできます)。この関数自体の戻り値はboolで、取得できたかどうかを返します。if文で取得できたかどうかを判定できます。取得できたということはnullではないので、nullチェックを省略することができます。Assertion等にも使えます。大きなクラスになると、変数が増えてきます。単純にコードの行数が増え、1ファイルの圧力が高い印象になっていきます。平気なら何も問題はありませんが、個人的には若干気になる場合もあるので、そういった場合には変数をわけてまとめます。初期化時の情報については、ScriptableObjectでまとめると綺麗です。初期化情報をまとめたScriptableObject}PlayerInitInfoはScriptableObjectとして作成して、ここに初期化情報をまとめておきます。Attack;}ScriptableObjectの内部の値を変更することはお作法に反するので、そういう意味でも初期化情報との相性がいいです。先ほどのPlayerInitInfoのHpはやろうと思えば書き換えることができてしまいます。丁寧に書くなら、フィールドの読み取りだけを公開する形にしましょう。_attack;}!プロパティが分からない場合は、以下の記述と同じ意味だと思ってください。}}記述は増えますが、外部からの不要な書き換えをコンパイラが防いでくれるので、安全性が増します。}}上記のようなメソッドは、引数が増えると見づらくなりますし、不正な値を検出するためのロジックが散逸してしまいがちです。これをクラス化してみましょう。}}これで、引数が増えても見やすくなり、意味も分かりやすくなりました。知識ごとにまとめるという意識が付くと、クラスの責務をより明確に分離することにもつながります。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。