##前書き
unityでコードを書く際に存在するが存在してはいけない余分なものについて気になったので調べたものをまとめました。
一部チュートリアルやAIにコード書かせたりすると出てくるものが多く私も含め多くの初学者は気づかぬ間に多くの欠陥を持ったコードを量産しています。
コメント分や余分なif文等の基礎的なものは除き勉強し始めで誰もが書いてしまうコードに絞って書いています。
Unityで書いてはいけないコード
[大罪1].GameObjectの探し方
例
Find() / FindObjectOfType()
ほとんどの人は一度は書いたことあるであろうコード。
理由
・シーン内の全オブジェクトを検索する
・シーン内の設定にスクリプトの処理が依存してしまう(可変性の低さ)
・GameObject.Findは名前検索はバグ、エラーの原因になりやすい
・可読性が低い
解決案
[SerializeField]private GameObjact player;
[大罪2].string型による制御構文
例
void OnTriggerEnter(Collider other) {
if (other.gameObject.name == "Enemy") {
Debug.Log("敵に当たった!");
}
}
if文でゲームオブジェクトの名前で比較する。
StartCoroutineなどでメソッド名をstringで指定する。
などかなり応用範囲が広い巨悪
理由
・シーン内の全オブジェクトを検索する
・シーン内の設定にスクリプトの処理が依存してしまう(可変性の低さ)
解決案
Unityの性質上代替案は実質的になく場面ごとに変えるしかない。
一応の対策法としていくつか
・TryGetComponentを使った型チェック(基本これかも)
・直接メソッドを指定する
ー大学の授業でならってそのまま来てしまうと書きがちだし、先ほどと違い修正するのが面倒なものが多く挙動が変わってしまうことがあるし癖で書いてそのまま気づかず修正に時間を取られることが多い。
注意したいコード
ここからは意識した方がいいコードを簡単にまとめます
ただ、これは解決案や自分の理解が怪しい部分もあるためご愛敬頂けると助かります。
[注意1]publicメンバ変数
意図しない変更のリスク、コード保守性の低下、データの整合性の問題、オブジェクト指向の原則違反
上げればきりがないレベルだし、書かなくてもどうにかなるのでわざわざ書く必要はあまりない
解決案
・書かない
・外部干渉用のプロパティや関数を用意する
[注意2] public static変数
他のクラスの変数触りたいからという理由で使う場合public static変数と同様の理由で使わない方がよい。
解決策
依存性注入(DI)を使用して、必要なクラスの参照を適切に渡す
[注意3]Instantiate() / Destroy()
オブジェクトの生成、削除はそりゃあ重い
正直あんまり気にしなくてもいいかも...
解決案
オブジェクトプール (Object Pooling) を使用する
SetActive(false) で無効化し、使い回す
参考にさせていただいたものの中で理解できたもの
Unityプログラミング現場に蔓延る罪
https://note.com/metaformingpro/n/ncabd7dee227d#94067123-9e35-44c6-a3a0-8059d1c3da82
ChatGPT